1

入力オーディオサンプルに存在する周波数のリストを取得しようとしています。この結果を得るにはFFTを実行する必要があるようですが、(FFTWを使用して)FFTを実行すると、奇妙な答えが得られます。入力トーンの周波数を変更しても、FFTのサンプル長を変更しても、常に同じ場所にあります(最後から5か所、最後から46か所、その他数か所が散発的に表示されます)。私は何が間違っているのですか?これが私のコードです:

#include <fftw3.h>
#include <sndfile.h>
#include <math.h>
#include <algorithm>    

int main (int argc, char * argv []) {
    char        *infilename ;
    SNDFILE     *infile = NULL ;
    FILE        *outfile = NULL ;
    SF_INFO     sfinfo ;

    infile = sf_open("test.wav", SFM_READ, &sfinfo);

    int N = pow(2, 10);
    double samples[N];

    sf_read_double(infile, samples, 1);

    fftw_complex out[N];
    fftw_plan p;
    p = fftw_plan_dft_r2c_1d(N, samples, out, FFTW_ESTIMATE);

    fftw_execute(p);
    fftw_destroy_plan(p); 

    for (int i=0; i<N; i++) {
        printf("%f %f\n", out[i][0], out[i][1]);
    }

    sf_close (infile) ;

    return 0 ;
}
4

1 に答える 1

2

問題は2つありました。1つは、すべてのサウンドデータをロードしていないこと、もう1つは、結果の実際のコンポーネントを取得していることです。また、私はまだFFTの使用できない部分(ナイキスト周波数より上)を取得していました。に変更sf_read_double(infile, samples, 1)sf_read_double(infile, samples, N)に変更for (int i=0; i<N; i++) {for (int i=0; i<N/2; i++) {変更

printf("%f %f\n", out[i][0], out[i][1]);

printf("%i %f\n", i*21, sqrt(out[i][0]*out[i][0] + out[i][1]*out[i][1]));

私が望んでいた良い結果を私に与えました。

于 2012-07-12T17:47:03.377 に答える