41- (
VuoReal *) frequenciesForSampleData:(
float *) sampleData numFrames:(
int)frames mode:(
VuoAudioBinAverageType)frequencyMode outputCount:(
unsigned int *)count newSumming:(
bool)newSumming;
42- (id) initWithSize:(
unsigned int)frameSize windowing:(
VuoWindowing)windowMode;
51- (id) initWithSize:(
unsigned int)frameSize windowing:(
VuoWindowing)windowMode
53 if (self = [super init])
56 _fftSetup = vDSP_create_fftsetup( log2f(frameSize), kFFTRadix2 );
61 _frequency = (
float*)calloc(
sizeof(
float)*frameSize * 2, 1);
62 _split.realp = _frequency + frameSize;
63 _split.imagp = _split.realp + frameSize / 2;
64 _frameSize = frameSize;
72 case VuoWindowing_Hamming:
73 _window = (
float *) malloc(
sizeof(
float) * frameSize);
74 vDSP_hamm_window(_window, frameSize, 0);
77 case VuoWindowing_Hann:
78 _window = (
float *) malloc(
sizeof(
float) * frameSize);
79 vDSP_hann_window(_window, frameSize, 0);
82 case VuoWindowing_Blackman:
83 _window = (
float *) malloc(
sizeof(
float) * frameSize);
84 vDSP_blkman_window(_window, frameSize, 0);
96static void VuoDsp_showFrequencies(
int frameCount,
VuoAudioBinAverageType mode,
int lowBin,
int highBin,
int displayBin)
99 double width = nyquist / (frameCount/2);
101 double lowFrequency = ( lowBin - .5) * width;
102 double highFrequency = (highBin + .5) * width;
103 double centerFrequency = (((double)lowBin + highBin) / 2.) * width;
105 VUserLog(
"Bin %4d %8.2f Hz ± %7.2f Hz (%8.2f Hz to %8.2f Hz)", displayBin, centerFrequency, (highFrequency - lowFrequency) / 2., lowFrequency, highFrequency);
111- (
VuoReal *)frequenciesForSampleData:(
float *)sampleData numFrames:(
int)frames mode:(
VuoAudioBinAverageType)frequencyMode outputCount:(
unsigned int *)count newSumming:(
bool)newSumming
113 bool showTable =
false;
126 vDSP_vmul(sampleData, 1, _window, 1, sampleData, 1, frames);
129 unsigned int offset = 0;
131 DSPSplitComplex lSplit = _split;
133 for( i=0; i < frames/2; ++i)
135 lSplit.realp[i] = sampleData[offset];
137 lSplit.imagp[i] = sampleData[offset];
142 vDSP_fft_zrip( _fftSetup, &lSplit, 1, log2f(_frameSize), kFFTDirection_Forward );
145 if(_window == NULL || newSumming)
148 const float scale = 1.0f/frames;
150 vDSP_vsmul( lSplit.realp, 1, &scale, lSplit.realp, 1, frames/2 );
151 vDSP_vsmul( lSplit.imagp, 1, &scale, lSplit.imagp, 1, frames/2 );
158 float *lFrequency = _frequency;
159 vDSP_zvabs( &lSplit, 1, lFrequency, 1, frames/2 );
161 switch(frequencyMode)
166 for( i=1; i<frames/2; ++i )
167 freqChannel[i-1] = lFrequency[i];
169 for( i=1; i<frames/2; ++i )
170 freqChannel[i-1] = lFrequency[i] * ((float)sqrtf(i)*2.f + 1.f);
171 *count = frames/2 - 1;
174 for (i = 1; i < frames/2; ++i)
175 VuoDsp_showFrequencies(frames, frequencyMode, i, i, i);
179 case VuoAudioBinAverageType_Quadratic:
181 int lowerFrequency = 1, upperFrequency;
188 upperFrequency = lowerFrequency + i;
190 if( upperFrequency >= frames/2 )
192 upperFrequency = frames/2-1;
195 for( k=lowerFrequency; k<=upperFrequency; ++k )
196 sum += lFrequency[k];
197 sum /= (float)(upperFrequency-lowerFrequency+1);
198 sum *= (float)i*2.f + 1.f;
199 freqChannel[i] = sum;
202 VuoDsp_showFrequencies(frames, frequencyMode, lowerFrequency, upperFrequency, i + 1);
204 lowerFrequency = upperFrequency + 1;
210 case VuoAudioBinAverageType_Logarithmic:
212 const float log2FrameSize = log2f(_frameSize);
213 int numBuckets = log2FrameSize;
214 int lowerFrequency, upperFrequency;
217 for( i=0; i<numBuckets; ++i)
219 lowerFrequency = (frames/2) / powf(2.f,log2FrameSize-i )+1;
220 upperFrequency = (frames/2) / powf(2.f,log2FrameSize-i-1);
222 if(upperFrequency>=frames/2)
223 upperFrequency=frames/2-1;
224 for( k=lowerFrequency; k<=upperFrequency; ++k )
225 sum += lFrequency[k];
226 sum /= (float)(upperFrequency-lowerFrequency+1);
227 sum *= (float)powf(i,1.5f) + 1.f;
228 freqChannel[i] = sum;
231 VuoDsp_showFrequencies(frames, frequencyMode, lowerFrequency, upperFrequency, i + 1);