Impulse Response of a Filter
조회 수: 3 (최근 30일)
이전 댓글 표시
I am trying to get the impulse response of a filter in a gammatone filterbank. For a filter (in the gammatone filterbank) the impulse response has to decay over time. But I am not getting that and I am unsure what I am doing in coreectly. Thank you for your time!
fs = 16e3;
t = 0:(1/fs):1;
numFilts=32;
range=[50 8000];
gammaFiltBank = gammatoneFilterBank(range,numFilts);
%fvtool(gammaFiltBank)
input_signal = sin(2*pi*100*t) + sin(2*pi*300*t);
%output_signal = gammatoneFilterBank(gammaFiltBank, input_signal);
output_signal = gammaFiltBank(input_signal);
output_signal = squeeze(output_signal);
%Display a Filter's Output
figure
filter_number=10;
plot(t,output_signal(filter_number,:)) %10th filter output
title('Output of Filter', num2str(filter_number))
% Impulse signal
impulse_signal = zeros(size(t));
impulse_signal(1) = 1;
%Display a Filter's Output of Impulse
output_signal2=gammaFiltBank(impulse_signal);
output_signal2 = squeeze(output_signal2);
figure
plot(t,output_signal2(10,:)) %10th filter output
title('Impulse Output of Filter', num2str(filter_number))
댓글 수: 0
채택된 답변
Drew
2024년 1월 17일
편집: Drew
2024년 1월 17일
The problem in your code is that the input signal should be a column vector, that is, Nx1. When that is done, there is no need for the "squeeze" statements.
When you input a row vector of size 1x16001 to the gammaFiltBank in the line "output_signal = gammaFiltBank(input_signal)", that row vector gets interpreted as a matrix with 16001 independent channels, where each channel has a signal length of just one sample. When each input signal has only one sample, then each output signal only has one sample of output, and that is why there is no "tail" visible in the impulse response.
To fix this, convert inputs to column vector, remove "squeeze" functions, and fix the order of the indexing into the output_signal and output_signal2. Your slightly modified code is below, and the plots are as expected.
fs = 16e3;
% t = 0:(1/fs):1;
t = 0:(1/fs):0.05; % focus on first 50 ms of output, rather than 1 second.
%% Important
t=t(:); % ensure t is a column vector
numFilts=32;
range=[50 8000];
gammaFiltBank = gammatoneFilterBank(range,numFilts);
% Sum of sinusoids input
input_signal = sin(2*pi*100*t) + sin(2*pi*300*t); % This is column vector now that t is
output_signal = gammaFiltBank(input_signal);
% output_signal = squeeze(output_signal); % not needed
% Display a Filter's Output
figure
filter_number=10;
% plot(t,output_signal(filter_number,:)) % need to fix indexing
% Need to reverse indices of output_signal, now that input_signal was column vector
plot(t,output_signal(:, filter_number)) %10th filter output
title('Output of Filter', num2str(filter_number))
% Impulse signal
impulse_signal = zeros(size(t)); % This is column vector because t is
impulse_signal(1) = 1;
% Display a Filter's Output of Impulse (impulse response)
reset(gammaFiltBank); % Important to reset after previous signal
output_signal2=gammaFiltBank(impulse_signal);
% output_signal2 = squeeze(output_signal2); % not needed.
figure
% plot(t,output_signal2(10,:)) % need to fix indexing as in line below
% Need to reverse indices of output_signal, now that input_signal was column vector
plot(t,output_signal2(:,10))
title('Impulse Output of Filter', num2str(filter_number))
If this answer helps you, please remember to accept the answer.
추가 답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 Filter Design에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!