Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何正确地FFT声音阵列?_C++_Fftw_Libsndfile - Fatal编程技术网

C++ 如何正确地FFT声音阵列?

C++ 如何正确地FFT声音阵列?,c++,fftw,libsndfile,C++,Fftw,Libsndfile,我正在尝试获取输入音频样本中存在的频率列表。似乎我需要做FFT来得到这个结果,但当我进行FFT时(使用FFTW),我得到了奇怪的答案:我得到的数组大多包含零和一些不可能大的元素(300+位!)-这些大的数字总是在同一个位置(从末尾开始5个位置,从末尾开始46个位置,还有一些零星出现)无论我是否更改输入音调的频率,或者即使我更改FFT的采样长度。我做错了什么?这是我的密码: #include <fftw3.h> #include <sndfile.h> #include &

我正在尝试获取输入音频样本中存在的频率列表。似乎我需要做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 ;
}
#包括
#包括
#包括
#包括
int main(int argc,char*argv[]){
字符*填充名;
SNDFILE*infle=NULL;
FILE*outfile=NULL;
SF_信息sfinfo;
infle=sf_open(“test.wav”、SFM_READ和sfinfo”);
int N=功率(2,10);
双样本[N];
sf\u读取双(填充,样本,1);
fftw_复数输出[N];
fftw_计划p;
p=fftw\u计划\u dft\u r2c\u 1d(N,样本,输出,fftw\u估计);
fftw_执行(p);
fftw销毁计划(p);

对于(int i=0;i问题有两方面:首先,我没有加载所有声音数据,其次,我只是获取结果的真实分量。此外,我仍然得到FFT的不可用部分(高于奈奎斯特频率)。将
sf\u read\u double(infle,samples,1)
更改为
sf\u read\u double(infle,samples,N)
,更改(int i=0;i)的
,您是否已确认您的输入数据(即
样本
)是否正常?这是一个wav文件,其他媒体播放器正常播放。这是否正常?我肯定该文件是有效的,但您是否确认您已正确读取它?如中所示,如果您打印
样本的值,它们看起来合理吗?实际上,不合理。大部分
0.000000
,其中包含一些实际数字。是吗我在如何使用libsndfile方面有问题吗?我以前从未使用过这个库,因此我恐怕没有具体的建议。但是快速查看文档()会发现以下内容:“在打开文件进行读取时,在调用sf_open()之前,格式字段应该设置为零。”。
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]));