2016-08-10 5 views
1

fft - 출력의 역 FFT를 수동으로 계산하려고합니다. 나는 먼저 fft을 사용하여 데이터 세트의 FFT를 계산하는 다음 스크립트를 사용하고 있습니다. 그런 다음 역 FFT를 수동으로 찾으려고 시도하지만 결과는 ifft과 유사하지 않습니다.수동으로 역 fft를 계산하십시오.

오류가 있습니까? 나는 단지

data = [ 
    -0.0005 
    -0.0004 
    -0.0003 
    -0.0002 
    -0.0001 
    -0.0000 
    0.0001 
    0.0001 
    0.0001 
    0.0002 
    0.0002 
    0.0002 
    0.0002 
    0.0002 
    0.0002 
    0.0002 
    0.0002 
    0.0002 
    0.0003 
    0.0004 
    0.0005 
    0.0006 
    0.0007 
    0.0009 
    0.0010 
    0.0011 
    0.0011 
    0.0012 
    0.0011 
    0.0011 
    0.0011 
    0.0010 
    0.0011]; 


delta = 0.0125; 
fs = 1/delta; 
x  = (0:1:length(data)-1)/fs; 

X=fft(data); 

%find fft 
N=length(data); 
ws = 2*pi/N; 
wnorm = -pi:ws:pi; 
wnorm = wnorm(1:length(x)); 
w = wnorm*fs; 
figure(2) 
plot(w/(2*pi),abs(fftshift(X))) 


%find inverse fft manually 
for m=1:length(X) 
    for k=1:length(data) 
     X_real(m) = X(k)*exp(i*k*ws*(m-1)); 
    end 
end 

figure(3) 
plot(1:length(data), abs(X_real), 1:length(data), ifft(X)) 
+1

우선,'m'마다 X_real (k)의'sum'을 놓치고 있습니다. 두 번째로,'exp '부분이 실제로 맞는지 확실하지 않습니다. – GameOfThrows

+1

Per @GameOfThrows는'X_real (m) = X_real (m) = X (k) * exp (i * k * ws * (m-1)); ('X_real'을 미리 배열 된 0의 배열로 초기화해야 할 수도 있습니다). –

답변

2

https://en.wikipedia.org/wiki/Fast_Fourier_transform#Definition_and_speed는 아래와 같이 루프 당신을 변경해주십시오의 FFT의 표준 역 공식은 여기에 제시된 사용하고 있습니다.

for m=1:length(X) 
    for k=1:length(data) 
     temp(k) = X(k)*exp(i*(m-1)*ws*(k-1)); 
    end 
    X_real(m)=(1/N)*sum(temp); 
end 

figure(3) 
plot(1:length(data), real(X_real)) 

ifft의 방정식은 here에서 찾을 수 있습니다.

두 가지를 놓쳤습니다.

한 가지는 정규화이고 다른 하나는 합산입니다.

+1

그리고 세 번째는'k-1' (단지''k''가 아니라 - 그들이 off-by-one 오류에 대해 말하는 것을 알고 있음)입니다. –

+0

@AhmedFasih 필자는'1..length (data)'에서'k '를 합산했지만'-0.5fs'에서'0.5fs'까지 실행되는'w/(2 * pi)'를 사용하여'FFT'' plot을 만듭니다. . 이 두 주파수 사이의 통신은 무엇입니까? ''0.25fs'에 해당하는 역행렬에 컴포넌트를 포함시키고 싶다면'k'는 무엇입니까? – BillyJean

+0

@BillyJean 저는 다음과 같이 주파수 벡터를 만듭니다 :'N = length (X_real); * 초당 * 사이클의 단위를 가진 f = (0 : N-1)/N * fs' (즉, 입력 신호가 초당 'fs'샘플에서 샘플링된다고 가정 할 때 Hz). 그러면'plot (f, abs (X_real))'이 정확하며'xlim (0, 0.25 * fs)'를 사용하여 한계를 설정할 수 있습니다. –

관련 문제