Python 正确使用fftw-fft
我想在我的项目中使用fftw库中的fft函数,因此创建了以下函数:Python 正确使用fftw-fft,python,c,numpy,fftw,Python,C,Numpy,Fftw,我想在我的项目中使用fftw库中的fft函数,因此创建了以下函数: void fft(const int size, DCOMPLEX *a, DCOMPLEX *b) { fftw_plan p; p = fftw_plan_dft_1d(size, a, b, FFTW_FORWARD, FFTW_ESTIMATE); fftw_execute(p); /* repeat as needed */ fftw_destroy_plan(p); } 及 我将结果
void fft(const int size, DCOMPLEX *a, DCOMPLEX *b)
{
fftw_plan p;
p = fftw_plan_dft_1d(size, a, b, FFTW_FORWARD, FFTW_ESTIMATE);
fftw_execute(p); /* repeat as needed */
fftw_destroy_plan(p);
}
及
我将结果与b=numpy.fft.fft(a)
中的结果进行比较,同时像这样调用它们
fft(a.size(), a, b)
或
使用.size()
数组的长度(伪代码)。
与numpy代码相比,后一种方法的加速比为2,但我从中获得的结果是不正确的(即错误的值)。为什么?编辑:如果您建议我使用python包装器:它们不会提供与使用后一种解决方案时相同的加速(甚至比numpy慢)。
当比较它们时,我得到以下值作为输出(对于
2**14
元素数组和相同的输入):
原因可能是我有舍入误差吗?对于
双精度算法,许多FFT实现都会出现10-16到10-15的舍入误差,如中所示
请注意,10-15比峰值幅值1.0小300dB。大多数实际信号的动态范围要小得多(例如)。如果您的应用程序确实需要这么高的精度,您可能需要使用FFT的任意精度实现(这就是在中用作参考实现的内容).在调用memcpy
时,您传递的size
值是多少-应该是字节数,但看起来您可能没有传递元素数?谢谢,这是我的第一个错误!但是它没有计算正确的值…您的memset
调用也有类似的问题,但这在本例中可能也不是特别相关。10^(-15)或更小的顺序上的差异可能被认为是浮点舍入错误。@PaulR:F*,我不应该一直在python和C之间切换,谢谢!
fft(a.size(), a, b)
init_fft(a.size())//Called once
fftw_pre_plan(a.size(), a, b)//Called for each fft
numpy.fft.fft: [ 0.00095184 -1.54074866e-32j 0.00095267 +6.52776772e-18j
0.00095349 +2.58018535e-18j ..., 0.00095432 +1.26416719e-16j
0.00095349 +2.61724648e-16j 0.00095267 +1.21645986e-16j]
fft(): [ 0.00095184 -1.54074866e-32j 0.00095267 -5.98482633e-17j
0.00095349 -1.27638146e-16j ..., 0.00095432 -9.88543196e-16j
0.00095349 -9.30058376e-16j 0.00095267 -1.09881551e-15j]
fft_pre_plan(): [ 0.00095184 -1.54074866e-32j 0.00095267 -1.09881551e-15j
0.00095349 -9.30058376e-16j ..., 0.00095432 -1.79405492e-16j
0.00095349 -1.27638146e-16j 0.00095267 -5.98482633e-17j]