diff --git a/Makefile b/Makefile index 1ba03d7..7a9c244 100644 --- a/Makefile +++ b/Makefile @@ -73,10 +73,13 @@ ifeq ($(HDF5), yes) LFLAGS_HDF5 = $(LFLAGS_HDF5_DIR) -lhdf5 endif # in some cases, linking needs to be done with the X11 library, in which case -# append '-lX11' (and possibly the path to the library) to the line below. -# libgfortran may also be needed in some case, in which case append -# '-lgfortran' (and possibly the path to the library) to the line below +# append '-lX11' (and possibly the path to the library) to the line below, as +# shown in the commented out example. the commented example also shows other +# libraries that may be needed. +# libgfortran may also be needed in some cases, in which case append +# '-lgfortran' (and possibly the path to the library) to the line below. LFLAGS_PGPLOT = $(LFLAGS_PGPLOT_DIR) -lcpgplot +#LFLAGS_PGPLOT = $(LFLAGS_PGPLOT_DIR) -lpgplot -lcpgplot -lX11 -lpng LFLAGS_MATH = -lm # directories @@ -111,6 +114,8 @@ all: yapp_makever \ yapp_dedisperse \ yapp_smooth.o \ yapp_smooth \ + yapp_decimate.o \ + yapp_decimate \ yapp_filter.o \ yapp_filter \ yapp_fold.o \ @@ -151,7 +156,7 @@ yapp_common.o: $(SRCDIR)/yapp_common.c $(SRCDIR)/yapp.h $(CC) $(CFLAGS_C) $(DDEBUG) $(DHDF5) $< -o $(IDIR)/$@ yapp_viewmetadata.o: $(SRCDIR)/yapp_viewmetadata.c $(SRCDIR)/yapp.h - $(CC) $(CFLAGS_C) $(DHDF5) $< -o $(IDIR)/$@ + $(CC) $(CFLAGS_C) $(DDEBUG) $(DHDF5) $< -o $(IDIR)/$@ yapp_viewmetadata: $(IDIR)/yapp_viewmetadata.o $(IDIR)/yapp_version.o \ $(IDIR)/yapp_erflookup.o $(IDIR)/yapp_common.o @@ -161,7 +166,7 @@ colourmap.o: $(SRCDIR)/colourmap.c $(SRCDIR)/colourmap.h $(CC) $(CFLAGS_C) $< -o $(IDIR)/$@ yapp_showinfo.o: $(SRCDIR)/yapp_showinfo.c $(SRCDIR)/yapp.h - $(CC) $(CFLAGS_C) $(DHDF5) $< -o $(IDIR)/$@ + $(CC) $(CFLAGS_C) $(DDEBUG) $(DHDF5) $< -o $(IDIR)/$@ yapp_showinfo: $(IDIR)/yapp_showinfo.o $(IDIR)/yapp_version.o \ $(IDIR)/yapp_erflookup.o $(IDIR)/yapp_common.o $(IDIR)/colourmap.o @@ -176,7 +181,7 @@ yapp_viewdata: $(IDIR)/yapp_viewdata.o $(IDIR)/yapp_version.o \ $(CC) $^ $(LFLAGS_PGPLOT) $(LFLAGS_MATH) $(LFLAGS_CFITSIO) $(LFLAGS_HDF5) -o $(BINDIR)/$@ yapp_ft.o: $(SRCDIR)/yapp_ft.c $(SRCDIR)/yapp.h - $(CC) $(CFLAGS_C) $(DDEBUG) $< -o $(IDIR)/$@ + $(CC) $(CFLAGS_C) $(DDEBUG) $(DHDF5) $< -o $(IDIR)/$@ yapp_ft: $(IDIR)/yapp_ft.o $(IDIR)/yapp_version.o \ $(IDIR)/yapp_erflookup.o $(IDIR)/yapp_common.o @@ -184,7 +189,7 @@ yapp_ft: $(IDIR)/yapp_ft.o $(IDIR)/yapp_version.o \ $(LFLAGS_CFITSIO) $(LFLAGS_HDF5) -o $(BINDIR)/$@ yapp_dedisperse.o: $(SRCDIR)/yapp_dedisperse.c $(SRCDIR)/yapp.h - $(CC) $(CFLAGS_C) $(DDEBUG) $(DFC) $(SRCDIR)/yapp_dedisperse.c \ + $(CC) $(CFLAGS_C) $(DDEBUG) $(DHDF5) $(DFC) $(SRCDIR)/yapp_dedisperse.c \ -o $(IDIR)/$@ yapp_dedisperse: $(IDIR)/yapp_dedisperse.o @@ -194,15 +199,23 @@ yapp_dedisperse: $(IDIR)/yapp_dedisperse.o yapp_smooth.o: $(SRCDIR)/yapp_smooth.c $(SRCDIR)/yapp.h \ $(SRCDIR)/yapp_sigproc.h - $(CC) $(CFLAGS_C) $(DDEBUG) $< -o $(IDIR)/$@ + $(CC) $(CFLAGS_C) $(DDEBUG) $(DHDF5) $< -o $(IDIR)/$@ yapp_smooth: $(IDIR)/yapp_smooth.o $(IDIR)/yapp_version.o \ $(IDIR)/yapp_erflookup.o $(IDIR)/yapp_common.o $(CC) $^ $(LFLAGS_PGPLOT) $(LFLAGS_MATH) $(LFLAGS_CFITSIO) $(LFLAGS_HDF5) -o $(BINDIR)/$@ +yapp_decimate.o: $(SRCDIR)/yapp_decimate.c $(SRCDIR)/yapp.h \ + $(SRCDIR)/yapp_sigproc.h + $(CC) $(CFLAGS_C) $(DDEBUG) $(DHDF5) $< -o $(IDIR)/$@ + +yapp_decimate: $(IDIR)/yapp_decimate.o $(IDIR)/yapp_version.o \ + $(IDIR)/yapp_erflookup.o $(IDIR)/yapp_common.o + $(CC) $^ $(LFLAGS_PGPLOT) $(LFLAGS_MATH) $(LFLAGS_CFITSIO) $(LFLAGS_HDF5) -o $(BINDIR)/$@ + yapp_filter.o: $(SRCDIR)/yapp_filter.c $(SRCDIR)/yapp.h \ $(SRCDIR)/yapp_sigproc.h - $(CC) $(CFLAGS_C) $(DDEBUG) $< -o $(IDIR)/$@ + $(CC) $(CFLAGS_C) $(DDEBUG) $(DHDF5) $< -o $(IDIR)/$@ yapp_filter: $(IDIR)/yapp_filter.o $(IDIR)/yapp_version.o \ $(IDIR)/yapp_erflookup.o $(IDIR)/yapp_common.o @@ -210,21 +223,21 @@ yapp_filter: $(IDIR)/yapp_filter.o $(IDIR)/yapp_version.o \ $(LFLAGS_CFITSIO) $(LFLAGS_HDF5) -o $(BINDIR)/$@ yapp_fold.o: $(SRCDIR)/yapp_fold.c $(SRCDIR)/yapp.h $(SRCDIR)/yapp_sigproc.h - $(CC) $(CFLAGS_C) $(DDEBUG) $< -o $(IDIR)/$@ + $(CC) $(CFLAGS_C) $(DDEBUG) $(DHDF5) $< -o $(IDIR)/$@ yapp_fold: $(IDIR)/yapp_fold.o $(IDIR)/yapp_version.o \ $(IDIR)/yapp_erflookup.o $(IDIR)/yapp_common.o $(IDIR)/colourmap.o $(CC) $^ $(LFLAGS_PGPLOT) $(LFLAGS_MATH) $(LFLAGS_CFITSIO) $(LFLAGS_HDF5) -o $(BINDIR)/$@ yapp_add.o: $(SRCDIR)/yapp_add.c $(SRCDIR)/yapp.h $(SRCDIR)/yapp_sigproc.h - $(CC) $(CFLAGS_C) $(DDEBUG) $< -o $(IDIR)/$@ + $(CC) $(CFLAGS_C) $(DDEBUG) $(DHDF5) $< -o $(IDIR)/$@ yapp_add: $(IDIR)/yapp_add.o $(IDIR)/yapp_version.o \ $(IDIR)/yapp_erflookup.o $(IDIR)/yapp_common.o $(CC) $^ $(LFLAGS_PGPLOT) $(LFLAGS_MATH) $(LFLAGS_CFITSIO) $(LFLAGS_HDF5) -o $(BINDIR)/$@ yapp_subtract.o: $(SRCDIR)/yapp_subtract.c $(SRCDIR)/yapp.h $(SRCDIR)/yapp_sigproc.h - $(CC) $(CFLAGS_C) $(DDEBUG) $< -o $(IDIR)/$@ + $(CC) $(CFLAGS_C) $(DDEBUG) $(DHDF5) $< -o $(IDIR)/$@ yapp_subtract: $(IDIR)/yapp_subtract.o $(IDIR)/yapp_version.o \ $(IDIR)/yapp_erflookup.o $(IDIR)/yapp_common.o @@ -232,7 +245,7 @@ yapp_subtract: $(IDIR)/yapp_subtract.o $(IDIR)/yapp_version.o \ yapp_fits2fil.o: $(UTILDIR)/yapp_fits2fil.c $(UTILDIR)/yapp_fits2fil.h \ $(SRCDIR)/yapp.h $(SRCDIR)/yapp_sigproc.h $(SRCDIR)/yapp_psrfits.h - $(CC) $(CFLAGS_C) -I$(SRCDIR) $(DDEBUG) $< -o $(UTILDIR)/$@ + $(CC) $(CFLAGS_C) -I$(SRCDIR) $(DDEBUG) $(DHDF5) $< -o $(UTILDIR)/$@ yapp_fits2fil: $(UTILDIR)/yapp_fits2fil.o $(IDIR)/yapp_version.o \ $(IDIR)/yapp_erflookup.o $(IDIR)/yapp_common.o @@ -240,7 +253,7 @@ yapp_fits2fil: $(UTILDIR)/yapp_fits2fil.o $(IDIR)/yapp_version.o \ yapp_dat2tim.o: $(UTILDIR)/yapp_dat2tim.c $(UTILDIR)/yapp_dat2tim.h \ $(SRCDIR)/yapp.h $(SRCDIR)/yapp_sigproc.h - $(CC) $(CFLAGS_C) -I$(SRCDIR) $(DDEBUG) $< -o $(UTILDIR)/$@ + $(CC) $(CFLAGS_C) -I$(SRCDIR) $(DDEBUG) $(DHDF5) $< -o $(UTILDIR)/$@ yapp_dat2tim: $(UTILDIR)/yapp_dat2tim.o $(SRCDIR)/yapp_version.o \ $(IDIR)/yapp_erflookup.o $(IDIR)/yapp_common.o @@ -248,7 +261,7 @@ yapp_dat2tim: $(UTILDIR)/yapp_dat2tim.o $(SRCDIR)/yapp_version.o \ yapp_tim2dat.o: $(UTILDIR)/yapp_tim2dat.c $(UTILDIR)/yapp_tim2dat.h \ $(SRCDIR)/yapp.h $(SRCDIR)/yapp_sigproc.h - $(CC) $(CFLAGS_C) -I$(SRCDIR) $(DDEBUG) $< -o $(UTILDIR)/$@ + $(CC) $(CFLAGS_C) -I$(SRCDIR) $(DDEBUG) $(DHDF5) $< -o $(UTILDIR)/$@ yapp_tim2dat: $(UTILDIR)/yapp_tim2dat.o $(SRCDIR)/yapp_version.o \ $(IDIR)/yapp_erflookup.o $(IDIR)/yapp_common.o @@ -273,28 +286,28 @@ yapp_fil2h5: endif yapp_siftpulses.o: $(SRCDIR)/yapp_siftpulses.c $(SRCDIR)/yapp.h $(SRCDIR)/yapp_sigproc.h - $(CC) $(CFLAGS_C) $(DDEBUG) $< -o $(IDIR)/$@ + $(CC) $(CFLAGS_C) $(DDEBUG) $(DHDF5) $< -o $(IDIR)/$@ yapp_siftpulses: $(IDIR)/yapp_siftpulses.o $(IDIR)/yapp_version.o \ $(IDIR)/yapp_erflookup.o $(IDIR)/yapp_common.o $(CC) $^ $(LFLAGS_PGPLOT) $(LFLAGS_MATH) $(LFLAGS_CFITSIO) $(LFLAGS_HDF5) -o $(BINDIR)/$@ yapp_stacktim.o: $(SRCDIR)/yapp_stacktim.c $(SRCDIR)/yapp.h $(SRCDIR)/yapp_sigproc.h - $(CC) $(CFLAGS_C) $(DDEBUG) $< -o $(IDIR)/$@ + $(CC) $(CFLAGS_C) $(DDEBUG) $(DHDF5) $< -o $(IDIR)/$@ yapp_stacktim: $(IDIR)/yapp_stacktim.o $(IDIR)/yapp_version.o \ $(IDIR)/yapp_erflookup.o $(IDIR)/yapp_common.o $(IDIR)/colourmap.o $(CC) $^ $(LFLAGS_PGPLOT) $(LFLAGS_MATH) $(LFLAGS_CFITSIO) $(LFLAGS_HDF5) -o $(BINDIR)/$@ yapp_split.o: $(SRCDIR)/yapp_split.c $(SRCDIR)/yapp.h $(SRCDIR)/yapp_sigproc.h - $(CC) $(CFLAGS_C) $(DDEBUG) $< -o $(IDIR)/$@ + $(CC) $(CFLAGS_C) $(DDEBUG) $(DHDF5) $< -o $(IDIR)/$@ yapp_split: $(IDIR)/yapp_split.o $(IDIR)/yapp_version.o \ $(IDIR)/yapp_erflookup.o $(IDIR)/yapp_common.o $(IDIR)/colourmap.o $(CC) $^ $(LFLAGS_PGPLOT) $(LFLAGS_MATH) $(LFLAGS_CFITSIO) $(LFLAGS_HDF5) -o $(BINDIR)/$@ yapp_ym2fil.o: $(UTILDIR)/yapp_ym2fil.c $(SRCDIR)/yapp.h $(SRCDIR)/yapp_sigproc.h - $(CC) $(CFLAGS_C) -I$(SRCDIR) $(DDEBUG) $< -o $(UTILDIR)/$@ + $(CC) $(CFLAGS_C) -I$(SRCDIR) $(DDEBUG) $(DHDF5) $< -o $(UTILDIR)/$@ yapp_ym2fil: $(UTILDIR)/yapp_ym2fil.o $(IDIR)/yapp_version.o \ $(IDIR)/yapp_erflookup.o $(IDIR)/yapp_common.o $(IDIR)/colourmap.o @@ -324,6 +337,7 @@ clean: $(DELCMD) $(IDIR)/yapp_ft.o $(DELCMD) $(IDIR)/yapp_dedisperse.o $(DELCMD) $(IDIR)/yapp_smooth.o + $(DELCMD) $(IDIR)/yapp_decimate.o $(DELCMD) $(IDIR)/yapp_filter.o $(DELCMD) $(IDIR)/yapp_fold.o $(DELCMD) $(IDIR)/yapp_add.o diff --git a/README.md b/README.md index 42f7764..44d0569 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ The YAPP tools available with this release are: * `yapp_stacktim` : Stacks time series data to form filterbank data. * `yapp_split` : Splits time series data into time sections. * `yapp_showinfo` : Displays supported file types and colourmaps. +* `yapp_decimate` : Decimate filterbank and time series data. YAPP also comes with the following utilities: diff --git a/src/yapp.h b/src/yapp.h index 7a4a280..3125936 100644 --- a/src/yapp.h +++ b/src/yapp.h @@ -130,6 +130,10 @@ enum tagFileFormats #define YAPP_BYTE2BIT_FACTOR 8 #define INFIX_SMOOTH "smooth" +#define INFIX_DECIMATE "dec" +#define INFIX_DECIMATE_FREQ "f" +#define INFIX_DECIMATE_TIME "t" +#define INFIX_DECIMATE_BITS "b" #define INFIX_SUB "sub" #define INFIX_FILTER "filt" #define INFIX_DEDISPERSE "dm" @@ -626,6 +630,42 @@ int YAPP_CalcDelays(double dDM, int** ppiOffsetTab, int* piMaxOffset); +/** + * Decimate data + * @param[in] pfInBuf Input buffer + * @param[in] iBlockSize Number of samples in input buffer + * @param[in] iSampsPerWin Number of time samples in window + * @param[in] iNumChans Number of input channels + * @param[in] iChansPerWin Number of channels in window + * @param[out] pfOutBuf Output buffer + * @param[in] iOutNumChans Number of output channels + */ +void YAPP_Decimate(float *pfInBuf, + int iBlockSize, + int iSampsPerWin, + int iNumChans, + int iChansPerWin, + float *pfOutBuf, + int iOutNumChans); + +void YAPP_Float2Nibble(float *pfBuf, + int iLen, + float fMin, + float fMax, + unsigned char *pcBuf); + +void YAPP_Float2Byte(float *pfBuf, + int iLen, + float fMin, + float fMax, + unsigned char *pcBuf); + +void YAPP_Float2Short(float *pfBuf, + int iLen, + float fMin, + float fMax, + short int *piBuf); + /** * Smooth data * @param[in] pfInBuf Input buffer diff --git a/src/yapp_common.c b/src/yapp_common.c index babfd30..61bd374 100644 --- a/src/yapp_common.c +++ b/src/yapp_common.c @@ -469,15 +469,12 @@ int YAPP_ReadMetadata(char *pcFileSpec, int iFormat, YUM_t *pstYUM) "Reading SIGPROC header failed!\n"); return YAPP_RET_ERROR; } - if (YAPP_FORMAT_DTS_TIM == iFormat) + iRet = YAPP_CalcStats(pcFileSpec, iFormat, pstYUM); + if (iRet != YAPP_RET_SUCCESS) { - iRet = YAPP_CalcStats(pcFileSpec, iFormat, pstYUM); - if (iRet != YAPP_RET_SUCCESS) - { - (void) fprintf(stderr, - "ERROR: Calculating statistics failed!\n"); - return YAPP_RET_ERROR; - } + (void) fprintf(stderr, + "ERROR: Calculating statistics failed!\n"); + return YAPP_RET_ERROR; } break; @@ -3110,6 +3107,130 @@ int YAPP_Smooth(float* pfInBuf, } +/* + * Decimate data in frequency and time + */ +void YAPP_Decimate(float *pfInBuf, + int iBlockSize, + int iSampsPerWin, + int iNumChans, + int iChansPerWin, + float *pfOutBuf, + int iOutNumChans) +{ + int i = 0; + int j = 0; + int k = 0; + int l = 0; + float *pfInSpectrum = NULL; + float *pfOutSpectrum = NULL; + + /* decimate in frequency */ + for (i = 0; i < iBlockSize; ++i) + { + pfInSpectrum = pfInBuf + i * iNumChans; + for (j = 0; j < iNumChans - (iChansPerWin - 1); ++j) + { + for (k = 1; k < iChansPerWin; ++k) + { + pfInSpectrum[j] += pfInSpectrum[j+k]; + } + } + } + + /* decimate in time */ + /* NOTE: since we've already decimated in frequency, step by + iChansPerWin */ + for (i = 0; i < iNumChans; i+= iChansPerWin) + { + for (j = 0; j < iBlockSize - (iSampsPerWin - 1); ++j) + { + for (k = 1; k < iSampsPerWin; ++k) + { + *(pfInBuf + j * iNumChans + i) + += *(pfInBuf + (j + k) * iNumChans + i); + } + } + } + + /* scale and downsample */ + for (i = 0, j = 0; i < iBlockSize; i += iSampsPerWin, ++j) + { + pfInSpectrum = pfInBuf + i * iNumChans; + pfOutSpectrum = pfOutBuf + j * iOutNumChans; + for (k = 0, l = 0; k < iNumChans; k += iChansPerWin, ++l) + { + pfOutSpectrum[l] = pfInSpectrum[k] + / (iChansPerWin * iSampsPerWin); + } + } + + return; +} + + +void YAPP_Float2Nibble(float *pfBuf, + int iLen, + float fMin, + float fMax, + unsigned char *pcBuf) +{ + int i = 0; + float fRange = fMax - fMin; + float fIntMax = (float) (powf(2, YAPP_SAMPSIZE_4) - 1.0); + unsigned char cLo = 0; + unsigned char cHi = 0; + + for (i = 0; i < iLen; i += 2) + { + cLo = (unsigned char) roundf(((pfBuf[i] - fMin) / fRange) * fIntMax); + cHi = (unsigned char) roundf(((pfBuf[i+1] - fMin) / fRange) * fIntMax); + pcBuf[i/2] = (cHi << 4) | cLo; + } + + return; +} + + +void YAPP_Float2Byte(float *pfBuf, + int iLen, + float fMin, + float fMax, + unsigned char *pcBuf) +{ + int i = 0; + float fRange = fMax - fMin; + float fIntMax = (float) (powf(2, YAPP_SAMPSIZE_8) - 1.0); + + for (i = 0; i < iLen; ++i) + { + pcBuf[i] = (unsigned char) roundf(((pfBuf[i] - fMin) / fRange) + * fIntMax); + } + + return; +} + + +void YAPP_Float2Short(float *pfBuf, + int iLen, + float fMin, + float fMax, + short int *piBuf) +{ + int i = 0; + float fRange = fMax - fMin; + float fIntMax = (float) (powf(2, YAPP_SAMPSIZE_16) - 1.0); + + for (i = 0; i < iLen; ++i) + { + piBuf[i] = (short int) roundf(((pfBuf[i] - fMin) / fRange) * fIntMax); + } + + return; +} + + /* * Calculate statistics */ @@ -3125,14 +3246,18 @@ int YAPP_CalcStats(char *pcFileData, int iFormat, YUM_t *pstYUM) int i = 0; float fMean = 0.0; float fRMS = 0.0; + int iNumChansBk = 0; - /* only support .tim and .dat files for now */ + /* only support .tim, .dat, and .fil files for now */ assert((YAPP_FORMAT_DTS_TIM == iFormat) - || (YAPP_FORMAT_DTS_DAT == iFormat)); + || (YAPP_FORMAT_DTS_DAT == iFormat) + || (YAPP_FORMAT_FIL == iFormat)); /* make sure the metadata has been read, as we need to skip the header */ if (YAPP_FORMAT_DTS_TIM == iFormat) { assert(pstYUM->iHeaderLen != 0); + iNumChansBk = pstYUM->iNumChans; + pstYUM->iNumChans = 1; } /* open the data file for reading */ @@ -3149,12 +3274,11 @@ int YAPP_CalcStats(char *pcFileData, int iFormat, YUM_t *pstYUM) iNumReads = (int) ceilf(((float) pstYUM->iTimeSamps) / iBlockSize); /* optimisation - store some commonly used values in variables */ - /* NOTE: will be iBlockSize * iNumChans once filterbank is supported */ - iTotSampsPerBlock = iBlockSize; + iTotSampsPerBlock = pstYUM->iNumChans * iBlockSize; /* allocate memory for the buffer, based on the number of channels and time samples */ - g_pfBuf = (float *) YAPP_Malloc((size_t) iBlockSize, + g_pfBuf = (float *) YAPP_Malloc((size_t) pstYUM->iNumChans * iBlockSize, sizeof(float), YAPP_FALSE); if (NULL == g_pfBuf) @@ -3198,7 +3322,7 @@ int YAPP_CalcStats(char *pcFileData, int iFormat, YUM_t *pstYUM) if (iReadItems < iTotSampsPerBlock) { - iDiff = iBlockSize - iReadItems; + iDiff = (pstYUM->iNumChans * iBlockSize) - iReadItems; /* reset remaining elements to '\0' */ (void) memset((g_pfBuf + iReadItems), @@ -3209,16 +3333,16 @@ int YAPP_CalcStats(char *pcFileData, int iFormat, YUM_t *pstYUM) /* calculate the number of time samples in the block - this may not be iBlockSize for the last block, and should be iBlockSize for all other blocks */ - iNumSamps = iReadItems; + iNumSamps = iReadItems / pstYUM->iNumChans; /* calculate statistics */ - fMean = YAPP_CalcMean(g_pfBuf, iNumSamps, 0, 1); + fMean = YAPP_CalcMean(g_pfBuf, iReadItems, 0, 1); pstYUM->fMean += fMean; - fRMS = YAPP_CalcRMS(g_pfBuf, iNumSamps, 0, 1, fMean); + fRMS = YAPP_CalcRMS(g_pfBuf, iReadItems, 0, 1, fMean); fRMS *= fRMS; - fRMS *= (iNumSamps - 1); + fRMS *= (iReadItems - 1); pstYUM->fRMS += fRMS; - for (i = 0; i < iNumSamps; ++i) + for (i = 0; i < iReadItems; ++i) { if (g_pfBuf[i] < pstYUM->fMin) { @@ -3233,7 +3357,7 @@ int YAPP_CalcStats(char *pcFileData, int iFormat, YUM_t *pstYUM) /* print statistics */ pstYUM->fMean /= iReadBlockCount; - pstYUM->fRMS /= (pstYUM->iTimeSamps - 1); + pstYUM->fRMS /= (pstYUM->iNumChans * pstYUM->iTimeSamps - 1); pstYUM->fRMS = sqrtf(pstYUM->fRMS); /* kludgy reset of static variable cIsFirst in YAPP_ReadData() */ @@ -3247,6 +3371,12 @@ int YAPP_CalcStats(char *pcFileData, int iFormat, YUM_t *pstYUM) close it */ g_pFData = NULL; + /* reset the number of channels */ + if (YAPP_FORMAT_DTS_TIM == iFormat) + { + pstYUM->iNumChans = iNumChansBk; + } + return YAPP_RET_SUCCESS; } diff --git a/src/yapp_decimate.c b/src/yapp_decimate.c new file mode 100644 index 0000000..922ec99 --- /dev/null +++ b/src/yapp_decimate.c @@ -0,0 +1,1181 @@ +/* + * @file yapp_decimate.c + * Program to decimate (low-pass filter and downsample) data. + * + * @verbatim + * Usage: yapp_decimate [options] + * -h --help Display this usage information + * -s --skip