Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.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++ 如何在FFTW库中进行实-实反FFT_C++_C_Fft_Inverse_Fftw - Fatal编程技术网

C++ 如何在FFTW库中进行实-实反FFT

C++ 如何在FFTW库中进行实-实反FFT,c++,c,fft,inverse,fftw,C++,C,Fft,Inverse,Fftw,我想用FFT做一些滤波。我正在使用r2r_1d计划,我不知道如何进行逆变换 void PerformFiltering(double* data, int n) { /* FFT */ double* spectrum = new double[n]; fftw_plan plan; plan = fftw_plan_r2r_1d(n, data, spectrum, FFTW_REDFT

我想用FFT做一些滤波。我正在使用r2r_1d计划,我不知道如何进行逆变换

    void PerformFiltering(double* data, int n)
    {
                    /* FFT */
        double* spectrum = new double[n];

        fftw_plan plan;

        plan = fftw_plan_r2r_1d(n, data, spectrum, FFTW_REDFT00, FFTW_ESTIMATE);

        fftw_execute(plan); // signal to spectrum
        fftw_destroy_plan(plan); 


                    /* some filtering here */


                    /* Inverse FFT */
        plan = fftw_plan_r2r_1d(n, spectrum, data, FFTW_REDFT00, FFTW_ESTIMATE);
        fftw_execute(plan); // spectrum to signal (inverse FFT)
        fftw_destroy_plan(plan);

}
我做的一切都对吗?我很困惑,因为在FFTW复数DFT中,可以通过如下标志设置变换方向:
p=fftw\U平面图\U dft\U 1d(N,输入,输出,fftw\U正向,fftw\U估算)

p=fftw\u平面图\u dft\u 1d(N,输入,输出,fftw\u向后,fftw\u估计)

“种类”指定方向


(还请注意,您可能希望通过除以n来重新规范化信号。FFTW的规范化约定在变换及其逆运算后乘以n。)

您做得正确。FFTW_REDFT00表示余弦变换,余弦变换是其自身的逆变换。因此不需要区分“向前”和“向后”。但是,要注意数组的大小。如果要检测频率为10,且数据包含100个有意义的点,则数组
data
应包含101个数据点,并将
n=101设置为100而不是100。标准化应为
2*(n-1)
。请参见下面的示例,使用
gcc a.c-lfftw3
编译

#include <stdio.h>
#include <math.h>
#include <fftw3.h>
#define n 101 /* note the 1 */
int main(void) {
  double in[n], in2[n], out[n];
  fftw_plan p, q;
  int i;
  p = fftw_plan_r2r_1d(n, in, out, FFTW_REDFT00, FFTW_ESTIMATE);
  for (i = 0; i < n; i++) in[i] = cos(2*M_PI*10*i/(n - 1)); /* n - 1 instead of n */
  fftw_execute(p);
  q = fftw_plan_r2r_1d(n, out, in2, FFTW_REDFT00, FFTW_ESTIMATE);
  fftw_execute(q);
  for (i = 0; i < n; i++)
    printf("%3d %9.5f %9.5f\n", i, in[i], in2[i]/(2*(n - 1))); /* n - 1 instead of n */
  fftw_destroy_plan(p); fftw_destroy_plan(q); fftw_cleanup();
  return 0;
}
#包括
#包括
#包括
#定义n 101/*注意1*/
内部主(空){
双进[n],in2[n],出[n];
fftw_计划p,q;
int i;
p=fftw_计划_r2r_1d(n,输入,输出,fftw_REDFT00,fftw_估算);
对于[i]=cos(2*M_PI*10*i/(n-1));/*n-1而不是n中的(i=0;i