我正在尝试获取输入音频样本中存在的频率列表。我似乎需要做一个FFT来得到这个结果,但是当我对它进行FFT时我会得到奇怪的答案(使用FFTW):我得到的数组主要包含零,其中有一些不可能的大元素(300多个数字!) - 这些大数字总是在同一个地方(距离末端5个位置,距离末端46个位置以及偶尔出现的其他几个位置)是否改变输入音调的频率,或者即使我改变FFT的采样长度。我究竟做错了什么?这是我的代码:
#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 ;
}
答案 0 :(得分: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]));
给了我想要的好成绩。