在aurioTouch示例应用程序中确定哪些频率对应于x轴

Sen*_*ful 4 iphone audio fft

我正在查看iPhone SDK 的aurioTouch示例应用程序.当您选择"FFT"选项时,它会实现一个基本的频谱分析仪.应用程序缺少的一件事是X轴标签(即频率标签).

aurioTouchAppDelegate.mm文件中,在第- (void)drawOscilloscope652行的函数中,它具有以下代码:

if (displayMode == aurioTouchDisplayModeOscilloscopeFFT)
{           
    if (fftBufferManager->HasNewAudioData())
    {
        if (fftBufferManager->ComputeFFT(l_fftData))
            [self setFFTData:l_fftData length:fftBufferManager->GetNumberFrames() / 2];
        else
            hasNewFFTData = NO;
    }

    if (hasNewFFTData)
    {

        int y, maxY;
        maxY = drawBufferLen;
        for (y=0; y<maxY; y++)
        {
            CGFloat yFract = (CGFloat)y / (CGFloat)(maxY - 1);
            CGFloat fftIdx = yFract * ((CGFloat)fftLength);

            double fftIdx_i, fftIdx_f;
            fftIdx_f = modf(fftIdx, &fftIdx_i);

            SInt8 fft_l, fft_r;
            CGFloat fft_l_fl, fft_r_fl;
            CGFloat interpVal;

            fft_l = (fftData[(int)fftIdx_i] & 0xFF000000) >> 24;
            fft_r = (fftData[(int)fftIdx_i + 1] & 0xFF000000) >> 24;
            fft_l_fl = (CGFloat)(fft_l + 80) / 64.;
            fft_r_fl = (CGFloat)(fft_r + 80) / 64.;
            interpVal = fft_l_fl * (1. - fftIdx_f) + fft_r_fl * fftIdx_f;

            interpVal = CLAMP(0., interpVal, 1.);

            drawBuffers[0][y] = (interpVal * 120);

        }
        cycleOscilloscopeLines();

    }

}
Run Code Online (Sandbox Code Playgroud)

根据我的理解,这部分代码用于决定UI中每个频率的绘制幅度.我的问题是如何确定每个迭代(或y值)在for循环内表示的频率.

例如,如果我想知道6kHz的幅度是多少,我想添加一条类似于以下的线:

if (yValueRepresentskHz(y, 6))
  NSLog(@"The magnitude for 6kHz is %f", (interpVal * 120));
Run Code Online (Sandbox Code Playgroud)

请注意,尽管他们选择使用变量名y,但根据我的理解,它实际上代表频谱分析仪可视图中的x轴,而drawBuffers[0][y]y 的值代表y轴.

Jus*_*eel 5

我相信它使用的每个bin的频率由下式给出

yFract * hwSampleRate * .5
Run Code Online (Sandbox Code Playgroud)

我很确定你需要.5,因为yFract是总fftLength的一小部分,而FFT的最后一个bin对应于采样率的一半.因此,你可以做类似的事情

NSLog(@"The magnitude for %f Hz is %f.", (yFract * hwSampleRate * .5), (interpVal * 120));
Run Code Online (Sandbox Code Playgroud)

希望至少可以帮助您指出正确的方向.