1

したがって、周期的なシリーズがあり、最初の高調波なしでそのシリーズの最大数を取得する必要があります。

シリーズのサイズは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 を削除できません。

4

1 に答える 1

2

これを参照:

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 モード (オプション-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
...

複素数の実装方法の詳細については、こちらを参照してください。


rfftw.hfftw3 で廃止されました。update-to-fftw3 ページから:

FFTW 2 には、複素数および実数の 1 次元および多次元変換用に fftw_plan、fftwnd_plan、rfftw_plan、および rfftwnd_plan の個別のデータ型があり、各型には独自の「破棄」機能がありました。FFTW 3 では、すべての計画はタイプ fftw_plan であり、すべて fftw_destroy_plan(plan) によって破棄されます。

于 2013-06-20T18:10:09.787 に答える