Matlab的freqz()函数和窗函数法fir1()一起使用

窗函数法设计FIRDF使用Matlab的fir1()函数十分方便,DSP课堂上已经讲过,此处不再赘述。关心的是:

使用         hn = fir1(M, wc);%M为滤波器阶数M,长度N, M = N-1;wc为截止频率

得到向量hn之后,如何用freqz表示?如何用hn去对目标序列滤波?

首先上matlab的help查freqz()函数:

大概意思就是说freqz是0~π的n点频率响应,hfilt是表示滤波器系数的向量。

而fir1()返回的hn是FIR的时域序列h(n)= hn(n+1)  n=0,1,2,.....

因为matlab的数组都是从1开始索引,但是时域序列h(n)是从n=0开始。

如果要画出h(n)的频响特性曲线, freqz(hn)或者freqz(hn,1)都是可以的,默认频谱是0~pi上的512点。没有返回值freqz()默认画图,长这样:

图中是宽51点Hamming窗设计,ωc=2π/9的FIR滤波器响应,从phase可以明显看出其线性相位。这样回答了第一个问题。

但是如果需要滤波, 1不是可有可无的。

[resp, w] = freqz(hn,1,1e4); %hn序列为分子系数,1为分母系数,resp为一万点幅频响应,w为(0~π)/10000

从FIR的系统函数考察:

分子系数即是hn,分母系数为1,如果不写一,会被当成分母系数是10000.。。。。

有了resp要求滤波就好办了,假如有一串时域序列,直接做FFT,注意FFT的点数和freqz需相同,然后将FFT后得到的频域序列绝对值与resp绝对值逐点相乘即可。

红色为滤波前,蓝色为滤波后,效果明显。


猜你喜欢

转载自blog.csdn.net/qq_41090341/article/details/80597585