我正在尝试获取输入音频样本中存在的频率列表。似乎我需要做一个 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 ;
}