所以我有一个周期级数,我需要得到这个级数中没有第一次谐波的最高数。
这个系列有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,因为这样我就无法使用所需的函数。
最佳答案
指的是:
fftw_complex out_c[360]; //output 1d array of complex numbers
...
//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;
要在C99模式(option
-std=c99
)下对gcc执行此操作,需要按正确的顺序包括头:#include <complex.h>
#include <fftw3.h>
这样
fftw_complex
就应该定义为本机复杂类型。否则是
typedef double fftw_complex[2]
,所以赋值如下:out_c[0][0] = 0.0; // real part
out_c[0][1] = 0.0; // imaginary part
...
关于复数是如何实现的,请参见here for details。
rfftw.h
与fftw3一起过时。从the update-to-fftw3 page:FFTW 2有单独的数据类型FFTW廑u plan、fftwnd廑u plan、rfftw廑u plan和rfftwnd廑u plan,用于复杂和真实的一维和多维变换,并且每种类型都有自己的“销毁”功能。在FFTW 3中,所有的计划都是FFTW_计划类型,并且都被FFTW_销毁计划(plan)销毁。