Plotting a filter as a function of cyclic frequency using freqz()
4 ビュー (過去 30 日間)
古いコメントを表示
Hello,
I'm trying to graph a moving average filter's magnitude response as a function of cyclic frequency. However, when I use freqz(), my plots do not look correct. Here's my code currently:
clear;close all;
fs = 200; %sampling frequency
Ts = 1/200; %sampling time
t = 0:Ts:1;
x = sin(2*pi*2*t) + sin(2*pi*10*t) + sin(2*pi*90*t); %signal
figure(1)
plot(t,x); %unfiltered signal
title('Signal with 2, 10, and 90 Hz');
xlabel('time (s)');
%Difference equation of Hanning Moving Average filter:
yn = zeros(size(t));
ind = 3:length(t);
yn(ind) = (0.25*x(ind)) + (0.5*x(ind-1)) + (0.25*x(ind-2));
%Attempt at creating the moving average equation.
figure(2)
plot(t,yn)
title("Hanning Moving Average")
%Me just plotting the filtered Hanning Moving Average plot with
%freqz():
figure(10)
freqz(yn)
Both the magnitude (dB) and the phase seem to show a lot of sound, but the plot of figure 2 does not. Any help will be appreciated.
0 件のコメント
採用された回答
Star Strider
2021 年 5 月 8 日
Your approach is correct. The reason the freqz plot did not look correct is that you were passing the filtered signal to it, not the filter coefficients themselves. This approach creates the filter separately, then uses the filter function to filter the signal (since that is essentially what the original ‘yn’ did). The only significant difference is that, and passing the filter coefficients to freqz.
Try this —
fs = 200; %sampling frequency
Ts = 1/200; %sampling time
t = 0:Ts:1;
x = sin(2*pi*2*t) + sin(2*pi*10*t) + sin(2*pi*90*t); %signal
figure(1)
plot(t,x); %unfiltered signal
title('Signal with 2, 10, and 90 Hz');
xlabel('time (s)');
%Difference equation of Hanning Moving Average filter:
yn = zeros(size(t));
ind = 3:length(t);
y = [0.25 0.5 0.25]; % Separate Vector Of Filter Coefficients
yn = filter(y, sum(y), x); % Filter Signal
%Attempt at creating the moving average equation.
figure(2)
plot(t,yn)
title("Hanning Moving Average")
%Me just plotting the filtered Hanning Moving Average plot with
%freqz():
figure(10)
freqz(y,1, 2^16, fs)
The freqz plot now looks correct, displaying the Bode plot of a lowpass filter with a cutoff of about 50 Hz.
In order to see that in detail, after the freqz plot, temporaily add:
set(subplot(2,1,1),'XLim',[0 60])
set(subplot(2,1,2),'XLim',[0 60])
in order to see the -6 dB frequency (at 50 Hz), denoting the filter stopband.
3 件のコメント
Star Strider
2021 年 5 月 8 日
As always, my pleasure!
It’s the length of the fft. (A longer fft adds detail.)
その他の回答 (0 件)
参考
カテゴリ
Help Center および File Exchange で Digital Filter Analysis についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!