이 질문은 오랫동안 저를 혼란스럽게했습니다. @ hotpaw2의 설명이 좋습니다. matlab을 사용한 간단한 실험에 관심이있을 수 있습니다.
https://poweidsplearningpath.blogspot.com/2019/04/dftidft.html
업데이트 된 정보.
이 사실이 단순하다는 것을 확인하기 위해 FFT 빈을 0으로 만드는 이상적인 (?) 대역 통과 필터의 임펄스 응답 스펙트럼을주의 깊게 관찰하면됩니다. 부사를 "신중하게"추가해야하는 이유는 무엇입니까? 임펄스의 응답을 관찰하기 위해 동일한 크기의 FFT를 사용하면 그림 1 과 같이 속 입니다. 그럼에도 불구하고, 필터의 출력을 관찰 할 때, 즉 임펄스 응답을 0으로 채울 때 DFT 순서를 추가하면 그림 2 와 같이 소위 Gibbs 현상, 주파수 영역의 리플을 찾을 수 있습니다 .
실제로 결과는 윈도우 효과에서 비롯됩니다. 문제를 완전히 이해하려면 DSP (1) 성경의 7.6 장과 10.1-10.2 장을 참조하십시오. 요약하면 여기에 세 가지 핵심 사항이 있습니다.
- 창의 크기와 DFT (FFT)의 순서는 완전히 독립적입니다. 함께 섞지 마십시오.
- 창 속성 (유형 / 크기)이 DTFT의 모양을 지배합니다. (예 : 주 로브가 넓을수록 주파수 응답에서 과도 대역이 넓어집니다.)
- DFT는 주파수 영역에서 DTFT의 샘플링 일뿐입니다. 또한, DFT의 차수가 높을수록 DFT의 스펙트럼은 더 밀도가 높다.
따라서 그림 2 의 밀도가 높은 스펙트럼을 통해 이상적인 (가짜) 대역 통과 필터 마스크를 볼 수 있습니다.
결정적으로 Freq. 응답.
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