したがって、周期的なシリーズがあり、最初の高調波なしでそのシリーズの最大数を取得する必要があります。
シリーズのサイズは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 に設定するにはどうすればよいですか?
第二に、私がこれをどのように行っているかは正しいですか? または私は何かを逃していますか?
3 番目 (これは、次に行う必要があることのフォローアップです)。FFTW ライブラリを使用して、系列の 1 次から 4 次の高調波の振幅と位相を取得できますか? もしそうなら、どのように?
助けてくれてありがとう。
アップデート:
私が変更され
#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 を削除できません。