Це питання також мене давно бентежить. @ hotpaw2 пояснення добре. Можливо, вам буде цікавий простий експеримент з використанням matlab.
https://poweidsplearningpath.blogspot.com/2019/04/dftidft.html
оновлена інформація.
Щоб перевірити цей факт простий, нам просто потрібно обережно спостерігати за спектром імпульсної реакції ідеального (?) Смугового фільтра, який просто нулює FFT-бункери. Чому потрібно додавати прислівник «обережно»? Якщо ми просто використовувати один і той же розмір FFT , щоб спостерігати реакцію імпульсу, ми будемо обмануті , як показано на рис 1 . Проте, якщо ми додамо порядок ДПФ при спостереженні вихідного фільтра, тобто доповнення нулями імпульсної характеристики, можна знайти так зване явище Гіббса, пульсації в частотної області, як показано на рис 2 .
Результати насправді є результатом віконного ефекту. Якщо ви хочете повністю зрозуміти проблему, зверніться до розділу 7.6 та глави 10.1-10.2 Біблії DSP (1). Підводячи підсумок, тут відзначаються три ключові моменти.
- Розмір вікна та порядок DFT (FFT) абсолютно незалежні. Не змішуйте їх разом.
- Властивості вікна (тип / розмір) переважають у формі DTFT. (напр., ширша головна доля призводить до ширшої перехідної смуги в частотній характеристиці.)
- DFT - це лише вибірка DTFT в частотній області. Більше того, чим вище порядок DFT, тим щільніше спектр DFT.
Отже, за допомогою більш щільного спектру на рис. 2 ми можемо побачити крізь маску ідеального (фальшивого) смугового фільтра.
Обманливо частота. Відповідь.
Явище Гіббса в Freq. Відповідь.
(1) Алан В. Оппенхайм та Рональд Ш. Шафер. 2009. Дискретна обробка сигналу часу (3-е видання). Пренсіс Холл Прес, Верхнє сідло, річка Нью-Джерсі, США.
fps = 15;
LPF = 1;
HPF = 2;
n = -511:512;
n0 = 0;
imp = (n==n0);
NyquistF = 1/2*fps;
%% Ideal BPF
tmp_N = 512;
tmp_n = 0:1:tmp_N-1;
freq = ( n .* fps) ./ tmp_N;
F = fft(imp, tmp_N);
F_bpf = IdealBandpassFilter(F, fps, LPF, HPF);
imp_rep =[real(ifft(F_bpf))'];
% Zero padding.
imp_rep2 =[zeros(1,2048) real(ifft(F_bpf))' zeros(1,2048)];
N = 2^nextpow2(length(imp_rep));
F = fft(imp_rep,N);
freq_step = fps/N;
freq = -fps/2:freq_step:fps/2-freq_step;
freq = freq(N/2+1:end)';
figure;
plot(freq,abs(F(1:N/2)));
xlabel('freq(Hz)');
ylabel('mag');
title('Mis leading Freq Response');
N = 2^nextpow2(length(imp_rep2));
F = fft(imp_rep2,N);
freq_step = fps/N;
freq = -fps/2:freq_step:fps/2-freq_step;
freq = freq(N/2+1:end)';
figure;
plot(freq,abs(F(1:N/2)));
xlabel('freq(Hz)');
ylabel('mag');
title('Zero Padding (DFT) with more points');
%% Function
function filered_signal = IdealBandpassFilter(input_signal, fs, w1, w2)
N = length(input_signal);
n = 0:1:N-1;
freq = ( n .* fs) ./ N;
filered_signal = zeros(N, 1);
for i = 1:N
if freq(i) > w1 & freq(i) < w2
filered_signal(i) = input_signal(i);
end
end
end