【问题标题】:Applying Low-Pass filter to a signal with the Bilinear Method - MATLAB使用双线性方法对信号应用低通滤波器 - MATLAB
【发布时间】:2014-12-26 22:12:20
【问题描述】:

我有以下代码:

Fs = 8000;                    % Sampling frequency
T = 1/Fs;                     % Sample time
N=512;                        % Length of signal
t = (0:N-1)*T;                % Time vector


% Sum of a 1kHz sinusoid and a 2.5kHz sinusoid
x1=4*sin(2*pi*1000*t);
x2=sin(2*pi*2500*t); 
x=x1+x2;

% Frequency spectrum
y=fft(x);
fx = Fs/2*linspace(0,1,N/2+1);
plot(fx,2*abs(y(1:N/2+1))) 

我想对该信号使用以下低通滤波器:

[B A]=lp2lp([1],[1 1], 1.069*10^4)
[b a]=bilinear(B,A,Fs)
z=freqz(b,a,512,Fs);
axis ([0 Fs/2 -20 1])

有什么想法吗?

【问题讨论】:

  • @PacificStickler 我很抱歉,最近没有打开我的浏览器,但是是的,这很有帮助,谢谢你的帮助 :)

标签: matlab filter fft frequency lowpass-filter


【解决方案1】:

简答:

  1. 使用freqz:你只能得到滤波器的单面频率响应,因此你只能在信号的单面频谱上应用滤波器,x得到单面频谱输出(过滤)信号o1

    z = freqz( b, a, N/2+1, Fs);
    o1 = z' .* y(1:N/2+1);
    
  2. 使用filter:如果您的唯一目标是应用之前找到的过滤器,则可以使用freqz 绕过:

    o2 = filter( b, a, x); 
    

优化使用freqz

freqz 在给定传递函数系数的情况下返回滤波器的频率响应,如mathworks 所述。最好在不返回值的情况下使用它,在这种情况下,它会自动绘制频谱右半部分到采样频率一半的幅度和相位响应。

我们可以验证在没有返回值的情况下调用freqz 命令绘制的频率响应的幅度与使用以下代码绘制的响应等效:

h = freqz(b,a,N/2+1,Fs);
plot( fx, 20*log10( abs(h) ));

输出:

此外,我们可以看到,使用上述两种方法中的任何一种获得的bilinear 滤波器对原始信号的频率响应y 的影响是完全等效的:

subplot(2,2,[1 2]); plot( fx, 2*abs( y(1:N/2+1))); ylim([0,2000]);
subplot(2,2,3); plot( fx, 2*abs( o2(1:N/2+1)));
subplot(2,2,4); plot( fx, 2*abs( o1));

P.S:在 Matlab 中查看 FIR filtering overview 可能会有用。

【讨论】:

  • 哦,好的,我明白了,很抱歉下一个问题,但为什么两个冲动都会出现?频率为 1k 的应该是唯一出现的?
  • 这是因为您的过滤器的性质。您可以从freqz 生成的频率响应中看到,2.5k 频率仅衰减了大约 7dB,因此您仍然可以在 2.5k 处看到一些脉冲。然而,低通滤波器已经完成了它的工作,因为 1k 到 2.5k 处的峰值比率从 4 增加到 8.5。您可以通过拉入传递函数的极点来进一步增加阻尼比。例如[B A]=lp2lp([1],[1 .75], 1.069*10^4) 相对于 1k 频率将 2.5k 频率的幅度响应衰减 10.5 倍。
猜你喜欢
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
  • 2011-02-15
  • 2016-02-29
相关资源
最近更新 更多