c – FFTW根本不会返回无穷大以外的值,接近零的值或负无穷大

c – FFTW根本不会返回无穷大以外的值,接近零的值或负无穷大,第1张

概述我试图在20hz处计算正弦波的DFT. 首先,我用20赫兹的正弦函数填充一个std :: vector: std::vector<double> sinx;double samplerate = 1000.0;double frequency = 20.0;double num_cycles = 10.0;for (int i=0; i<samplerate/frequency*num_c 我试图在20hz处计算正弦波的DFT.

首先,我用20赫兹的正弦函数填充一个std :: vector:

std::vector<double> sinx;double samplerate = 1000.0;double frequency = 20.0;double num_cycles = 10.0;for (int i=0; i<samplerate/frequency*num_cycles; i++){    sinx.push_back(sin(2.0*M_PI*((double)i)*frequency/samplerate));}double N = sinx.size();

然后我启动FFTW输入和输出数组以及FFTW计划:

fftw_complex *in,*out;fftw_plan p;in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)* N);out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);p = fftw_plan_dft_1d(N,in,out,FFTW_FORWARD,FFTW_ESTIMATE);

然后我用正弦波函数值填充输入数组:

for (int i=0; i<N; i++){    in[i][0] = sinx[i];}

然后我计算FFT:

fftw_execute(p);

计算完FFT后,检查结果并清理.

double hz_per_index = samplerate/2.0/N*num_cycles;for (int i=0; i<N/num_cycles; i++){    std::cout<<"hz: "<<hz_per_index*i<<" out: "<<fabs(out[i][0])<<" "<<out[i][1]<<" in: "<<in[i][0]<<std::endl;}

我预计20h左右会出现峰值,但是根本没有尖峰.所有返回的值始终是零,无穷大或负无穷大.我的第一个想法是输入是覆盖自己,但在计算后检查输入并且它是正确的.我尝试在不同的模式下运行FFTW,FFTW_BACKWARD,FFTW_ESTIMATE,FFTW_relative,没有任何帮助.我尝试过计算不同频率,采样率,周期数的不同正弦函数.

可悲的是,我能够让它工作一次.然后我继续工作,看到它不工作,然后重新打开工作的文件,现在它不再工作了!

有人遇到过这个吗?

编辑:每个建议的新代码

它仍然无法正常工作.我尝试将复数的虚部初始化为0,我仍然有同样的问题,所以这里的代码利用了fftw库的真实输入/复合输出功能.

对于一切我基本上都是0.
这是输入的所有5个周期的完整输出,显示输入,输出和hz值:

https://gist.github.com/anonymous/ed419f4cfb43887c810e

double *in;fftw_complex* out;fftw_plan p;std::vector<double> sinx;double samplerate = 1000.0;double frequency = 20.0;double num_cycles = 5.0;for (int i=0; i<samplerate/frequency*num_cycles; i++){    sinx.push_back(sin(2.0*M_PI*((double)i)*frequency/samplerate));}int N = sinx.size();in = (double*) fftw_malloc(sizeof(double)* N);out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);p = fftw_plan_dft_r2c_1d(N,FFTW_ESTIMATE);for (int i=0; i<N; i++){    in[i] = sinx[i];}fftw_execute(p);double hz_per_index = samplerate/2.0/N*num_cycles;for (int i=0; i<N; i++){    std::cout<<"hz: "<<hz_per_index * (i % (int)(N/num_cycles))<<" out: "<<out[i][0]<<" in: "<<in[i]<<std::endl;}fftw_destroy_plan(p);fftw_free(in); fftw_free(out);return 0;

}

解决方法 你正在分配一个fftw_complexes数组,它由两个元素组成 – 真实和复杂的组件 – 但你只是初始化每个样本的实际组件.这可能会留下包含随机数据的复杂组件,从而导致意外的疯狂结果!

如果你不需要处理复杂的样本 – 很可能 – 你可能想要使用one of FFTW’s real-data DFT functions,它需要一个双数组作为输入.否则,将所有复杂组件(在[i] [1]中)初始化为零.

此外,您不会查看输出的复杂组件.你可能错过了一些重要的东西.

总结

以上是内存溢出为你收集整理的c – FFTW根本不会返回无穷大以外的值,接近零的值或负无穷大全部内容,希望文章能够帮你解决c – FFTW根本不会返回无穷大以外的值,接近零的值或负无穷大所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1216148.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存