使用双线性方法 - MATLAB将低通滤波器应用于信号

时间:2014-12-26 22:12:21

标签: matlab filter fft frequency lowpass-filter

我有以下代码:

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])

关于怎么做的任何想法?

1 个答案:

答案 0 :(得分:2)

简答:

  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); 
    
  3. freqz的最佳使用方式:

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

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

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

    <强> Ouptut:

    此外,我们可以看到使用上述两种方法中的任何一种获得的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));
    

    enter image description here

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