Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.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
Python 正确使用fftw-fft_Python_C_Numpy_Fftw - Fatal编程技术网

Python 正确使用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); } 及 我将结果

我想在我的项目中使用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);
}

我将结果与
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]