26 #include "midiGlobal.h"
28 #include "complex_midi.h"
29 #include "statistics.h"
30 #include "diagnostics.h"
31 #include "memoryHandling.h"
32 #include "errorHandling.h"
34 #include "estimationFrg.h"
35 #include "photometry.h"
36 #include "visibility.h"
37 #include "calibration.h"
64 FilterData *filterInfo,
65 CompressedData *compressed,
75 const char routine[] =
"estimateFringe";
77 int region, frame, X, n;
81 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s'\n", routine);
82 if (diagnostic > 4) fprintf (midiReportPtr,
"Invoking routine '%s'\n", routine);
84 cpl_msg_info(cpl_func,
"\nComputing Raw visibilities from batch %d \n", batchNumber);
85 cpl_msg_info(cpl_func,
"------------------------------------- \n");
86 fprintf(midiReportPtr,
"\nComputing Raw visibilities from batch %d \n", batchNumber);
87 fprintf(midiReportPtr,
"------------------------------------- \n");
93 ProcessSpectrumEachChannel (fileNames, filterInfo, compressed, format, dispRawVis,
94 dispRawVisErr, freqCal, error);
97 if (plotFile && diagnostic)
99 midiCreatePlotFile2D (
"RawVisCombined",
"Combined Raw Uncalibrated Visibility",
100 "Channel",
"Visibility", 0, dispRawVis, 0, format->iXWidth, 1, 0);
102 midiCreatePlotFile2D (
"RawVisErrCombined",
"Combined Raw Uncalibrated Visibility Error",
103 "Channel",
"Visibility Error", 0, dispRawVisErr, 0, format->iXWidth, 1, 0);
107 cpl_msg_info(cpl_func,
"\nAverage values of DISPERSED Fringe \n"
108 "---------------------------------- \n"
109 "Region Average values \n");
110 fprintf (midiReportPtr,
"\nAverage values of DISPERSED Fringe \n"
111 "---------------------------------- \n"
112 "Region Average values \n");
114 for (region = 0; region < format->numOfRegionsToProcess; region++)
118 for (frame = 0; frame < format->numOfFrames; frame++)
120 for (X = 0; X < format->iXWidth; X++)
122 if (badChannelList[X])
125 accum += (((compressed->iDispFringe)[region])[X])[frame];
131 cpl_msg_info(cpl_func,
"%2d %12.2f \n", region, accum);
132 fprintf (midiReportPtr,
"%2d %12.2f \n", region, accum);
155 void ProcessSpectrumEachChannel (
156 MidiFiles *fileNames,
157 FilterData *filterInfo,
158 CompressedData *compressed,
161 float *dispRawVisErr,
168 const char routine[] =
"ProcessSpectrumEachChannel";
169 int i, j, X, lowFreqIndex, highFreqIndex, loF, hiF,
170 freqCalExists, localError, numOfSpectrums;
171 float *spectrum, peakval, peakch;
172 float calib, **waveCal=NULL;
173 char *string, *title, *dataFilePath, *cmdFileName, *argument;
174 FILE *cmdFilePtr=NULL, *dataFilePtr=NULL;
176 FILE *wclHistoryPtr=NULL;
179 float *PeakVectorMean;
180 char *fileNamePeak, *titlePeak;
184 if (diagnostic > 4)cpl_msg_info(cpl_func,
"Invoking routine '%s'\n", routine);
185 if (diagnostic > 4) fprintf(midiReportPtr,
"Invoking routine '%s'\n", routine);
187 cpl_msg_info(cpl_func,
"\nProcessing each Channel Spectrum from batch %d \n", batchNumber);
188 cpl_msg_info(cpl_func,
"------------------------------------------- \n");
189 fprintf(midiReportPtr,
"\nProcessing each Channel Spectrum from batch %d \n", batchNumber);
190 fprintf(midiReportPtr,
"------------------------------------------- \n");
197 if (diagnostic)cpl_msg_info(cpl_func,
"FFT size was = %d \n", format->fftsize);
198 fprintf (midiReportPtr,
"FFT size was = %d \n", format->fftsize);
199 SetFFTsize (format->fftsize);
200 if (diagnostic)cpl_msg_info(cpl_func,
"FFT size is now = %d \n", format->fftsize);
201 fprintf (midiReportPtr,
"FFT size is now = %d \n", format->fftsize);
202 calib = format->optFreqCal / ((float) format->fftsize);
203 lowFreqIndex = (int) (filterInfo->optFreqLo / calib);
204 highFreqIndex = (int) (filterInfo->optFreqHi / calib);
205 if (highFreqIndex > (format->fftsize/2)) highFreqIndex = (format->fftsize/2);
208 waveCal = callocWaveCalibration (format->numOfDetectorRegions, format);
209 getCalibratedChWave (fileNames, format, waveCal, error);
215 wclHistoryPtr = fopen (fileNames->wclHistoryName,
"a");
216 fprintf (wclHistoryPtr,
"Wavelength Calibration \n");
217 fprintf (wclHistoryPtr,
"Grism ID = %s \n", format->grismId);
218 fprintf (wclHistoryPtr,
"Number of Records = %d \n", format->iXWidth);
219 fprintf (wclHistoryPtr,
"--------------------------------------- \n");
221 if (strcmp (format->beamCombiner,
"SCI_PHOT") == 0)
223 for (X = 0; X < format->iXWidth; X++) fprintf (wclHistoryPtr,
"%f %f %f %f\n",
224 waveCal[0][X], waveCal[1][X], waveCal[2][X], waveCal[3][X]);
225 fclose (wclHistoryPtr);
228 for (i = 0; i < format->iXWidth; i++)
229 freqCal[i] = (waveCal[1][i] + waveCal[2][i]) * 0.5F;
233 for (X = 0; X < format->iXWidth; X++) fprintf (wclHistoryPtr,
"%f %f\n",
234 waveCal[0][X], waveCal[1][X]);
235 fclose (wclHistoryPtr);
238 for (i = 0; i < format->iXWidth; i++)
239 freqCal[i] = (waveCal[0][i] + waveCal[1][i]) * 0.5F;
243 if (plotFile) midiCreatePlotFile2D (
"WaveCalibCombined",
"Combined Wavelength Claibration",
244 "Channel",
"Wavelength (micron)", 0, freqCal, 0, format->iXWidth, 1, 0);
250 if (!(highFreqIndex - lowFreqIndex))
253 midiReportWarning (midiReportPtr, routine, __FILE__, __LINE__,
"No channels to process");
257 freeWaveCalibration (format->numOfDetectorRegions, waveCal);
259 if (diagnostic)cpl_msg_info(cpl_func,
"\nOptical frequency calibration = %6.2f THz, calibration per FFT resolution = %6.2f THz \n",
260 format->optFreqCal, calib);
261 if (diagnostic)cpl_msg_info(cpl_func,
"Low frequency index (for %f THz) = %d \n", filterInfo->optFreqLo, lowFreqIndex);
262 if (diagnostic)cpl_msg_info(cpl_func,
"High frequency index (for %f THz) = %d \n", filterInfo->optFreqHi, highFreqIndex);
263 if (diagnostic)cpl_msg_info(cpl_func,
"With %d frames, and %d frames / scan \n", format->numOfFrames, format->framesPerScan);
264 if (diagnostic)cpl_msg_info(cpl_func,
"\nProcessing Combined visibility for each channel \n");
266 fprintf (midiReportPtr,
"\nOptical frequency calibration = %6.2f THz, calibration per fft resolution = %6.2f THz QCLOG \n",
267 format->optFreqCal, calib);
268 fprintf (midiReportPtr,
"Low frequency index (for %f THz) = %d QCLOG \n", filterInfo->optFreqLo, lowFreqIndex);
269 fprintf (midiReportPtr,
"High frequency index (for %f THz) = %d QCLOG \n", filterInfo->optFreqHi, highFreqIndex);
270 fprintf (midiReportPtr,
"With %d frames, and %d frames / scan QCLOG \n", format->numOfFrames, format->framesPerScan);
271 fprintf (midiReportPtr,
"\nProcessing Combined visibility for each channel QCLOG \n");
273 cpl_msg_info(cpl_func,
"We now carry out Frame, Scan and Channel rejection based on Signal/Noise \n\n");
274 fprintf(midiReportPtr,
"We now carry out Frame, Scan and Channel rejection based on Signal/Noise \n\n");
277 cpl_msg_info(cpl_func,
"\nIncoherent visibility results:\n\nChannel Wavelength (micron) Log slope Offset White noise Raw vis Raw vis Error\n");
278 fprintf (midiReportPtr,
279 "\nIncoherent visibility results:\n\nChannel Wavelength (micron) Log slope Offset White noise Raw vis Raw vis Error QCLOG\n");
285 dataFilePath = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
286 cmdFileName = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
287 argument = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
288 string = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
289 title = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
292 sprintf (
string,
"3dPowerSpectrumCombinedInterf");
293 sprintf (title,
"Combined Interferometry Power Spectrum");
294 sprintf (dataFilePath,
"%s%s.%s.plt", outFileDir, outRootName,
string);
295 dataFilePtr = fopen (dataFilePath,
"w");
299 spectrum = (
float *) calloc (format->fftsize/2,
sizeof(
float));
303 PeakMatrix=calloc( format->iXWidth,sizeof (
float*) );
304 for(i=0;i<format->iXWidth;i++){
305 PeakMatrix[i]=calloc(format->numOfScans,
sizeof(
float));
310 for (X = 0; X < format->iXWidth; X++)
313 if (diagnostic)cpl_msg_info(cpl_func,
"%3d", X);
314 fprintf (midiReportPtr,
"%3d", X);
316 if (badChannelList[X])
318 if (diagnostic)cpl_msg_info(cpl_func,
" %5.2f <-- %s --> \n", freqCal[X], UNAV);
319 fprintf (midiReportPtr,
" %5.2f <-- %s --> QCLOG \n", freqCal[X], UNAV);
324 for (j = 0; j < format->fftsize/2; j++)
325 fprintf (dataFilePtr,
"%f ", zero);
326 fprintf (dataFilePtr,
"\n");
332 memset (spectrum, 0, (
sizeof(
float)) * format->fftsize/2);
337 loF = lowFreqIndex - 10;
342 loF = (int) (((SPEED_OF_LIGHT / freqCal[X])/calib) - 10);
343 hiF = (int) (((SPEED_OF_LIGHT / freqCal[X])/calib) + 10);
345 if (loF < 0) loF = 0;
346 if (hiF > format->fftsize/2) hiF = format->fftsize/2;
351 numOfSpectrums = getChannelSpectrum (X, loF, hiF, compressed->rejectList[X],
352 (((compressed->iDispFringe)[0])[X]), (((compressed->iDispFringe)[1])[X]), format, spectrum, PeakMatrix[X]);
360 badChannelList[X] |= BSL_DATA_ERROR;
363 for (j = 0; j < format->fftsize/2; j++)
364 fprintf (dataFilePtr,
"%f ", zero);
365 fprintf (dataFilePtr,
"\n");
367 if (diagnostic)cpl_msg_info(cpl_func,
" %5.2f <-- %s --> \n", freqCal[X], UNAV);
368 fprintf (midiReportPtr,
" %5.2f <-- %s --> QCLOG \n", freqCal[X], UNAV);
374 for (j = 0; j < format->fftsize/2; j++)
376 if (isnan (spectrum[j]))
379 badChannelList[X] |= BSL_DATA_ERROR;
387 for (j = 0; j < format->fftsize/2; j++)
388 fprintf (dataFilePtr,
"%f ", zero);
389 fprintf (dataFilePtr,
"\n");
391 if (diagnostic)cpl_msg_info(cpl_func,
" %5.2f <-- %s --> \n", freqCal[X], UNAV);
392 fprintf (midiReportPtr,
" %5.2f <-- %s --> QCLOG \n", freqCal[X], UNAV);
399 for (j = 0; j < format->fftsize/2; j++)
400 fprintf (dataFilePtr,
"%f ", spectrum[j]);
401 fprintf (dataFilePtr,
"\n");
406 findSpectralPeak (spectrum, lowFreqIndex, highFreqIndex, &peakch, &peakval);
407 freqCal[X] = peakch*calib;
411 if (freqCal[X] == 0.0) peakch = 0.0;
412 else peakch = (SPEED_OF_LIGHT / freqCal[X])/calib;
413 peakval = spectrum[(int)(peakch+0.5F)];
416 if (diagnostic)cpl_msg_info(cpl_func,
" %5.2f ", freqCal[X]);
417 fprintf (midiReportPtr,
" %5.2f ", freqCal[X]);
421 dispRawVis[X] = analyseSpectrum (format, peakch, spectrum, calib, &(dispRawVisErr[X]));
425 dispRawVisErr[X] = 0.F;
428 if (diagnostic)cpl_msg_info(cpl_func,
" %11.4f", dispRawVis[X]);
429 if (diagnostic)cpl_msg_info(cpl_func,
" %9.4f", dispRawVisErr[X]);
430 fprintf (midiReportPtr,
" %11.4f", dispRawVis[X]);
431 fprintf (midiReportPtr,
" %9.4f", dispRawVisErr[X]);
433 if (diagnostic)cpl_msg_info(cpl_func,
"\n");
434 fprintf (midiReportPtr,
" QCLOG\n");
442 PeakVectorMean=calloc(format->numOfScans,sizeof (
float) );
445 for (scan = 0; scan < format->numOfScans; scan++)
448 for (X = 0; X < format->iXWidth; X++)
450 if(PeakMatrix[X][scan]>0){
451 PeakVectorMean[scan]+=PeakMatrix[X][scan];
455 PeakVectorMean[scan]=PeakVectorMean[scan]/(float)index;
461 fileNamePeak = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
462 titlePeak = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
463 sprintf (fileNamePeak,
"PeakScanChannelaveraged");
464 sprintf (titlePeak,
"PeakScanChannelaveraged");
466 midiCreatePlotFile2D (fileNamePeak, titlePeak,
"Scan",
"Peak", 0, PeakVectorMean, 0, format->numOfScans, 1, 0);
473 free(PeakVectorMean);
475 for(i=0;i<format->iXWidth;i++){
476 free (PeakMatrix[i]);
483 fclose (dataFilePtr);
489 sprintf (cmdFileName,
"plotCmdFile.grb");
490 cmdFilePtr = fopen (cmdFileName,
"w");
491 fprintf (cmdFilePtr,
"set title \'%s\' \n", title);
492 fprintf (cmdFilePtr,
"set xlabel 'Frequency Bin' \n");
493 fprintf (cmdFilePtr,
"set ylabel 'Channel' \n");
494 fprintf (cmdFilePtr,
"set zlabel 'Power Spectrum' \n");
495 fprintf (cmdFilePtr,
"set xrange [0:%d] \n", format->fftsize/2);
496 fprintf (cmdFilePtr,
"set yrange [0:%d] \n", format->iXWidth);
497 fprintf (cmdFilePtr,
"set ticslevel 0 \n");
498 fprintf (cmdFilePtr,
"splot \'%s\' matrix with lines 0 \n", dataFilePath);
499 if (plotDuration == -1)
501 cpl_msg_info(cpl_func,
"\n");
502 fprintf (cmdFilePtr,
"pause %d \" ***** Hit Return to continue *****\" \n", plotDuration);
505 fprintf (cmdFilePtr,
"pause %d \n", plotDuration);
510 sprintf (argument,
"gnuplot -title \"MIDI DRS\" -geometry 900x900+0+0 %s", cmdFileName);
514 remove (cmdFileName);
519 if (plotFile == 3)
remove (dataFilePath);
532 cpl_msg_info(cpl_func,
"\nWavelength Calibration Calculated from Interferometry data \n");
533 cpl_msg_info(cpl_func,
"---------------------------------------------------------- \n");
534 fprintf (midiReportPtr,
"\nWavelength Calibration Calculated from Interferometry data \n");
535 fprintf (midiReportPtr,
"---------------------------------------------------------- \n");
536 for (X = 0; X < format->iXWidth; X++)
538 if (freqCal[X] == 0.0)
540 cpl_msg_info(cpl_func,
"%3d %7.4f \n", X, zero);
541 fprintf (midiReportPtr,
"%3d %7.4f \n", X, zero);
545 freqCal[X] = SPEED_OF_LIGHT/freqCal[X];
546 cpl_msg_info(cpl_func,
"%3d %7.4f \n", X, freqCal[X]);
547 fprintf (midiReportPtr,
"%3d %7.4f \n", X, freqCal[X]);
550 cpl_msg_info(cpl_func,
"\n");
551 fprintf (midiReportPtr,
"\n");
554 wclHistoryPtr = fopen (fileNames->wclHistoryName,
"a");
555 fprintf (wclHistoryPtr,
"Wavelength Calibration from Interferometry data \n");
556 fprintf (wclHistoryPtr,
"Grism ID = %s \n", format->grismId);
557 fprintf (wclHistoryPtr,
"Number of Records = %d \n", format->iXWidth);
558 fprintf (wclHistoryPtr,
"--------------------------------------- \n");
559 for (X = 0; X < format->iXWidth; X++) fprintf (wclHistoryPtr,
"%f \n", freqCal[X]);
560 fclose (wclHistoryPtr);
563 if (plotFile) midiCreatePlotFile2D (
"WaveCalibInterfData",
"Wavelength Claibration from Interferometry data",
564 "Channel",
"Wavelength (micron)", 0, freqCal, 0, format->iXWidth, 1, 0);
567 for (X = 0; X < format->iXWidth; X++)
569 if (freqCal[X] <= 0.F)
570 badChannelList[X] |= BSL_DATA_ERROR;
593 int getChannelSpectrum (
608 int i, k, scan, numOfPs, *badFrame, minFrames, fftSizeHalf,
609 scanFailed, peakIndex;
610 float accum, dclevel, scale, lengthAve, *data1, *data2, *spectrum,
611 median, peak, ratio, *spectrumPtr;
612 struct Complex *input2ft;
613 char *fileName, *title;
619 minFrames = MIN_FRAMES_PER_SCAN * format->framesPerScan;
620 fftSizeHalf = (format->fftsize >> 1);
623 FFTarray = (
struct Complex *) calloc(MAXFFTSIZE,
sizeof(
struct Complex));
624 input2ft = (
struct Complex *) calloc(format->fftsize,
sizeof(
struct Complex));
625 spectrum = (
float *) calloc (fftSizeHalf,
sizeof (
float));
639 for (scan = 0; scan < format->numOfScans; scan++)
642 memset (input2ft, 0, (
sizeof(
struct Complex)) * format->fftsize);
643 badFrame = rejectList + scan * format->framesPerScan;
644 data1 = inData1 + scan * format->framesPerScan;
645 data2 = inData2 + scan * format->framesPerScan;
650 for (i = 0; i < format->framesPerScan; i++)
655 accum += *data1 - *data2;
658 input2ft[k].r = *data1 - *data2;
665 lengthAve += (float) k;
671 dclevel = accum / ((float) k);
674 for (i = 0; i < k; i++)
675 input2ft[i].r -= dclevel;
678 input2ft[--i].r *= 0.145F;
679 input2ft[0].r *= 0.145F;
680 input2ft[--i].r *= 0.5F;
681 input2ft[1].r *= 0.5F;
682 input2ft[--i].r *= 0.855F;
683 input2ft[2].r *= 0.855F;
686 FFT (input2ft, FFTlevel);
689 spectrumPtr = spectrum;
690 for (i = 0; i < fftSizeHalf; i++)
691 *spectrumPtr++ = Cmag2(FFTarray[i]);
693 peak = signalPeak (spectrum, 0, fftSizeHalf, &peakIndex);
694 median = signalMedian (spectrum, 0, fftSizeHalf);
697 Peakvector[scan]=peak;
701 if ((ratio > 10.0) && (peakIndex > lowFreqIndex) && (peakIndex < highFreqIndex))
704 for (i = 0; i < fftSizeHalf; i++)
705 output[i] += spectrum[i];
714 for (i = 0; i < format->framesPerScan; i++)
715 rejectList[i + scan * format->framesPerScan] |= BSL_SNR_ERROR;
719 if (plotFile && diagnostic > 2)
721 if (scanFailed)cpl_msg_info(cpl_func,
"\n <<ERROR>>: Scan %3d rejected \n\n", scan);
722 cpl_msg_info(cpl_func,
" Expected low frequency index = %3d \n", lowFreqIndex);
723 cpl_msg_info(cpl_func,
" Expected high frequency index = %3d \n", highFreqIndex);
724 cpl_msg_info(cpl_func,
" Found peak index at = %3d \n", peakIndex);
725 cpl_msg_info(cpl_func,
" peak/median = %f \n", ratio);
726 if (scanFailed) fprintf (midiReportPtr,
"\n <<ERROR>>: Scan %3d rejected \n\n", scan);
727 fprintf (midiReportPtr,
" Expected low frequency index = %3d \n", lowFreqIndex);
728 fprintf (midiReportPtr,
" Expected high frequency index = %3d \n", highFreqIndex);
729 fprintf (midiReportPtr,
" Found peak index at = %3d \n", peakIndex);
730 fprintf (midiReportPtr,
" peak/median = %f \n", ratio);
732 fileName = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
733 title = (
char *) calloc (MAX_STRING_LENGTH,
sizeof (
char));
734 sprintf (fileName,
"SpectrumScan%dChannel%d", scan, X);
735 sprintf (title,
"Power Spectrum. Scan %d, Channel %d", scan, X);
736 midiCreatePlotFile2D (fileName, title,
"Frequancy bin",
"Power Spectrum",
737 1, spectrum, 0, fftSizeHalf, 1, 0);
757 lengthAve /= ((float) numOfPs);
758 scale = 4.F * ((float) format->fftsize) / (((float) numOfPs) * (lengthAve - 3.996));
759 for (i = 0; i < fftSizeHalf; i++)
785 void findSpectralPeak (
795 int i, j = lowFreqIndex;
801 for (i = lowFreqIndex; i < highFreqIndex; i++)
803 if (data[i] > peakval)
810 if ((j == lowFreqIndex) || (j == (highFreqIndex-1)))
818 *peakch = ((float) j) + (data[j-1]-data[j+1])/(2.F*(data[j-1]+data[j+1]-2.F*data[j]));
819 if (*peakch<0.F) *peakch = 0.F;
820 if (*peakch > ((
float) highFreqIndex)) *peakch = ((float) highFreqIndex);
821 *peakinterp = data[j] - 0.125F*(data[j+1] - data[j-1]) * (data[j+1] - data[j-1]) /
822 (data[j+1] + data[j-1] - 2.F*data[j]);
844 float analyseSpectrum (
850 float *fringePowerErr)
855 float fringePower, fringeWidth, slope, offset;
856 int fringeLo1,fringeLo2, tenTHz, fringeHi1,fringeHi2, i;
857 float *noiseSpec, loPwr, hiPwr;
859 float whitenoise = 0.F;
866 noiseSpec = (
float *) calloc (format->fftsize/2,
sizeof(
float));
869 fringeWidth = 1.5 * ((float) format->fftsize) /
870 (((float) format->framesPerScan) - 4.F);
872 fringeHi1 = (int)(0.5F + fringeFreq + fringeWidth);
873 fringeHi2 = (int)(0.5F + fringeFreq + 3.F * fringeWidth);
874 if (fringeHi2 >= (format->fftsize/2 - 5))
875 fringeHi2 = (format->fftsize/2 - 6);
876 if (fringeHi1 >= (fringeHi2-1))
877 fringeHi1 = fringeHi2-2;
879 fringeLo1 = (int)(0.5F + fringeFreq - 3.F*fringeWidth);
880 fringeLo2 = (int)(0.5F + fringeFreq - fringeWidth);
883 tenTHz = (int) (0.5F + 10.F/calib) ;
884 if (fringeLo1 < tenTHz)
886 if (fringeLo1 >= (fringeLo2-1))
887 fringeLo1 = fringeLo2-2;
890 for (pass = 0; pass < 5; pass++)
894 for (i = fringeHi2; i < format->fftsize/2; i++)
895 whitenoise += (spectrum[i] - noiseSpec[i]);
897 whitenoise /= (float) (format->fftsize/2 - fringeHi2);
900 for (i = fringeLo1; i < fringeLo2; i++)
902 if (spectrum[i] > (1.05F*whitenoise))
903 loPwr += log((
double) (spectrum[i] - whitenoise));
905 loPwr += log((
double) (.05F*whitenoise));
908 loPwr /= (double) (fringeLo2 - fringeLo1);
911 for (i = fringeHi1; i < fringeHi2; i++)
913 if (spectrum[i] > (1.05F*whitenoise))
914 hiPwr += log((
double) (spectrum[i] - whitenoise));
916 hiPwr += log((
double) (.05F*whitenoise));
919 hiPwr /= (double) (fringeHi2 - fringeHi1);
922 slope = (hiPwr-loPwr)/(log((fringeHi2+fringeHi1-1)*0.5F) - log((fringeLo2 + fringeLo1-1)*0.5F));
923 offset = loPwr - slope*log((fringeLo2 + fringeLo1-1)*0.5F);
926 for (i = 1; i < (format->fftsize/2); i++)
927 noiseSpec[i] = exp(offset + slope*log(i));
929 noiseSpec[0] = noiseSpec[1];
932 if (diagnostic)cpl_msg_info(cpl_func,
" %6.3f %7.2f %8.2f ", slope, offset, whitenoise);
933 fprintf (midiReportPtr,
" %6.3f %7.2f %8.2f ", slope, offset, whitenoise);
936 *fringePowerErr = 0.F;
937 lopt = (int)(fringeFreq - fringeWidth);
938 if (lopt < 0) lopt = 0;
939 hipt = (int)(fringeFreq + fringeWidth + 1.F);
941 if (hipt >= format->fftsize/2) hipt = format->fftsize/2 - 1;
943 for (i = lopt; i <= hipt; i++)
945 fringePower += (spectrum[i] - noiseSpec[i] - whitenoise);
946 *fringePowerErr += (noiseSpec[i] + whitenoise);
952 return (fringePower);