MATLAB中buttord的使用
我看网上很多对于buttord函数的使用都不太清楚,我也是doc了一些MATLAB里面的buttord函数才知道的。
前半段代码的解释
有一个很关键的问题是信号的采样频率是1kHz,但是在实际归一化的过程中使用的是500Hz。这个500Hz实际上是奎因斯特频率
其实大家看看时域采样定理就可以知道,Nyquist频率实际上是限带信号的原始最高频率,就是那个Wm/2*pi(角频率转化成频率)。所以采样信号频率的1/2是信号真正的最高频率,我们就是要对 0~这样一个频率 进行滤波。
150/500中的150是阻带中的某一个任意的频率(注意这里我的表述),然后我们定义了Rs=60dB(ripple stopband),意思就是我们把magnitude(大小,量级)下降了60分贝定义为到达这个任意频率,那150Hz就是下降到60dB对应的那个频率点。Rp=3dB(ripple passband),意思是我们在通带的时候,magnitude的波动最多是3dB。
也就是说:Ws并不是真实的截止频率,只是截止频率后面阻带上的某一个点
考虑一下截止频率的定义:下降3dB的点,那个Wn才是真正截止频率归一化以后的点。如果是带通或者带着的话,Wn就是一个范围
你用0.081*500=40.5192,这个频率非常接近我们给的0~40的范围。换句话来说40Hz是0dB下降的点,而40.5192就是3dB下降的点,就是真正的截止频率
如果你用的是理想滤波器,那0dB的点和3dB的点没有区别,因为是一条直线直接下来,而butterworth滤波器就是一个缓慢下降的过程。当然这里的n=5,其实已经很接近理想滤波器了,所以差别不大。
其实你仔细观察一下会发现,(Ws,Rs)其实只是滤波器曲线上的一个点,它的目的就是为了确定曲线的相关参数,当然也可以把这条曲线画出来。
如果你更改(Ws,Rs)这个点,让曲线变得平缓一些,那Wn就会相应的增大。
输出结果
后半段代码的解释
butter(n,Wn)就是生成一个n阶buttonworth滤波器,Wn是截止频率。z,p,k分别是zero,pole,gain 即零点,极点和增益。然后使用zp2sos (second-order sections)二阶部分 虽然我也不太理解是什么意思。
然后直接freqz()画图就可以了。512是default画图点数,如果取得少连续的曲线就会变成折线。1000是采样频率。