所以我有一个周期序列,我需要在没有第一次谐波的情况下获得该序列的最高数量。
该系列尺寸为 360
所以我有
f(0)=value1
f(1)=value2
...
f(359)=value360
有人建议要做到这一点,我必须得到 360 点离散傅里叶变换 DFT (f(0), f(1)... f(359)) --> (F(0), F(1).. . F(359)) 然后将 F(0) 和 F(359) 设置为 0,这将消除一次谐波。在此之后,我应该进行 360 点离散傅立叶逆变换 iDFT,然后在结果中搜索最大值。
为此,我使用 c 中的 fft 库,但我在尝试弄清楚如何正确使用它们来做到这一点时遇到了一些麻烦。我的周期数列由不复数的实数组成,所以我这样做:
#include "complex.h"
#include "fftw.h"
#include "rfftw.h"
...
fftw_real in_r[360]; //input 1d array of real numbers
fftw_complex out_c[360]; //output 1d array of complex numbers
rfftwnd_plan p_DFT; //plan to calculate the DFT
rfftwnd_plan p_iDFT; //plan to calculate the iDFT
p_DFT = rfftwnd_create_plan(1, 360, FFTW_REAL_TO_COMPLEX, FFTW_MEASURE);
p_iDFT = rfftwnd_create_plan(1, 360, FFTW_COMPLEX_TO_REAL, FFTW_MEASURE);
rffftwnd_one_real_to_complex(p_DFT,in_r,out_c);
//I GET AN ERROR IN BOTH THIS CALLS: incompatible types when assigning to type
//‘fftw_complex’ from type ‘complex double’
out_c[0]=0.0 + 0.0*_Complex_I;
out_c[359]=0.0 + 0.0*_Complex_I;
rfftwnd_one_complex_to_real(p_iDFT,out_c,in_r);
for(i=0;i<360;i++)
max=fmaxf(in_r[i],max);
所以我有几个问题。
首先,如何将输出数组的第一个和最后一个元素设置为 0 考虑到它很复杂但不允许我为其分配一个复数?
其次,我这样做是正确的吗?还是我错过了什么?
第三(这是我接下来需要做的后续工作)。我可以使用 FFTW 库来获取该系列的第一到第四次谐波的幅度和相位吗?如果是这样,怎么做?
谢谢你的帮助。
更新:
我变了
#include "fftw.h"
为了
#include "fftw3.h"
所以在我的包括我有
#include "complex.h"
#include "fftw3.h"
#include "rfftw.h"
但是我遇到了同样的错误
更新 2:
我也遇到这样的错误
/usr/include/fftw.h:307:13: error: conflicting types for ‘fftw_destroy_plan’
因为在 fftw3.h 之后包含 rfftw.h。但是如果我删除 rfftw.h 那么我会收到这样的错误
error: unknown type name ‘fftw_real’
fftw3.h 和 rfftw.h 之间似乎存在冲突,但我无法删除 rfftw.h,因为这样我就无法使用我需要的功能。