3

ApplesvDSPAPIを使用してオーディオのFFTを計算しています。しかし、amp[]実際の入力でのFFTの理解から、私の結果(in)はN / 2の周りで対称ではありませんか?

以下frameは、オーディオサンプルを含むフロートの配列[128]です。

        int numSamples = 128;
        vDSP_Length log2n = log2f(numSamples);
        FFTSetup fftSetup = vDSP_create_fftsetup(log2n, FFT_RADIX2);
        int nOver2 = numSamples/2;

        COMPLEX_SPLIT A;
        A.realp = (float *) malloc(nOver2*sizeof(float));
        A.imagp = (float *) malloc(nOver2*sizeof(float));

        vDSP_ctoz((COMPLEX*)frame, 2, &A, 1, nOver2);

        //Perform FFT using fftSetup and A
        //Results are returned in A
        vDSP_fft_zrip(fftSetup, &A, 1, log2n, FFT_FORWARD);

        //Convert COMPLEX_SPLIT A result to float array to be returned
        float amp[numSamples];
        amp[0] = A.realp[0]/(numSamples*2);
        for(int i=1;i<numSamples;i++) {
            amp[i]=A.realp[i]*A.realp[i]+A.imagp[i]*A.imagp[i];
            printf("%f ",amp[i]);
        }

同じフロート配列をオンラインFFT計算機に入れると、対称的な出力が得られます。私は上記で何か間違ったことをしていますか?

何らかの理由で、のほとんどの値amp[]は約0から1e-5ですが、私は約1e23の1つの巨大な値も取得します。ここではウィンドウ処理を行っていません。最初に基本的なFFTを機能させようとしているだけです。

同じデータを使用して、2つのFFT出力の写真を添付し​​ました。一定のスケーリング係数ではありませんが、64までは類似していることがわかります。そのため、何が違うのかわかりません。それから64以上それらは完全に異なっています。

ここに画像の説明を入力してください

4

2 に答える 2

4

実数から複素数へのFFTの数学的出力は対称であるため、後半を返すことに価値はありません。また、に渡される配列にはそのためのスペースがありませんvDSP_fft_zrip。したがってvDSP_fft_zrip、前半のみを返します(以下で説明する特別なN / 2ポイントを除く)。通常、後半は明示的には必要ありません。必要な場合は、前半から簡単に計算できます。

順方向(実数から複素数)への変換に使用された場合の出力vDSP_fft_zripは、でH 0出力(純粋に実数、虚数部はゼロ)になりA.realp[0]ます。H N / 2出力(これも純粋に本物です)はに格納されA.imagp[0]ます。残りの値Hiは、0 < i <N / 2の場合、通常はとに格納されA.realp[i]ますA.imagp[i]

これを説明するドキュメントは、「実際のFFTのデータパッキング」のセクションにあります

于 2013-02-15T20:30:12.857 に答える
0

厳密に実数の入出力から基本的なFFTまで対称的な結果を得るには、複雑なデータ入力および出力配列がFFTと同じ長さである必要があります。データの半分だけをFFT入力に割り当ててコピーしているようです。これにより、非実メモリのガベージがFFTに供給されている可能性があります。

于 2013-02-14T15:23:33.550 に答える