2017-01-21 23 views
1

C++のこのMATLAB行コードとFFTWを使用するのはまったく同じですか?FFTWライブラリのMATLABのFFTとFFTShift C++

fftshift(fft(x,4096))); 

注:Xは4096のダブルデータの配列です。

今私はそれはMATLABでのFFT関数のちょうど同等であるFFT

int n = 4096 
fftw_complex *x; 
fftw_complex *y; 
x = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * n); 
y = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * n); 

for (int i=0; i<n; i++) 
{ 
     x[i][REAL] = MyDoubleData[i]; 
     x[i][IMAG] = 0; 
} 

fftw_plan plan = fftw_plan_dft_1d(n, x, y, FFTW_FORWARD, FFTW_ESTIMATE); 

fftw_execute(plan); 
fftw_destroy_plan(plan); 
fftw_cleanup(); 

を計算するために、Cのコードのこれらの行を使用する++とFFTW。 FFTWライブラリのFftShiftに相当する機能はありますか?

答えて

0

あなたが提供したFFTW関数呼び出しは、fft(x,4096)に相当します。 xが実数ならば、matlabはあなたに共役対称FFTを与えることを知っています(私は思っています)。 FFTWでこれを行う場合は、 r2c and c2r functions(実数から複素数/複素数から実数)を使用する必要があります。

自分でシフトする必要があります。あなたは直接の置換を行うことができます(パフォーマンスの低下を、しかし、直感的でなければなりません)

for (int i=0; i<n; i++) 
{ 
    fftw_complex tmp; 
    int src = i; 
    int dst = (i + n/2 - 1) % n; 

    tmp=y[src]; 
    y[src]=x[dst]; 
    y[dst]=tmp; 
} 

はまたカップルのmemcpyの(および/またはMEMMOVEの)または

+0

modify your input dataはありがとう、私が得た私の答えを使用しています。どうもありがとう。 –

+0

これらはfftshift(fft(x))と等価ではなく、fft(x)と等価です。 – Elias