Это частично взят из 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
:
Однако, если, например, Fs = 30, L = 80
(не кратное), результат выглядит странно:
Является ли это поведение правильным? Почему это происходит и как я могу избежать этого? Просто выбросьте часть сигнала так, чтобы длина «соответствовала» частоте дискретизации?
Спасибо, что решает его. Тем не менее, я не понимаю, зачем нужна фазовая информация. Не могли бы вы подробнее рассказать об этом? Почему в некоторых случаях он работает правильно (кроме сдвига)? – Tobold
Проверьте определение 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
Спасибо! Теперь понятно: – Tobold