2016-08-10 3 views
1

Я пытаюсь вычислить обратный БПФ fft -output вручную. Я использую следующий скрипт, который сначала использует fft для вычисления БПФ набора данных. Затем я пытаюсь найти обратный БПФ вручную, но он не похож на результат, который я получаю от ifft.вычислить обратный fft вручную

Можете ли вы определить мою ошибку? Я просто с помощью стандартной обратной формулы БПФ, представленный здесь, https://en.wikipedia.org/wiki/Fast_Fourier_transform#Definition_and_speed

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

Прежде всего, вам не хватает 'sum' вашего X_real (k) для каждого' m', во-вторых, я не уверен, что часть вашего 'exp' на самом деле правильная. – GameOfThrows

+1

Per @GameOfThrows изменить 'X_real (m) = X (k) * exp (i * k * ws * (m-1));' to 'X_real (m) = X_real (m) + X (k) * exp (i * k * ws * (m-1)); '(вам может потребоваться инициализировать' X_real' до массива нулей раньше времени). –

ответ

2

изменить свой Пожалуйста, цикл, как показано ниже.

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)) 

Вы можете найти уравнение ОБПФ в MATLAB, here.

Вы пропустили две вещи.

Одна вещь нормализация, другой - суммирование.

+1

И третий был 'k-1' (а не только' k'-вы знаете, что они говорят об ошибках «один за другим»). –

+0

@AhmedFasih Я суммирую 'k' из' 1..length (data) ', но график' FFT' I использует 'w/(2 * pi)', который работает от '-0.5fs' до' 0.5fs' , Каково соответствие между этими двумя частотами? Скажем, я хочу включить только компоненты в обратном, соответствующие '<0,25fs' графика, что соответствует' k'? – BillyJean

+0

@BillyJean Я делаю свои частотные векторы следующим образом: 'N = length (X_real); f = (0: N-1)/N * fs', который имеет единицы * циклов в секунду * (т. е. Гц, при условии, что ваш входной сигнал отбирается на выборках 'fs' в секунду). Тогда 'plot (f, abs (X_real)) будет правильным, и вы можете сделать' xlim (0, 0.25 * fs) 'для установки пределов. –

Смежные вопросы