34 : mInput(
"Input spectrum", this ),
35 mOutput(
"Output spectral peak array", this )
41 : mInput(
"Input spectrum", this ),
42 mOutput(
"Output spectral peak array", this )
86 mTmpLinearInSpectrum.
ToDB();
103 CLAM_ASSERT(CheckInputType(input),
"SpectralPeakDetect::Do() - Type of input data doesn't match expected type.");
104 CLAM_ASSERT(CheckOutputType(out),
"SpectralPeakDetect::Do() - Type of output data doesn't match expected type.");
109 const TData samplingRate = input.GetSpectralRange() *
TData(2.0);
114 const DataArray& inMagBuffer=input.GetMagBuffer();
115 const DataArray& inPhaseBuffer=input.GetPhaseBuffer();
125 DataArray& outMagBuffer=out.GetMagBuffer();
126 DataArray& outFreqBuffer=out.GetFreqBuffer();
127 DataArray& outPhaseBuffer=out.GetPhaseBuffer();
128 DataArray& outBinPosBuffer=out.GetBinPosBuffer();
129 DataArray& outBinWidthBuffer=out.GetBinWidthBuffer();
132 TSize nSpectralPeaks = 0;
136 for (i = 0; (i < nBins-2) && (nSpectralPeaks < maxPeaks); ++i)
138 leftMag = inMagBuffer[i];
139 middleMag = inMagBuffer[i+1];
140 rightMag = inMagBuffer[i+2];
143 if (middleMag == leftMag && leftMag == rightMag) {
145 if ((nSpectralPeaks > 0) && (outBinWidthBuffer[nSpectralPeaks-1] == 0)) {
147 outBinWidthBuffer[nSpectralPeaks-1]=
TData(binWidth);
154 if ((middleMag <= leftMag) && (middleMag<= rightMag)) {
155 if ((nSpectralPeaks > 0) && (outBinWidthBuffer[nSpectralPeaks-1] == 0)) {
156 outBinWidthBuffer[nSpectralPeaks-1]=
TData(binWidth);
161 TData interpolatedBin;
162 TData spectralPeakFreq=0;
163 TData spectralPeakPhase;
164 TData spectralPeakMag;
166 if ((middleMag >= leftMag) && (middleMag >= rightMag) && (middleMag > magThreshold)) {
168 TSize SpectralPeakPosition = i+1;
171 if ((nSpectralPeaks > 0) && (outBinWidthBuffer[nSpectralPeaks-1] == 0)) {
173 TSize lastSpectralPeakBin = (
TSize) (outFreqBuffer[nSpectralPeaks-1]*2* (nBins-1)/samplingRate);
174 TSize tempVal = binWidth - (
TSize)((SpectralPeakPosition-lastSpectralPeakBin)/2.0);
175 outBinWidthBuffer[nSpectralPeaks-1]=
TData(tempVal);
176 binWidth = (
TSize) ((SpectralPeakPosition-lastSpectralPeakBin)/2.0);
180 if ((middleMag == leftMag) && (middleMag > rightMag) && (nSpectralPeaks > 0)){
183 interpolatedBin = (double) outBinPosBuffer[nSpectralPeaks-1] + (
double) (i+1-outBinPosBuffer[nSpectralPeaks-1])/2;
184 spectralPeakFreq = interpolatedBin * samplingRate / 2 / (nBins-1);
186 outFreqBuffer[nSpectralPeaks-1]=spectralPeakFreq;
187 outMagBuffer[nSpectralPeaks-1]=input.
GetMag(spectralPeakFreq);
188 outPhaseBuffer[nSpectralPeaks-1]=input.
GetPhase(spectralPeakFreq);
189 outBinWidthBuffer[nSpectralPeaks-1]=
int(SpectralPeakPosition-outBinPosBuffer[nSpectralPeaks-1]);
190 outBinPosBuffer[nSpectralPeaks-1]= interpolatedBin;
217 const TData diffFromMax =
TData(0.5) * ((leftMag-rightMag) / (leftMag- 2*middleMag + rightMag));
218 interpolatedBin = SpectralPeakPosition+diffFromMax;
221 spectralPeakFreq = interpolatedBin * samplingRate / 2 / (nBins-1);
222 spectralPeakMag = middleMag-
TData(.25)*(leftMag-rightMag)*diffFromMax;
224 TData leftPhase,rightPhase;
227 leftPhase = inPhaseBuffer[i+1];
228 rightPhase = inPhaseBuffer[i+2];
232 leftPhase = inPhaseBuffer[i];
233 rightPhase = inPhaseBuffer[i+1];
236 if (fabs(rightPhase-leftPhase)>
PI)
244 if (diffFromMax >= 0)
245 spectralPeakPhase = leftPhase + diffFromMax*(rightPhase-leftPhase);
247 spectralPeakPhase = leftPhase + (1+diffFromMax)*(rightPhase-leftPhase);
249 if (spectralPeakFreq>maxFreq)
252 outFreqBuffer.
AddElem(spectralPeakFreq);
253 outMagBuffer.
AddElem(spectralPeakMag);
254 outPhaseBuffer.
AddElem(spectralPeakPhase);
255 outBinPosBuffer.
AddElem(interpolatedBin);
266 if ((nSpectralPeaks > 0) && (outBinWidthBuffer[nSpectralPeaks-1] == 0)){
268 TSize lastSpectralPeakBin = (
TSize) (outFreqBuffer[nSpectralPeaks-1] * 2 * nBins / samplingRate);
269 TSize tempVal = binWidth - (
TSize)((i-lastSpectralPeakBin)/2.0);
270 outBinWidthBuffer[nSpectralPeaks-1]=
TData(tempVal);
271 binWidth = (
TSize) ((i-lastSpectralPeakBin)/2.0);
289 bool SpectralPeakDetect::CheckInputType(
const Spectrum &in)
297 if (!in.HasSpectralRange())
300 if (!in.HasMagBuffer())
303 if (!in.HasPhaseBuffer())
309 bool SpectralPeakDetect::CheckOutputType(
const SpectralPeakArray &out)
317 if (!out.HasBinWidthBuffer())
320 if (!out.HasFreqBuffer())
323 if (!out.HasBinPosBuffer())
326 if (!out.HasMagBuffer())
329 if (!out.HasPhaseBuffer())