1

我正在尝试获取输入音频样本中存在的频率列表。似乎我需要做一个 FFT 才能得到这个结果,但是当我 FFT 时我得到了奇怪的答案(使用 FFTW):我得到的数组主要包含零和一些不可能的大元素(300+ 位!) - 以及这些大数字无论我改变输入音调的频率还是改变 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

问题是双重的:首先,我没有加载所有的声音数据,其次,我只是获取了结果的真实部分。此外,我仍然得到 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 回答