4

iPhone SDKのaurioTouch サンプル アプリケーションを見ています。「FFT」オプションを選択すると、基本的なスペクトラムアナライザが実装されます。アプリに欠けているものの 1 つは、X 軸のラベル (頻度ラベル) です。

aurioTouchAppDelegate.mmファイルの 652 行目の関数に- (void)drawOscilloscopeは、次のコードがあります。

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();

    }

}

私の理解では、コードのこの部分は、UI で各周波数に対してどのマグニチュードを描画するかを決定するために使用されるものです。y私の質問は、各反復 (または値) がforループ内で表す頻度をどのように判断できるかということです。

たとえば、6kHz の振幅を知りたい場合は、次のような行を追加することを考えています。

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

y彼らは変数名を使用することを選択しましたが、私が理解していることから、実際にはスペクトル アナライザーのビジュアル グラフの x 軸を表し、の値はy 軸を表すことに注意してくださいdrawBuffers[0][y]

4

1 に答える 1

5

使用している各ビンの頻度は、

yFract * hwSampleRate * .5

yFract は合計 fftLength の一部であり、FFT の最後のビンはサンプリング レートの半分に対応するため、.5 が必要であることは確かです。したがって、次のようなことができます

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

うまくいけば、少なくとも正しい方向にあなたを向けるのに役立ちます.

于 2010-06-01T13:38:44.957 に答える