C++ 如何在FFTW库中进行实-实反FFT
我想用FFT做一些滤波。我正在使用r2r_1d计划,我不知道如何进行逆变换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
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