2012-06-11 2 views
5

Это частично взят из FFT-документации Matlab:FFT/IFFT: Частота дискретизации и длина сигнала

Fs = 30;     % Sampling frequency 
T = 1/Fs;     % Sample time 
L = 130;     % Length of signal 
t = (0:L-1)*T;    % Time vector 

x = sin(2*pi*1*t);   % 1 Hz sinus 

plot(real(ifft(abs(fft(x))))); % fft then ifft 

% Fs = 30, L = 60/90/120 ... : ok 
% Fs = 20, L = 60/80/100 ... : ok 
% Fs = 30, L = 50/70/80 ... : not ok 

Мне кажется, что всякий раз, когда длина сигнала является кратной частоте дискретизации, синусоида восстанавливается правильно (кроме некоторого сдвига), например здесь Fs = 30, L = 60:

enter image description here

Однако, если, например, Fs = 30, L = 80 (не кратное), результат выглядит странно:

enter image description here

Является ли это поведение правильным? Почему это происходит и как я могу избежать этого? Просто выбросьте часть сигнала так, чтобы длина «соответствовала» частоте дискретизации?

ответ

7

Когда вы используете abs (fft()) в ifft, вы используете только амплитуду сигнала и отбрасываете информацию о фазе, которая необходима.

Используйте весь сигнал (удален абс):

plot(real(ifft(fft(x)))); % fft then ifft 
+0

Спасибо, что решает его. Тем не менее, я не понимаю, зачем нужна фазовая информация. Не могли бы вы подробнее рассказать об этом? Почему в некоторых случаях он работает правильно (кроме сдвига)? – Tobold

+3

Проверьте определение fft (или dft). Частоты в результате fft (X) равны (Fs/2) * (0 ... (N/2) +1)/(N/2 + 1). Чтобы добраться до вашего синуса 1 Гц, вам нужно найти k такое, что (Fs/2) * k/(N/2 + 1) = 1, когда k является целым числом (круглое число), для представления не требуется фаза (задержка) 1 Гц, и это происходит, когда N/Fs (или L/Fs в вашем случае) является целым числом. Когда это не так, в выводе FFT нет 1 Гц, а алгоритм «представляет» 1 Гц в значении k, близком к 1 Гц плюс значение фазы, которое задерживает его до 1 Гц. Надеюсь, мое объяснение - это то, что ясно. :) – Ran

+0

Спасибо! Теперь понятно: – Tobold