Package: libbiosig3
Version: 2.1.2-4
Severity: normal
Tags: patch
X-Debbugs-Cc: alois.schlo...@gmail.com

Dear Maintainer,

   libbiosig supports reading many different data formats, including the 
IgorBinaryWaveform (IBW) format. 
   When reading this data, an incorrect sampling rate (e.g. 25 Hz instead of 25 
kHz)  
   is returned, because the scaling of the scaling of physical units for the 
sampling interval 
   milli-seconds is not correctly considered. This affacts all tools using 
libbiosig,
   including biosig-tools, mexSLOAD and mexSOPEN in octave-biosig, sigviewer, 
stimfit,
   and all other language bindings. 

   The attached patch fixes this bug, and fixes als uninitialized data in the 
event table. 
   I suggest to backport this to the current stable release.  


-- System Information:
Debian Release: 11.3
  APT prefers stable-security
  APT policy: (500, 'stable-security'), (500, 'stable')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 5.10.0-13-amd64 (SMP w/8 CPU threads)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), 
LANGUAGE=en_US:en
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled

Versions of packages libbiosig3 depends on:
ii  libc6              2.31-13+deb11u3
ii  libdcmtk15         3.6.5-1
ii  libgcc-s1          10.2.1-6
ii  libstdc++6         10.2.1-6
ii  libtinyxml2.6.2v5  2.6.2-4

libbiosig3 recommends no packages.

libbiosig3 suggests no packages.

-- no debconf information
diff --git a/biosig4c++/t210/sopen_igor.c b/biosig4c++/t210/sopen_igor.c
index deb82631..c4d1ced6 100644
--- a/biosig4c++/t210/sopen_igor.c
+++ b/biosig4c++/t210/sopen_igor.c
@@ -383,7 +383,7 @@ void sopen_ibw_read (HDRTYPE* hdr) {
        int16_t type = 0;                       // See types (e.g. NT_FP64) 
above. Zero for text waves.
 
        hdr->NS = 1;
-       hdr->SampleRate = 1;
+       hdr->SampleRate = 1.0;
        hdr->CHANNEL = (CHANNEL_TYPE*) realloc(hdr->CHANNEL, hdr->NS * 
sizeof(CHANNEL_TYPE));
 
        // Read some of the WaveHeader fields.
@@ -407,7 +407,7 @@ void sopen_ibw_read (HDRTYPE* hdr) {
                                hdr->CHANNEL[0].DigMin = 
(w2->botFullScale-w2->hsB) / w2->hsA;
 */
 #else
-                               hdr->SampleRate = 1.0 / w2->hsA;
+                               hdr->SampleRate /= w2->hsA * 
PhysDimScale(PhysDimCode(w2->xUnits));
                                hdr->CHANNEL[0].PhysMax = w2->topFullScale;
                                hdr->CHANNEL[0].PhysMin = w2->botFullScale;
 #endif
@@ -446,6 +446,8 @@ void sopen_ibw_read (HDRTYPE* hdr) {
                                        for (n = 0; n < hdr->EVENT.N; n++) {
                                                hdr->EVENT.TYP[n] = 0x7ffe;
                                                hdr->EVENT.POS[n] = 
(n+1)*w5->nDim[0];
+                                               hdr->EVENT.DUR[n] = 0;
+                                               hdr->EVENT.CHN[n] = 0;
                                        }
                                }
 
@@ -458,7 +460,10 @@ void sopen_ibw_read (HDRTYPE* hdr) {
                                hdr->CHANNEL[0].PhysDimCode = 
PhysDimCode(w5->dataUnits);
                                hdr->CHANNEL[0].SPR = hdr->SPR = 1;
                                hdr->NRec        = w5->npnts;
-                               hdr->SampleRate /= w5->sfA[0];
+                               hdr->SampleRate /= w5->sfA[0] * 
PhysDimScale(PhysDimCode(w5->dimUnits[0]));
+
+                               if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line 
%i): %g.x+%g \n",__FILE__,__LINE__,w5->sfA[0],w5->sfB[0]);
+                               if (VERBOSE_LEVEL>7) fprintf(stdout,"%s (line 
%i): 
|%s|%s|%s|%s|\n",__FILE__,__LINE__,w5->dimUnits[0],w5->dimUnits[1],w5->dimUnits[2],w5->dimUnits[3]);
 
 #ifdef IGOROLD
                                hdr->CHANNEL[0].Cal = 1.0;
@@ -916,6 +921,8 @@ void sopen_itx_read (HDRTYPE* hdr) {
                hdr->EVENT.SampleRate = hdr->SampleRate;
                hdr->EVENT.POS = (uint32_t*) realloc(hdr->EVENT.POS, 
hdr->EVENT.N * sizeof(*hdr->EVENT.POS));
                hdr->EVENT.TYP = (uint16_t*) realloc(hdr->EVENT.TYP, 
hdr->EVENT.N * sizeof(*hdr->EVENT.TYP));
+               hdr->EVENT.CHN = (uint16_t*) realloc(hdr->EVENT.TYP, 
hdr->EVENT.N * sizeof(*hdr->EVENT.TYP));
+               hdr->EVENT.DUR = (uint32_t*) realloc(hdr->EVENT.POS, 
hdr->EVENT.N * sizeof(*hdr->EVENT.POS));
 #if (BIOSIG_VERSION >= 10500)
                hdr->EVENT.TimeStamp = (gdf_time*)realloc(hdr->EVENT.TimeStamp, 
hdr->EVENT.N*sizeof(gdf_time));
 #endif
@@ -979,6 +986,8 @@ void sopen_itx_read (HDRTYPE* hdr) {
                                if (sweepNo > 0 && chanNo==0) {
                                        hdr->EVENT.POS[sweepNo-1] = SPR;
                                        hdr->EVENT.TYP[sweepNo-1] = 0x7ffe;
+                                       hdr->EVENT.DUR[sweepNo-1] = 0;
+                                       hdr->EVENT.CHN[sweepNo-1] = 0;
 #if (BIOSIG_VERSION >= 10500)
                                        hdr->EVENT.TimeStamp[sweepNo-1] = 0;
 #endif

Reply via email to