什么是巴特沃兹滤波器? 巴特沃斯滤波器是一种电子滤波器。巴特沃兹滤波器的特点是通带频率响应曲线最平滑。这种过滤器是由英国工程师StephenButterworth于1930年在英国期刊《无线电工程》上发表的一篇论文中首次提出的。巴特沃兹滤波器的振幅对角频率单调下降,是唯一一个振幅对角频率曲线无论阶数如何都保持相同形状的滤波器。巴特沃兹滤波器的特点是通带内的频率响应曲线最大程度的平坦,没有波动,但在阻带内逐渐降低到零。二阶巴特沃兹滤波器的衰减率为每倍频12 dB,三阶巴特沃兹滤波器的衰减率为每倍频18 dB,以此类推。 巴特沃兹滤波器特性 巴特沃兹滤波器的特点是通带内的频率响应曲线最大程度的平坦,没有波动,但在阻带内逐渐降低到零。在对数振幅对角频率的波特图上,从某个边界角频率开始,振幅随着角频率的增大而逐渐减小,并趋于负无穷大。 一阶巴特沃兹滤波器的衰减率为每倍频程6 dB,每十倍频程20 dB。二阶巴特沃兹滤波器的衰减率为每倍频12 dB,三阶巴特沃兹滤波器的衰减率为每倍频18 dB,以此类推。巴特沃斯滤波器的振幅对角频率。单调递减,也是唯一一个振幅对角频率曲线无论阶数如何都保持相同形状的滤波器。但是,滤波器阶数越高,阻带内的幅度衰减速度越快。其他滤波器的高阶幅度对角频率图和低阶幅度对角频率图形状不同。 巴特沃兹滤波原理 在用现代设计方法设计的滤波器中,巴特沃斯滤波器是最著名的滤波器。由于其设计简单,在性能上没有明显的缺点,并且其对于构成滤波器的元件的低Q值,易于制造并达到设计性能,因此其被广泛使用。其中,巴特沃斯滤波器的特点是通带频率响应曲线最平滑。 滤波器截止频率的转换是通过先求出待设计滤波器的截止频率与参考滤波器的截止频率的比值M,然后用这个M去除滤波器中的所有元素值来实现的。计算公式如下:M=待设计滤波器的截止频率/参考滤波器的截止频率。 滤波器特性阻抗的变换是这样实现的,首先求出待设计滤波器的特性阻抗与参考滤波器的特性阻抗之比k,然后将参考滤波器中的所有电感元件乘以这个k,将参考滤波器中的所有电容元件去掉这个k。 巴特沃兹滤波器与其他滤波器的比较 下图是巴特沃斯滤波器(左上)、第一切比雪夫滤波器(右上)、第二切比雪夫滤波器(左下)和同阶椭圆函数滤波器(右下)的频率响应图。 Tevos滤波器的优势 巴特沃兹滤波器的特点是通带内的频率响应曲线最大程度的平坦,没有波动,但在阻带内逐渐降低到零。在对数振幅对角频率的波动图上,从某个边界角频率开始,振幅随着角频率的增大而逐渐减小,并趋于负无穷大。 一阶巴特沃兹滤波器的衰减率为每倍频程6 dB,每十倍频程20 dB。二阶巴特沃兹滤波器的衰减率为每倍频12 dB,三阶巴特沃兹滤波器的衰减率为每倍频18 dB,以此类推。巴特沃兹滤波器的幅度对角频率单调下降,是唯一一个无论其阶数和幅度对角频率曲线如何都保持相同形状的滤波器。但是,滤波器阶数越高,阻带内的幅度衰减速度越快。其他滤波器的高阶幅度对角频率图和低阶幅度对角频率图形状不同。 巴特沃兹滤波器是一种滤波器的设计分类,类似于切比雪夫滤波器。它有高通、低通、带通、高通和带阻滤波器。在通带内外都具有稳定的幅频特性,但过渡带较长,容易造成失真。我在MATLAB中调用巴特沃兹滤波器进行仿真时,第一个周期信号总会有轻微的失真,但以后的幅频特性会很好。 巴特沃兹滤波器主要参数介绍 (1)[N,WC]=but ord(WP,ws,RP,As,' s ') 该格式用于计算巴特沃兹模拟滤波器的n阶和3db截止频率wc。Wp、ws、wc为实际模拟角频率(rad\s)。和Rp是通带最大衰减和最小衰减。 (2)[Z,P,k]=buttap(N) 该格式用于计算n阶巴特沃兹归一化模拟低通原型滤波器系统的函数的零点、极点和增益因子。返回长度为N的列向量Z和P,分别给出N个零点和极点的位置。k代表滤波器增益。 (3)Y=滤波器(b,a,x) 其中B代表系统传递函数的分子多项式的系数矩阵;表示系统传递函数的分母多项式的系数矩阵;x代表输入序列;Filter表示输出序列。IIR函数实现的直接形式。 (4)[b,a]=黄油(N,wc,' ftype ') 计算N阶巴特沃兹数字滤波器系统的函数的分子和分母多项式的系数向量B和A。 注:调用参数N和wc分别是巴特沃兹数字滤波器阶数和3dB截止频率的归一化值。一般调用buttord格式(1)计算N和wc。系数b和a按照z-1的升幂排列。 (5)[B,A]=butter(N,c,' ftype '' s ') 计算巴特沃兹模拟滤波器系统函数的分子和分母多项式系数向量。 注:调用参数n和 c分别是巴特沃兹模拟滤波器的阶数和3dB截止频率(实际角频率)。可以调用buttord(2 (2)格式计算n和 c,系数b和a按照s的正降序排列。 Tfype是过滤器的类型: 当ftype=高,高通;只有一个值。 ftype=stop,带阻;c=[cl,Cu],分别为带阻滤波器通带的3dB下截止频率和上截止频率。 ftype默认:如果 c只有一个值,默认为低通;如果 c有两个值,默认为带通;其通带频率区间为 cl cu。 (6)[H,w]=freqz(b,a,N) 和b分别是离散系统函数的分子和分母多项式的系数向量。返回量h包含离散系统频率响应在0 ~ pi范围内的n个频率平分线(其中n为正整数)的值,w包含该范围内的n个频率平分线。当调用缺省的n时,它的值是512。可以调用freqz()函数计算系统的频响,然后用abs()、angle()函数和plot()函数画出系统的频响曲线。 (7)lp2lp功能 [bt,at]=lp2lp(b,a,w0) 该功能用于实现低通模拟原型滤波器到低通滤波器的频率转换。可以通过传递函数和状态空间进行转换,但无论哪种形式,其输入都必须是模拟滤波器原型。 (8)[bz,az]=impinvar(b,a,fs) 将[b,a]模拟滤波器的传递函数模型转换为采样频率为fs的数字滤波器的传递函数模型[BZ,AZ]。如果功能中未确定频率fs,则功能默认为1Hz。 低通巴特沃兹数字滤波器示例 1.Matlab计算滤波器系数 Matlab计算巴特沃兹低通滤波器系数如下: 根据给定的通带截止频率、通带截止增益、阻带截止频率和阻带截止增益,利用buttord函数计算巴特沃斯滤波器的最小阶数和截止频率。(由于截止频率已在要求中给出,因此省略该步骤) (图片是网上拉的,索引和这个设计不一致) 根据计算出的阶数,使用buttap函数计算巴特沃兹滤波器原型。 使用lp2lp函数,将原型滤波器转换为具有目标截止频率的滤波器。 利用脉冲响应不变性(impinvar函数)或双线性变换(双线性函数)将模拟滤波器转换为数字滤波器。数字滤波器是Z域上的有理函数,分子分母系数就是滤波系数。 这里我选择脉冲响应不变方法,因为计算的滤波器比较简单,运算速度也比较快。 (从左至右:滤波器原型、模拟滤波器、数字滤波器) 设计过程matlab源代码如下: Fs=15%采样频率 Nn=12800 n=2;订单百分比 Wc=1 * 2 * pi%截止频率 [z,p,k]=buttap(N);%计算巴特沃兹过滤器原型 [Bap,Aap]=zp2tf(z,p,k);%进入多项式模式 [b,a]=lp2lp(Bap,Aap,Wc);%根据截止频率计算模拟巴特沃兹滤波器系数。 [bz,az]=impinvar(b,a,Fs);%采用脉冲响应不变性方法离散化。 图(1) [H,W]=freqz(bz,az,Nn,Fs);%绘制频率特性曲线。 子情节(2,1,1) plot(W,20 * log 10(ABS(H))); 格里登; 次要情节(2,1,2) 绘图(W,180/pi *展开(角度(H))); 格里登; 二、Matlab计算与验证 首先在Matlab中验证滤波功能。先写带噪声的输入函数,通过滤波函数后再观察滤波效果。过滤函数编写如下: 滤波器的函数内置于Matlab中,其算法为: 其中A是Z域传递函数的分母系数,B是分子系数。例如,在本应用中: 算法是az(1)* y(k)=BZ(1)* x(k)BZ(2)* x(k-1)-az(2)* y(k-1)-az(3)* y(k-2) 在Matlab中得到的结果如下(信号频率0.1Hz,噪声频率6Hz): c语言函数编译与验证 将上述算法翻译成C语言,写入单片机。信号源用于输出各种波形。单片机AD采样后,对采样点进行滤波,将原始数据和滤波后的数据送入上位机绘图。获得的图像比较如下: c函数源代码如下: constfloatbz[2]={0,0.128580115806658 };//分子 constfloatz[3]={ 1,-1.42252474659021,0.12584071 };//分母 float DATA _ Output[DATA _ LENTH];//输出数据 float * but _ filter(unsigned int len,float*x)//len是输入数据数组长度,x是输入数据数组指针。 { unsignedinTI=2; staTIcfloaTInit[2]={0,0 };//初始值,最初设置为0 If(len ” 2)//如果长度小于2,直接返回 returnData _输出; 数据输出[0]=初始化[0];//分配初始值 数据输出[1]=初始化[1]; for(I=2;我《len我) { Data _ Output[I]=BZ[0]* x[I]BZ[1]* x[I-1]-az[1]* Data _ Output[I-1]-az[2]* Data _ Output[I-2]; /*算法为a1 * y(k)=B1 * x(k)B2 * x(k-1)-a(2)* y(k-1)-a(3)* y(k-2)*/ /*因为a1=1,所以不做除法*/ } init[0]=Data _ Output[len-2];//考虑到会连续调用,这次的终值就是下次的初值。 init[1]=Data _ Output[len-1]; returnData _输出; } |
|