我有以下代码:
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])
关于怎么做的任何想法?
答案 0 :(得分:2)
简答:
使用freqz
:您只获得滤波器的单侧频率响应,因此您只能在信号的单侧频谱x
上应用滤波器输出(滤波)信号o1
的单侧频谱:
z = freqz( b, a, N/2+1, Fs);
o1 = z' .* y(1:N/2+1);
使用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) ));
<强> 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));
P.S:在Matlab中查看FIR filtering overview可能很有用。