この質問は私を長い間混乱させてきました。@ hotpaw2の説明は良いです。matlabを使用した簡単な実験に興味があるかもしれません。
https://poweidsplearningpath.blogspot.com/2019/04/dftidft.html
更新された情報。
この事実が単純であることを確認するには、FFTビンをゼロにする理想的な(?)バンドパスフィルターのインパルス応答のスペクトルを注意深く観察する必要があります。副詞を「慎重に」追加する必要があるのはなぜですか?同じサイズのFFTを使用してインパルスの応答を観察すると、図1に示すように欺かれます。それでも、フィルターの出力を観察するときにDFTの次数、つまりインパルス応答のゼロパディングを追加すると、図2に示すように、周波数領域のリップルであるいわゆるギブス現象を見つけることができます。
実際の結果は、ウィンドウ効果によるものです。問題を完全に理解したい場合は、DSPの聖書の7.6章と10.1-10.2章を参照してください(1)。要約すると、3つの重要なポイントがここに記載されています。
- ウィンドウのサイズとDFT(FFT)の順序は完全に独立しています。一緒に混ぜないでください。
- ウィンドウのプロパティ(タイプ/サイズ)は、DTFTの形状を支配します。(例:メインローブが広くなると、周波数応答の過渡帯域が広くなります。)
- DFTは、周波数領域でのDTFTの単なるサンプリングです。さらに、DFTの次数が高いほど、DFTのスペクトルは密になります。
したがって、図2のより密なスペクトルの助けを借りて、理想的な(偽の)バンドパスフィルターのマスクを通して見ることができます。
偽りの頻度 応答。
Freqのギブス現象。応答。
(1)Alan V. OppenheimおよびRonald W. Schafer。2009.離散時間信号処理(第3版)。Prentice Hall Press、米国ニュージャージー州アッパーサドルリバー。
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