2013-10-10 8 views
2

이산 fft에 이상한 문제가 있습니다. 나는 가우스 함수 exp (-x^2/2)의 푸리에 변환이 다시 같은 가우스 함수 exp (-k^2/2)라는 것을 알고있다. 필자는 MatLab과 FFTW에서 간단한 코드로 테스트하려고했지만 이상한 결과를 얻었습니다.MatLab을 사용한 FFTW 및 fft

먼저 결과의 허수 부는 0이어야합니다 (MatLab에서).

둘째, 실수 부분의 절대 값은 가우스 곡선이지만 절대 값이없는 경우 절반의 음수 계수가 있습니다. 보다 정확하게, 모든 두 번째 모드는 그것이되어야하는 것의 음수 인 계수를가집니다.

셋째, (실제 부분의 절대 값을 취한 후) 결과 가우스 곡선의 피크는 하나가 아니라 훨씬 더 높습니다. 높이는 x 축의 점 수에 비례합니다. 그러나 비례 요소는 1이 아니라 거의 1/20입니다.

아무도 내가 잘못하고있는 것을 설명 할 수 있습니까? 여기

내가 사용하는 MATLAB 코드입니다 :

function [nooutput,M] = fourier_test 

    Nx = 512;  % number of points in x direction 

    Lx = 50;  % width of the window containing the Gauss curve 

    x = linspace(-Lx/2,Lx/2,Nx);  % creating an equidistant grid on the x-axis 

    input_1d = exp(-x.^2/2);     % Gauss function as an input 
    input_1d_hat = fft(input_1d);   % computing the discrete FFT 
    input_1d_hat = fftshift(input_1d_hat); % ordering the modes such that the peak is centred 

    plot(real(input_1d_hat), '-') 
    hold on 
    plot(imag(input_1d_hat), 'r-') 
+0

* 연속 * FT를 * 개별 * FT와 겹칠 수 있습니다.가우스의 연속적인 FT는 가우시안이지만, DFT (FFT)의 경우 확실하지 않습니다. –

+2

물론 이산성은 일을 부정확하게 만들지 만 이산 FT는 연속 FT의 근사로 생성됩니다. 점의 수와 간격이 충분히 큰 경우 (여기의 경우) 근사값은 양호해야합니다. 편차가있을 수 있지만, 너무 크고 체계적이지 않아야합니다. 또한, Nx와 Lx를 증가 시키면 결과가 변하지 않으므로 수렴이 이루어집니다. –

+1

나는 또한 거기에 주파수 도메인에서 위상 회전으로 변환 DFT의 경우 암시 적 시간 변화가있을 수 있습니다 - 나는 크기가 올바른 것으로 기대하고 위상이 직선 (modulo 2π 당신이 있다면 그것을 풀지 않는 것, 즉 톱니 모양). –

답변

4

대답은 기본적으로, 당신은의 중심에 있기 때문에 위상 편이 (주파수에 선형 적으로 의존)을 소개 바울 R이 자신의 두 번째 의견에 제안입니다 input_1d_hat에 의해 기술 된 가우시안은 k>0에 효과적으로 있으며, k+1input_1d_hat에 대한 색인입니다. 가우스는 중앙에 있지 않은 경우,

Nx = 512;  % number of points in x direction 
    Lx = 50;  % width of the window containing the Gauss curve 

    x = linspace(-Lx/2,Lx/2,Nx);  % creating an equidistant grid on the x-axis 

    %%%%%%%%%%%%%%%% 
    x=fftshift(x); % <-- center 
    %%%%%%%%%%%%%%%% 

    input_1d = exp(-x.^2/2);     % Gauss function as an input 
    input_1d_hat = fft(input_1d);   % computing the discrete FFT 
    input_1d_hat = fftshift(input_1d_hat); % ordering the modes such that the peak is centered 

    plot(real(input_1d_hat), '-') 
    hold on 
    plot(imag(input_1d_hat), 'r-') 

DFT에의 정의에서 : 당신은 당신의 데이터를 (input_1d_hat(1) 중심에 대응하도록) 다음과 같이 주파수 영역에서 위상 보정 가우스를 얻을 중심으로 대신하는 경우 최대 값이 k=0 인 경우 위상이 뒤틀리게됩니다. fftshift의 효과는 피크의 중심을 k=0으로 옮기는 것과 같습니다. 데이터 세트의 왼쪽과 오른쪽을 순환 이동 또는 스와핑하여 수행합니다.

진폭 스케일링에 관해서는 Matlab에서 구현 된 DFT의 정의와 관련된 문제입니다. 전방 단계에서 합계가 폭을 유지하면서 요약에 포인트 Nx의 수를 증가 따라서 경우 N으로 정규화 하지 것을

For length N input vector x, the DFT is a length N vector X, 
with elements 
       N 
    X(k) =  sum x(n)*exp(-j*2*pi*(k-1)*(n-1)/N), 1 <= k <= N. 
       n=1 
The inverse DFT (computed by IFFT) is given by 
       N 
    x(n) = (1/N) sum X(k)*exp(j*2*pi*(k-1)*(n-1)/N), 1 <= n <= N. 
       k=1 

참고 : FFT에 대한 문서에서 가우스 함수 상수의 Lx은 비례하여 X(k)을 증가시킵니다.

Paul R이 다시 말한 것처럼, 가상 주파수 차원으로 누출되는 신호는 DFT의 이산 형태로 인한 것입니다. Nx을 일정하게 유지하면서 Lx을 줄이면 실제 치수에 대한 피크 강도를 동일하게 유지하면서 스펙트럼을 비교하여 실제 치수에 대한 상대의 신호 양이 감소해야합니다.

비슷한 질문에 대한 답변은 herehere입니다.

+0

힌트를 가져 주셔서 감사합니다. 그러나 fftshift를 사용하여 x- 배열을 변경해야하는 이유는 아직도 이해할 수 없습니다. 조금 더 자세히 설명해 주시겠습니까? 나는 이것이 출력에서 ​​fftshift를 수행함으로써 제공된다고 생각했다. 왜 내 버전의 가우스가 x> 0에 효과적으로 집중되어 있습니까? –

+0

내가 가지고있는 다른 두 가지 문제의 이유에 대해 알고 있습니까? 나는 당신의 솔루션을 구현했습니다. 출력의 두 부분에서 진동을 고정하지만 허수 부는 여전히 0이 아닙니다. 또한 점의 수 Nx를 변경하면 실수 부분의 피크가 Nx에 비례하여 변경되는 동안 동일하게 유지됩니다. 왜 이런 생각이 들었습니까? –

+0

C++와 함께 사용할 때 FFTW로이 문제를 해결하는 방법을 알고 싶습니까? 나는 똑같은 불쾌한 진동을 얻는다. 해당 문제에 대한 mathworks- 참고 자료를 제공해 주시겠습니까? 나는 fft 루틴이 설명 된 페이지에 대해 언급하지 않았다. –