butter函数
(2010-11-18 14:35:00) 转载
▼
分类: MATLAB
说明
巴特沃斯滤波器设计
语法
[z,p,k]=butter(n,Wn) [z,p,k] = butter(n,Wn,'ftype')
[b,a]=butter(n,Wn) [b,a]=butter(n,Wn,
'ftype')
[A,B,C,D]=butter(n,Wn)
[A,B,C,D] = butter(n,Wn,'ftype') [z,p,k]=butter(n,Wn,'s')
[z,p,k] = butter(n,Wn,'ftype','s') [b,a]=butter(n,Wn,'s')
[b,a]=butter(n,Wn,'ftype','s') [A,B,C,D]=butter(n,Wn,'s')
[A,B,C,D] = butter(n,Wn,'ftype','s')
描述
butter 用来设计低通、带通、高通、和带阻数字和模拟的巴特沃斯滤波器。巴特沃斯滤波器的特征是通带内幅度响应最大
平坦,且整体上是单调的。
巴特沃斯滤波器牺牲了在通带和阻带内的单调衰减陡度。除非需要巴特沃斯滤波器的平滑性,椭圆或切比雪夫滤波器可以用更小的滤波器阶数获得更陡峭的衰减特性。
数字域
[z,p,k] = butter(n,Wn) 设计一个阶数为n,归一化截止频率为Wn的低通数字巴特沃斯滤波器。此函数用n列
的向量z和p返回零点和极点,以及用标量k返回增益。 [z,p,k] = butter(n,Wn,
'ftype') 设计一个高通、低通或带阻滤波器,字符串'ftype'取值是:
'high' 用于设计归一化截止频率为Wn的高通数字滤波器 'low' 用于设计归一化截止频率为Wn的低通数字滤波器
'stop' 用于设计阶数为2*n的带阻数字滤波器,Wn应该是有两个元素的向量Wn=[w1 w2]。阻带是w1 < ω 处的的频率。对巴特沃斯滤波器,归一化截止频率Wn必须是介于0和1之间的数,这里的1截止频率 是幅度响应为
对应于尼奎斯特频率,即每秒π弧度(π rad/s)。
如果Wn是含有两个元素的向量,Wn=[w1 w2],butter 返回阶数为 2*n的数字带通滤波器,通频带为w1 < ω 注意 参考下面的 了解关于影响形成传输函数的数值问题。[b,a] = butter(n,Wn) 设计一个阶为n,归一化截止频率为Wn的数字低通巴特沃斯滤波器。它返回滤波器系数
在长度为n+1的行向量b和a中,这两个向量包含z的降幂系数。
[b,a] = butter(n,Wn,'ftype') 设计一个高通、低通或带阻滤波器,字符串'ftype' 是上面描述的'high'、'low'、或 'stop'。
要获得状态空间形式,使用下面所示的4个输出参数:
[A,B,C,D] = butter(n,Wn) 或
[A,B,C,D] = butter(n,Wn,'
ftype') 其中 A、 B,、C,、和D 是
并且u是输入, x是状态向量, y 是输出。
模拟域
[z,p,k] = butter(n,Wn,'s') 设计一个阶n,截止角频率为Wn rad/s的模拟低通巴特沃斯滤波器。它返回零点和极点在长n或2*n的列向量z和p中,标量k返回增益。butter的截止角频率Wn必须大于0 rad/s。
如果Wn是有两个元素w1ftype','s') 通过使用上面描述的ftype 值可以设计一个高通、低通或带阻滤波器。只要返回不同数量的输出参数,butter 可以直接地获得其它的模拟滤波器实现。要获得传输函数形式,使用如下所示的两个输出参数:
[b,a] = butter(n,Wn,'s') 设计一个阶n、截止角频率为Wn rad/s的模拟低通巴特沃斯滤波器。它返回滤波器的
系数在长n+1的行向量b和a中,这两个向量包含下面这个传输函数中s的降幂系数:
[b,a] = butter(n,Wn,'ftype','s') 通过设置上面描述的ftype 值,可以设计一个高通、低通或带阻
滤波器。
要获得状态空间形式,使用下面的四个参数:
[A,B,C,D] = butter(n,Wn,'s') 或
[A,B,C,D] = butter(n,Wn,'
ftype','s') 其中A、 B、 C、和D 是
并且u 作为输入, x 是状态向量, y 是输出。
举例
高通滤波器
对于1000Hz的采样,设计一个9阶高通巴特沃斯滤波器,截止频率300Hz,相应的归一化值为0.6:
[z,p,k] = butter(9,300/500,'high');
[sos,g] = zp2sos(z,p,k); % 转换为二次分式表示形式 Hd = dfilt.df2tsos(sos,g); % 创建dfilt对象 h = fvtool(Hd); % 绘制幅度响应 set(h,'Analysis','freq') % 显示频率响应
通常,你应该使用[z,p,k] 语法来设计IIR滤波器。要分析或实现你的滤波器,那你可以用[z,p,k]输出调用的
zp2sos 以及一个二次分式dfilt结构。更高阶的滤波器(可能开始于8阶) ,当用[b,a]语法形成传输函数时,或
许会由于舍入误差而发生数值问题。下面的例子说明了这个局限性: n = 6;
Wn = [2.5e6 29e6]/500e6; ftype = 'bandpass';
% 传输函数设计 [b,a] = butter(n,Wn,ftype);
h1=dfilt.df2(b,a); % 这是一个不稳定滤波器
% 零点-极点-增益 设计 [z, p, k] = butter(n,Wn,ftype); [sos,g]=zp2sos(z,p,k);
h2=dfilt.df2sos(sos,g);
% 绘制并比较结果
hfvt=fvtool(h1,h2,'FrequencyScale','log'); legend(hfvt,'TF Design','ZPK Design')
算法
butter 使用五步算法:
1. 2. 3. 4.
用buttap 查找模拟低通原型极点、零点和增益。 转换极点、零点和增益到状态空间形式。
使用状态空间变换,将低通滤波器变换为具有期望的截止频率的带通、高通、带阻滤波器。
对于数字滤波器设计,butter 使用bilinear函数通过具有频率预畸变的双线性变换将模拟滤波器变换为数字滤波器。精心的频率调整保证模拟滤波器和数字滤波器在Wn或w1和w2处有相同的频率响应幅度。 5.
它将状态空间滤波器转换回所需的传输函数或 零点-极点-增益 形式。