通过状态变量计算IIR 滤波器的输出
常用二阶IIR滤波器系数计算方法
常用二阶IIR滤波器系数计算方法IIR滤波器是无限冲击响应滤波器优点:1.采用模拟原型滤波的标准设计,容易理解。
2.可以用低阶设计实现,并且可以高速运行3.对于相同公差设计方案,其阶数比FIR短。
4.可以采用闭环设计缺点:1.非线性相位2.可能会出现极限环3.多频道设计困难,只能设计低通、高通和带通4.反馈会引入不稳定5.非常难得到高速流水线设计IIR滤波器可以模拟4类原型滤波器:ButterWorth、ChebyShevI、ChebyShevII、椭圆。
典型的二阶滤波器函数公式:H(Z)=(b0+b1*Z^-1+b2*Z^-2)/(a0+a1*Z^-1+a2*Z^-2);典型理想IIR输出公式:Y(n)={b0x(n)+b1x(n-1)+...+bmx(n-m)}-{a1x(n-1)+a2x(n-2)+...+amx(n-m)}对于二阶IIR滤波器,输出公式Y(n)=b0xn+b1xn-1+b2xn-2-(a1xn-1+a2xn-2) 式1式1中a1,a2,b0,b1,b2是二阶滤波器IIR系数,其决定滤波器的频率响应曲线以及增益。
对于一个二阶IIR滤波器,标准的技术指标如下:1. 中心频率f0;2. 采样频率fs;3. 增益db;4. 品质因数;根据上面技术指标,可以确定二阶IIR滤波的低通,带通或高通的系数根据上面的技术指标,可以确定以下几个通用计算量:A=sqrt[10^(db/20)];Omega=2*Pi*f0/fs;sin=sin(omega);cons=cos(omega);alpha=sin(2*Q);所以二阶IIR高通滤波器系数的计算:b0=(1+cos)/2;b1=-(1+cos);b2=(1+cos)/2;a0=1+alpha;a2=1-alpha;二阶IIR低通滤波器系数的计算: b0=(1-cos)/2;b1=1-cos;b2=(1-cos)/2;a0=1+alpha;a1=-2*cos;a2=1-alpha;二阶IIR带通滤波器的系数的计算: b0=sin/2=Q*alhpa;b1=0;b2=-sin/2=-Q*alpha;a0=1+alpha;a1=-2*cos;a2=1-alpha;。
基于MATLAB的IIR数字滤波器设计与仿真
基于MATLAB的IIR数字滤波器设计与仿真一、概述在现代数字信号处理领域中,数字滤波器扮演着至关重要的角色。
其通过对输入信号的特定频率成分进行增强或抑制,实现对信号的有效处理。
无限脉冲响应(IIR)数字滤波器因其设计灵活、实现简单且性能优良等特点,得到了广泛的应用。
本文旨在基于MATLAB平台,对IIR数字滤波器的设计与仿真进行深入研究,以期为相关领域的研究与应用提供有益的参考。
IIR数字滤波器具有无限长的单位脉冲响应,这使得其在处理信号时能够展现出优秀的性能。
与有限脉冲响应(FIR)滤波器相比,IIR滤波器在实现相同性能时所需的阶数更低,从而减少了计算复杂度和存储空间。
在需要对信号进行高效处理的场合,IIR滤波器具有显著的优势。
MATLAB作为一款功能强大的数学软件,提供了丰富的函数和工具箱,使得数字滤波器的设计与仿真变得简单而高效。
通过MATLAB,我们可以方便地实现IIR滤波器的设计、分析和优化,从而满足不同应用场景的需求。
本文将首先介绍IIR数字滤波器的基本原理和特性,然后详细阐述基于MATLAB的IIR数字滤波器的设计方法和步骤。
接着,我们将通过仿真实验验证所设计滤波器的性能,并对其结果进行分析和讨论。
本文将总结IIR数字滤波器设计与仿真的关键技术和注意事项,为相关领域的研究人员和工程师提供有益的参考和启示。
1. IIR数字滤波器概述IIR(Infinite Impulse Response)数字滤波器是数字信号处理中常用的一类滤波器,它基于差分方程实现信号的滤波处理。
与FIR (Finite Impulse Response)滤波器不同,IIR滤波器具有无限长的单位脉冲响应,这意味着其输出不仅与当前和过去的输入信号有关,还与过去的输出信号有关。
这种特性使得IIR滤波器在实现相同的滤波效果时,通常具有更低的计算复杂度,从而提高了处理效率。
IIR滤波器的设计灵活多样,可以根据不同的需求实现低通、高通、带通和带阻等多种滤波功能。
FIR滤波器和IIR滤波器原理及实现
FIR滤波器和IIR滤波器原理及实现FIR和IIR滤波器是数字信号处理中常用的滤波器类型,用于从输入信号中提取或抑制特定频率成分。
它们分别基于有限脉冲响应(FIR)和无限脉冲响应(IIR)的原理设计而成。
下面将分别介绍FIR和IIR滤波器的原理及实现方式。
一、FIR滤波器H(z)=b0+b1•z^(-1)+b2•z^(-2)+...+bM•z^(-M)其中,b0、b1、..、bM是FIR滤波器的系数,M为滤波器的阶数。
1.确定滤波器的设计要求,包括通带和阻带的边界频率、通带和阻带的衰减要求等。
2.根据设计要求,选择合适的滤波器设计方法,如FIR滤波器可以通过窗函数设计、频率采样法设计等。
3.根据设计方法计算得到滤波器的系数,即b0、b1、..、bM。
4.将计算得到的系数应用到差分方程中,实现滤波器。
5.将输入信号通过差分方程进行滤波处理,得到输出信号。
二、IIR滤波器IIR滤波器是一种具有无限长度的单位脉冲响应的滤波器,它具有反馈回路,可以实现对信号频率的持续平滑。
IIR滤波器的离散时间系统函数可以表示为:H(z)=[b0+b1•z^(-1)+b2•z^(-2)+...+bM•z^(-M)]/[1+a1•z^(-1)+a2•z^(-2)+...+aN•z^(-N)]其中,b0、b1、..、bM和a1、a2、..、aN分别为IIR滤波器的前向和反馈系数,M和N分别为前向和反馈滤波器的阶数。
实现IIR滤波器的步骤如下:1.确定滤波器的设计要求,选择合适的滤波器类型(低通、高通、带通、带阻等)。
2.根据设计要求,选择合适的设计方法(脉冲响应不变法、双线性变换法等)。
3.根据设计方法计算得到滤波器的系数,即b0、b1、..、bM和a1、a2、..、aN。
4.将计算得到的系数应用到差分方程中,实现IIR滤波器。
5.将输入信号通过差分方程进行滤波处理,得到输出信号。
IIR滤波器的优点是可以实现较窄的通带和截止频率,具有良好的频率响应特性,但由于反馈回路的存在,容易出现稳定性问题,设计和实现相对较为复杂。
第40章ARM官方DSP库IIR滤波器的实现(STM32)
/**< Points to the array of state coefficients. The array is of length 4*numStages. */
float32_t *pState;
/**< Points to the array of coefficients. The array is of length 5*numStages. */
转换方法,点击 Edit->Convert Structure,界面如下,这里我们选择第一项,并点击 OK:
转换好以后再点击 File-Export,第一项选择 Coefficient File(ASCII):
2015年01月15日
版本:1.0
第 7 页 共 28 页
安富莱电子
版本:1.0
第 10 页 共 28 页
安富莱电子
UM403 STM32-V5 开发板系统篇手册
1. 参数 pCoeffs 指向滤波因数,滤波因数数组长度为 numTaps。但要注意 pCoeffs 指向的滤波因数应 该按照如下的顺序进行排列: {b10, b11, b12, a11, a12, b20, b21, b22, a21, a22, ...} 先放第一个二阶 Biquad 系数,然后放第二个,以此类推。
const arm_biquad_casd_df1_inst_f32 * S,
float32_t * pSrc,
float32_t * pDst,
uint32_t blockSize)
参数定义:
[in] *S
points to an instance of the floating-point Biquad cascade structure.
iir滤波c语言
iir滤波c语言IIR滤波(Infinite Impulse Response Filter)是一种数字滤波器,常用于信号处理和实时系统中。
本文将介绍IIR滤波器的基本原理、设计方法以及在C语言中的实现。
一、IIR滤波器的基本原理IIR滤波器是一种反馈滤波器,其输出不仅与当前的输入值有关,还与过去的输入值和输出值有关。
它的基本原理是通过将输入信号与滤波器的传递函数进行卷积运算,得到滤波器的输出信号。
二、IIR滤波器的设计方法1. 频率响应设计方法:通过设定所需的频率响应曲线,设计出相应的传递函数来实现滤波器。
常用的设计方法有巴特沃斯(Butterworth)滤波器、切比雪夫(Chebyshev)滤波器和椭圆(Elliptic)滤波器等。
2. 零极点设计方法:通过设定零点和极点的位置来设计滤波器的传递函数。
常用的设计方法有双线性变换法、脉冲响应不变法和双正交变换法等。
三、IIR滤波器的C语言实现在C语言中,可以通过差分方程的形式来实现IIR滤波器。
差分方程描述了滤波器的输入输出关系,可以用递归的方式计算滤波器的输出。
以下是一个简单的IIR滤波器的C语言实现示例:```ctypedef struct {float a[ORDER+1]; // 系数a的数组float b[ORDER+1]; // 系数b的数组float x[ORDER+1]; // 输入信号的数组float y[ORDER+1]; // 输出信号的数组}IIRFilter;void IIRFilter_Init(IIRFilter *filter) {int i;for(i = 0; i <= ORDER; i++) {filter->a[i] = 0.0;filter->b[i] = 0.0;filter->x[i] = 0.0;filter->y[i] = 0.0;}}float IIRFilter_Process(IIRFilter *filter, float input) { int i;float output = 0.0;for(i = ORDER; i >= 1; i--) {filter->x[i] = filter->x[i-1];filter->y[i] = filter->y[i-1];}filter->x[0] = input;for(i = 0; i <= ORDER; i++) {output += filter->b[i] * filter->x[i];output -= filter->a[i] * filter->y[i];}filter->y[0] = output;return output;}```在以上代码中,IIRFilter结构体定义了滤波器的系数和状态变量,IIRFilter_Init函数用于初始化滤波器,IIRFilter_Process函数用于处理输入信号并返回输出信号。
IIR滤波FIR滤波及维纳滤波简介、程序及仿真结果
IIR 滤波器、FIR 滤波器与维纳滤波器所谓数字滤波器,是指输入、输出均为数字信号,通过一定运算关系改变输入信号所含频率成分的相对比例或者滤除某些频率成分的器件。
数字滤波器从实现的网络结构或者从单位脉冲响应分类,可以分为无限脉冲响应(IIR )滤波器和有限脉冲响应(FIR )滤波器。
它们的系统函数分别为:1.1n N n z n h z H --=∑=10)()( 1.21.1中的H(z)成为N 阶IIR 滤波器,1.2中的H(z)称为(N-1)阶FIR 滤波器函数,这两种类型的设计方法有很大的区别。
IIR 数字滤波器的设计既可以从模拟滤波器的设计入手来进行,也可以直接利用指标参数,通过调用滤波器设计子程序或函数来进行。
可以利用脉冲响应不变法来设计IIR 数字低通滤波器,按照技术要求设计一个模拟低通滤波器,得到模拟低通滤波器的传输函数,再按一定的转换关系将传输函数转换成数字低通滤波器的系统函数H(z)。
设模拟滤波器的传输函数是s H a (),相应的单位冲激响应是)(t h a ,对)(t h a 进行等间隔采样,采样间隔为T ,得到)(nT h a ,将h(n)= )(nT h a 作为数字滤波器的单位取样响应,那么数字滤波器的系统函数便是h(n)的z 变换,因此脉冲响应不变法是一种时域上的转换方法,它使h(n)在采样点上等于)(t h a∑=-=Ni iia s s A s H 1)( 1.3 ∑=--=Ni T s iz eA z H i 111)( 1.4 将s H a ()在s 平面上沿虚轴按照周期2pi/T 延括后,再按标准映射关系sT e z =,映射到z 平面上,就得到了H(z)。
脉冲响应不变法的优点是频率坐标变化时线性的,如果不考虑频率混叠现象,用这种方法设计的数字滤波器会很好的重现模拟滤波器的频率特性。
以下为用matlab 仿真的一个IIR 低通滤波器: % IIR Lowpass Use Butterworth % copyright by Etual clear;fs=20;fpass=4;fstop=5;∑∑=-=--=Nk kk Mk k k z a z b z H 101)(Ap=0.5;As=10;wp=2*pi*fpass/fs;ws=2*pi*fstop/fs;omegap=tan(wp/2);omegas=tan(ws/2);ep=sqrt(10^(Ap/10)-1);es=sqrt(10^(As/10)-1);N=ceil(log(es/ep)/log(omegas/omegap));omega0=omegap/ep^(1/N);K=floor(N/2);for i=1:Ktheta(i)=pi*(N-1+2*i)/(2*N);endfor i=1:KG(i)=omega0^2/(1-2*omega0*cos(theta(i))+omega0^2);endfor i=1:Ka1(i)=2*(omega0^2-1)/(1-2*omega0*cos(theta(i))+omega0^2);endfor i=1:Ka2(i)=(1+2*omega0*cos(theta(i))+omega0^2)/(1-2*omega0*cos(theta(i))+omeg a0^2);endif K<(N/2)G0=omega0/(omega0+1);a0=(omega0-1)/(omega0+1);endw=0:pi/300:pi;Hw2=1./(1+(tan(w/2)/omega0).^(2*N));plot(w/pi,Hw2);grid;图一IIR滤波器频谱图IIR数字滤波器能保留一些典型模拟滤波器优良的幅度特性,但设计中只考虑了幅度特性,没考虑相位特性,所设计的滤波器相位特性一般是非线性的。
实验三IIR数字滤波器设计及软件实现
实验三IIR数字滤波器设计及软件实现IIR数字滤波器是一种常见的数字滤波器类型,它可以实现对信号的频率响应进行调整和改变,常用于信号处理和通信系统中。
本实验将介绍IIR数字滤波器的设计方法和软件实现。
设计一个IIR数字滤波器的一般步骤如下:1.确定滤波器的类型:低通滤波器、高通滤波器、带通滤波器或带阻滤波器。
2.确定滤波器的阶数:阶数决定了滤波器的复杂程度和性能。
3.确定滤波器的截止频率:截止频率决定了滤波器对信号的频率响应的影响。
4.根据滤波器类型和截止频率的要求,选择适当的滤波器设计方法:脉冲响应不变法、双线性变换法等。
5.根据滤波器设计方法,计算出滤波器的系数:系数决定了滤波器的频率响应和性能。
6.实现滤波器的差分方程:将滤波器的系数代入差分方程中,得到滤波器的离散时间域表示。
7. 使用合适的软件工具进行滤波器的软件实现和仿真:可以使用MATLAB、Python等编程语言进行滤波器设计和实现。
在软件实现过程中,通常可以通过以下步骤来实现IIR数字滤波器:1.定义滤波器的参数和输入信号:定义滤波器的类型、阶数、截止频率等参数,并读取输入信号。
2.计算滤波器的系数:根据设计方法和参数,计算滤波器的系数。
3.实现滤波器的差分方程:根据滤波器的差分方程,使用循环结构来实现滤波器的运算。
4.输入信号进入滤波器:将输入信号输入滤波器,进行滤波处理。
5.输出滤波后的信号:获取滤波器的输出结果,并进行处理和显示。
需要注意的是,IIR数字滤波器的设计和实现需要对信号处理和数字滤波器的基本原理有一定的了解,并且需要根据实际需求选择合适的设计方法和参数。
参考资料:2. Zhu, Y., & Buck, J. (2024). VLSI signal processing. John Wiley & Sons.。
实验五实验报告IIR数字滤波器设计与滤波
实验五实验报告IIR数字滤波器设计与滤波一、实验目的1.学习并掌握实时数字滤波器的设计方法。
2.通过实验了解并熟悉IIR数字滤波器在信号处理中的应用。
二、实验仪器与材料1.计算机。
2.MATLAB软件。
三、实验原理IIR数字滤波器是指带有反馈环的数字滤波器,它的输出不仅与当前的输入有关,还与前一次输入和前一次输出有关。
IIR滤波器具有较好的频率特性和相位特性,但设计起来比FIR滤波器要复杂一些。
IIR数字滤波器可以通过两种方式进行设计:直接法和间接法。
1.直接法:直接法根据滤波器系统的模拟原型和差分方程,在频域或者时域推导出滤波器的差分方程,然后在模拟域设计,将结果转换为数字域。
2.间接法:间接法主要是通过一些理论计算公式或者一些图形方法来设计。
四、实验步骤1.设计IIR数字滤波器的模拟原型:选择合适的滤波器类型(低通、高通、带通等)、阶数、截止频率等参数。
2.将模拟原型滤波器变换为数字滤波器:利用模拟频率变换公式或者双线性变换公式将模拟原型滤波器变换为数字滤波器。
3.模拟滤波器设计:根据所需的滤波器特性,在MATLAB中设计出模拟滤波器。
4.数字滤波器设计:利用前面设计的模拟滤波器的参数,在MATLAB 中进行数字滤波器的设计。
5.信号滤波:将需要滤波的信号输入到设计好的IIR数字滤波器中进行滤波处理。
6.分析滤波后的信号:利用相关的工具对滤波后的信号进行频域和时域分析,观察滤波效果。
五、实验结果与分析根据实验步骤,在MATLAB中利用IIR数字滤波器设计方法,设计出了一个低通滤波器。
使用该滤波器对一个输入信号进行滤波处理,得到了滤波后的输出信号。
对滤波后的信号进行频域和时域分析,可以观察到滤波器成功地去除了输入信号中的高频成分,得到了较为平滑的输出信号。
滤波后的信号在时域上更加平稳,频域上的高频成分被滤波器去除。
六、实验总结通过本次实验,我学习并掌握了IIR数字滤波器的设计方法,并了解了滤波器在信号处理中的应用。
常用二阶 IIR 滤波器系数计算方法
常用二阶 IIR 滤波器系数计算方法滤波器品质因数,用滤波器的中心频率F(单位HZ)与-3dB带宽B(单位HZ)的比值来表达,,即Q=F/B,描述了滤波器分离信号中相邻频率成分能力。
品质因数Q越大,表明滤波器的分辨能力越高。
IIR 滤波器是无限冲击响应滤波器优点:1.采用模拟原型滤波的标准设计,容易理解。
2.可以用低阶设计实现,并且可以高速运行3.对于相同公差设计方案,其阶数比FIR短。
4.可以采用闭环设计缺点:1.非线性相位2.可能会出现极限环3.多频道设计困难,只能设计低通、高通和带通4.反馈会引入不稳定5.非常难得到高速流水线设计IIR滤波器可以模拟 4 类原型滤波器:ButterWorth、ChebyShevI、ChebyShevII、椭圆。
典型的二阶滤波器函数公式:H(Z)=(b0+b1*Z^-1+b2*Z^-2)/(a0+a1*Z^-1+a2*Z^-2);典型理想 IIR 输出公式:Y(n)={b0x(n)+b1x(n-1)+...+bmx(n-m)}-{a1x(n-1)+a2x(n-2)+...+amx(n-m)}对于二阶 IIR 滤波器,输出公式Y(n)=b0xn+b1xn-1+b2xn-2-(a1xn-1+a2xn-2) (1)式(1) 中 a1,a2,b0,b1,b2 是二阶滤波器 IIR 系数,其决定滤波器的频率响应曲线以及增益。
对于一个二阶 IIR 滤波器,标准的技术指标如下:1. 中心频率 f0;2. 采样频率 fs;3. 增益 db;4. 品质因数;根据上面技术指标,可以确定二阶 IIR 滤波的低通,带通或高通的系数根据上面的技术指标,可以确定以下几个通用计算量:A=sqrt[10^(db/20)];Omega=2*Pi*f0/fs;sin=sin(omega);cons=cos(omega);alpha=sin(2*Q);所以二阶 IIR 高通滤波器系数的计算:b0=(1+cos)/2;b1=-(1+cos);b2=(1+cos)/2;a0=1+alpha;a2=1-alpha;二阶 IIR 低通滤波器系数的计算b0=(1-cos)/2;b1=1-cos;b2=(1-cos)/2;a0=1+alpha;a1=-2*cos;a2=1-alpha;二阶 IIR 带通滤波器的系数的计算:b0=sin/2=Q*alhpa;b1=0;b2=-sin/2=-Q*alpha;a0=1+alpha;a1=-2*cos;a2=1-alpha;。
iir数字滤波器的数学公式
iir数字滤波器的数学公式IIR数字滤波器的数学公式IIR数字滤波器是一种常用的数字信号处理器件,它可以对输入信号进行滤波处理,实现信号的去噪、频率选择等功能。
IIR数字滤波器的数学公式描述了其滤波特性,是理解和设计该滤波器的基础。
IIR数字滤波器的数学公式为:$y[n] = \sum_{k=0}^{N} b_k \cdot x[n-k] - \sum_{k=1}^{M} a_k \cdot y[n-k]$其中,$x[n]$是输入信号序列,$y[n]$是输出信号序列。
$b_k$和$a_k$是滤波器的系数,$N$是前向系数的个数,$M$是反馈系数的个数。
这个公式可以看作是一个差分方程,描述了当前时刻输出信号$y[n]$与过去时刻输入信号$x[n-k]$和输出信号$y[n-k]$之间的关系。
前向系数$b_k$和反馈系数$a_k$决定了滤波器的频率响应特性。
在设计IIR数字滤波器时,需要确定滤波器的阶数和系数。
阶数决定了滤波器的复杂度和性能,系数决定了滤波器的频率响应特性。
常见的IIR数字滤波器包括低通滤波器、高通滤波器、带通滤波器和带阻滤波器。
它们的数学公式可以通过调整系数来实现不同的频率响应。
在实际应用中,可以使用不同的方法来设计IIR数字滤波器的系数,比如脉冲响应不变法、双线性变换法等。
这些方法可以根据滤波器的频率响应要求和系统性能要求来确定最优的系数。
IIR数字滤波器还有一些重要的特性,比如稳定性、相位响应和群延迟等。
稳定性是指滤波器的输出不会无限增长,相位响应描述了信号在滤波器中的延迟和相位变化,群延迟描述了信号通过滤波器时的延迟变化。
总结起来,IIR数字滤波器的数学公式描述了其滤波特性,是设计和理解该滤波器的基础。
通过调整系数和选择合适的设计方法,可以实现滤波器的频率响应要求和系统性能要求。
在实际应用中,还需要考虑滤波器的稳定性、相位响应和群延迟等特性。
通过合理设计和使用IIR数字滤波器,可以实现信号的去噪、频率选择等信号处理功能。
二阶iir滤波器
二阶IIR滤波器在信号处理领域,滤波器是一种用来去除或增强信号特定频率成分的重要工具。
其中,IIR滤波器是一种常用的数字滤波器,其特点是具有无限长的单位脉冲响应(Infinite Impulse Response)。
本文将重点介绍二阶IIR滤波器的原理和应用。
二阶IIR滤波器概述二阶IIR滤波器是一种常见的数字滤波器类型,由两个级联的一阶IIR滤波器组成。
每个一阶IIR滤波器由两个系数和一个延迟器构成,其中系数用于调节滤波器的响应特性,延迟器则用于存储过去的输入和输出值。
通过多个级联的一阶滤波器,可以构建出高阶的IIR滤波器,但二阶IIR滤波器通常已经能够满足大多数信号处理的需求。
二阶IIR滤波器的实现二阶IIR滤波器的实现可以通过直接形式(Direct Form)或级联形式(Cascade Form)来完成。
在直接形式中,每个一阶IIR滤波器都有自己的状态变量,计算复杂度相对较高。
而在级联形式中,多个一阶滤波器共享状态变量,计算效率更高。
通常情况下,级联形式更为常用。
二阶IIR滤波器的性能二阶IIR滤波器相比一阶滤波器具有更加灵活的频率响应特性,能够实现更为复杂的滤波效果。
通过适当选择系数,二阶IIR滤波器可以实现低通、高通、带通和带阻等各种滤波功能。
同时,由于其具有无限长的单位脉冲响应,可以实现更长的滤波器长度和更陡的滤波特性。
二阶IIR滤波器在实际应用中的示例二阶IIR滤波器在实际应用中具有广泛的用途。
例如,音频信号处理中常用的音频均衡器就是基于IIR滤波器实现的,通过调节滤波器参数可以实现对声音频率特性的调整。
另外,在生物医学信号处理领域,二阶IIR滤波器也被广泛用于心电图(ECG)信号的滤波和分析。
总结二阶IIR滤波器作为一种常见的数字滤波器类型,在信号处理领域具有重要的地位。
通过合理选择滤波器参数和结构,可以实现多种滤波效果,满足不同应用场景的需求。
在实际应用中,二阶IIR滤波器的高效性和灵活性为信号处理工程师提供了有力的工具,帮助他们处理和分析各种类型的信号。
IIR滤波器的原理与设计方法
IIR滤波器的原理与设计方法IIR(Infinite Impulse Response)滤波器是一种数字滤波器,其具有无限冲激响应的特点。
与FIR(Finite Impulse Response)滤波器相比,IIR滤波器具有更高的效率和更窄的频带特性。
本文将介绍IIR滤波器的原理和设计方法。
一、IIR滤波器的原理IIR滤波器是通过对输入信号和输出信号之间的差异进行递归运算而实现滤波的。
其核心原理是利用差分方程来描述滤波器的行为。
IIR滤波器可以被表达为如下形式:y[n] = b₀x[n] + b₁x[n-1] + ... + bₘx[n-ₘ] - a₁y[n-1] - ... - aₘy[n-ₘ]其中,x[n]表示输入信号的当前采样值,y[n]表示输出信号的当前采样值,a₁,...,aₘ和b₀,...,bₘ是滤波器的系数。
二、IIR滤波器的设计方法设计IIR滤波器需要确定滤波器的阶数、截止频率和系数等参数,以下介绍一种常用的设计方法:巴特沃斯滤波器设计方法。
1. 确定滤波器阶数滤波器的阶数决定了滤波器的复杂度和频率响应的形状。
阶数越高,频率响应越陡峭。
根据需要的滤波效果和计算复杂度,选择适当的滤波器阶数。
2. 确定截止频率截止频率是滤波器在频域上的边界,用于确定滤波器的通带和阻带。
根据信号的频谱分析以及滤波器的应用要求,确定合适的截止频率。
3. 求解滤波器系数根据巴特沃斯滤波器的设计方法,可以采用双线性变换、频率抽样和极点放置等技术求解滤波器的系数。
具体方法比较复杂,需要使用专业的滤波器设计软件或者数字信号处理工具包进行计算。
4. 评估设计结果设计完成后,需要评估滤波器的性能指标,如频率响应、相位响应、群延迟等。
可以通过频域分析和时域仿真等方法来评估滤波器的设计效果。
三、结论IIR滤波器是一种常用的数字滤波器,其具有无限冲激响应的特点。
通过对输入信号和输出信号进行递归运算,可以实现滤波效果。
设计IIR滤波器需要确定滤波器的阶数、截止频率和系数等参数,并通过专业的设计方法进行求解。
IIR滤波器的设计和实现
IIR滤波器的设计和实现摘要目前IIR滤波器的设计方法主要有两种,数模转换法和计算机辅助设计法。
数模转化法就是借助模拟滤波器进行设计。
先按照数字滤波器的设计指标得到模拟滤波器的系统函数,再通过一定的转换方式将其转换为数字滤波器。
而计算机辅助设计法就是将滤波器系数作为要求解的未知数,根据设计指标设联立方程,最终求解得出滤波器系数。
在IIR滤波器的设计当中,使用PSO算法能简化步骤。
种群中每个粒子的位置都是每一组滤波器系数解,而适应函数则是该系数所代表的滤波器幅频响应和理想滤波器之间的均方差之和。
这样适应函数越小,滤波器越接近设计目标。
经过多次迭代,我们求得的全局最佳值即是最好的一组滤波器系数。
关键词:IIR滤波器,双线性转换法,脉冲响应不变法,巴特沃兹滤波器,粒子群优化算法Design and implementation of IIR filterAbstractAt present, there are mainly two methods of IIR filter design, DAC and CAD. The analog to digital conversion method is designed by means of analog filter. First, according to the design index of the digital filter, the system function of the analog filter is obtained, and then converted to digital filter through a certain conversion mode. The computer aided design method is to use the filter coefficient as the unknowns of the required solution, and set up a joint equation according to the design index. Finally, the filter coefficient is obtained.In the design of IIR filter, the PSO algorithm can simplify the steps. The position of each particle in the population is the filter coefficient solution for each group, while the adaptive function is the sum of the amplitude frequency response of the filter and the mean square variance between the ideal filter. The smaller the adaptive function, the closer the filter is to the design target. After many iterations, the best global value is the best set of filter coefficients.Keywords:IIR filter,Bilinear transformation method,impulse invariance,butterworth,PSO目录摘要 (1)Abstract (2)第一章绪论 (4)1.1 研究数字滤波器的背景 (4)1.1.1 数字滤波器 (4)1.1.2 IIR滤波器 (4)1.2 国内外研究现状 (5)1.3 本文的研究内容 (5)第二章采纳数模转换法设计IIR滤波器 (6)2.1 IIR滤波器的简介 (6)2.1.1 IIR滤波器的特性 (6)2.1.2 IIR滤波器的结构 (7)2.1.3 模拟滤波器的特性 (10)2.2 采纳双线性变换法设计IIR滤波器 (11)2.2.1 双线性变换法的基本原理 (11)2.2.2 基于双线性变换法的IIR滤波器设计实例 (13)2.3 采纳脉冲响应不变法设计IIR滤波器 (13)2.3.1 脉冲响应不变法的基本原理 (13)2.3.2 基于脉冲响应不变法的IIR滤波器设计实例 (15)2.4 本章小结 (15)第三章基于PSO算法设计IIR滤波器 (16)3.1 粒子群优化算法 (16)3.1.1 PSO算法的进展 (16)3.1.2 PSO算法的基本原理 (16)3.2 IIR滤波器设计的PSO算法 (18)3.2.1设计原理 (18)3.2.2设计实例 (19)3.3 本章小结 (20)结论 (21)参考文献 (22)致谢 (23)第一章绪论1.1 研究数字滤波器的背景1.1.1 数字滤波器现代社会中,人们的日常生活越来越数字化,越来越多的数字信号需要处理。
手把手教系列之IIR滤波器设计
⼿把⼿教系列之IIR滤波器设计[导读]:在嵌⼊式系统中经常需要采集模拟信号,采集模拟信号的信号链中难免引⼊⼲扰,那么如何滤除⼲扰呢?今天就来个⼀步⼀步描述如何设计部署⼀个IIR滤波器到你的系统。
何为IIR滤波器?⽆限冲激响应(IIR: Infinite Impulse Response)是⼀种适⽤于许多线性时不变系统的属性,这些系统的特征是具有⼀个冲激响应h(t),该冲激响应h(t)不会在特定点上完全变为零,⽽是⽆限期地持续。
这与有限冲激响应(FIR: Finite Impulse Response)系统形成对⽐,在有限冲激响应(FIR)系统中,对于某个有限T,在时间t> T时,冲激响应确实恰好变为零。
线性时不变系统的常见⽰例是⼤多数电⼦和数字滤波器。
具有此属性的系统称为IIR系统或IIR滤波器。
这是常见的教科书式数学严谨定义,很多⼈看到这⼀下就蒙了,能说⼈话吗?线性时不变系统理论俗称LTI系统理论,源⾃应⽤数学,直接在核磁共振频谱学、地震学、电路、信号处理和控制理论等技术领域运⽤。
它研究的是线性、⾮时变系统对任意输⼊信号的响应。
虽然这些系统的轨迹通常会随时间变化(例如声学波形)来测量和跟踪,但是应⽤到图像处理和场论时,LTI系统在空间维度上也有轨迹。
因此,这些系统也被称为线性⾮时变平移,在最⼀般的范围理论给出此理论。
在离散(即采样)系统中对应的术语是线性⾮时变平移系统。
由电阻、电容、电感组成的电路是LTI系统的⼀个很好的例⼦。
⽐如⼀个运放系统在⼀定频带范围内满⾜信号的时域叠加,输⼊⼀个100Hz和200Hz正弦信号,输出频率是这两种信号的线性叠加。
⽤数学对LTI系统描述:线性:输⼊x_1(t),产⽣响应y_1(t),⽽输⼊x_2(t),产⽣响应y_2(t),那么缩放和加和输⼊a_1x_1(t)+a_2x_2(t),产⽣缩放、加和的响应a_1y_1(t)+a_2y_2(t),其中a_1和a_2是标量,对于任意的有:输⼊\sum_{k=0}^{N}a_kx_k(t),产⽣响应\sum_{k=0}^{N}a_ky_k(t)时不变性:指如果将系统的输⼊信号延迟\tau秒,那么得到的输出响应也相应延时\tau秒。
iir低通滤波器的算法
IIR低通滤波器的算法涉及以下步骤:
1. 确定滤波器的阶数N和3-db截频Wc。
阶数N可以根据所需的滤波效果和采样率来确定,3-db截频Wc可以根据通带截止频率的归一化值Wp和阻带截止频率的归一化值Ws来确定。
2. 确定模拟Butterworth滤波器的零点、极点和增益函数。
3. 通过公式计算IIR滤波器的输出数据。
IIR滤波器的输出与输入数据以及之前的输入和输出数据有关。
具体地,y[n]=x[n]+x[n-1]+0.59*y[n-1],其中y[n]表示本次滤波的输出数据,x[n]表示本次滤波的输入数据,x[n-1]表示上一次滤波前的输入数据,y[n-1]表示上一次滤波器输出的数据。
以上信息仅供参考,可以查阅与IIR低通滤波器算法相关的专业书籍或者咨询技术人员。
二阶滤波器计算公式
二阶滤波器计算公式二阶滤波器是一种常见的电子滤波器,用于信号处理和滤波应用中,能够对输入信号进行频率响应调整。
二阶滤波器的计算公式可以通过两种不同的方法获得,分别是基于RC电路的激励响应计算和基于差分方程的转移函数计算。
1.基于RC电路的激励响应计算公式:激励响应是指输入信号通过滤波器后的输出响应。
对于二阶滤波器,其激励响应的计算公式可以表示为:H(z)=(b0+b1*z^-1+b2*z^-2)/(1+a1*z^-1+a2*z^-2)其中,H(z)为滤波器的传递函数,z为复数变量表示的滤波器的复频域变量。
b0、b1、b2、a1和a2分别是滤波器的系数,需要根据滤波器类型和所需响应进行计算。
2.基于差分方程的转移函数计算公式:差分方程是一种以递归形式表示滤波器的线性常微分方程。
对于二阶滤波器,其差分方程可以表示为:y(n)=b0*x(n)+b1*x(n-1)+b2*x(n-2)-a1*y(n-1)-a2*y(n-2)其中,y(n)为滤波器的输出,x(n)为滤波器的输入,b0、b1、b2、a1和a2为滤波器的系数,需要根据滤波器类型和所需响应进行计算。
差分方程可以通过Z变换转换为滤波器的传递函数。
Z变换是一种将离散时间信号转换为复频域变量的数学变换。
对于二阶滤波器,Z变换的转移函数计算公式可以表示为:H(z)=Y(z)/X(z)=(b0+b1*z^-1+b2*z^-2)/(1+a1*z^-1+a2*z^-2)其中,X(z)和Y(z)分别表示输入和输出信号在Z域中的变换。
总结:二阶滤波器的计算公式可以根据滤波器的类型(如低通、高通、带通等)和所需的频率响应来确定。
上述提到的两种计算方法,可以分别通过电路元件数值计算和差分方程转移函数计算来获得滤波器的传递函数。
这些公式提供了计算滤波器系数和传递函数的基础,可以通过它们来设计和实现二阶滤波器。
IIR数字滤波器的原理及设计
Ωc 是截止频率;当0≤Ω<Ωc时;|HajΩ|2 =1;是通带;当 Ω>Ωc时;|HajΩ|2 =0;是阻带 图6 1中的实的曲线表示一 个实际的模拟低通滤波器的平方幅度特性;我们的设计工 作就是要用近似特性来尽可能地逼近理想特性 通常采用 的典型逼近有Butterworth逼近 Chebyshev逼近和Cauer 逼近也叫椭圆逼近〕
第一种方法的算法简单 设计粗糙;在这里不具体讨论了; 第三种方法所涉及的内容很多;并且需要最优化理论作为 基础;因此在本章中只能作简要介绍;本章将着重讨论用 得最多的第二种方法
6 1 3 借助于模拟滤波器的理论和方法的设计原理 利用模拟滤波器来设计数字滤波器;要先根据滤波器的性
能指标设计出相应的模拟滤波器的系统函数Has;然后由 Has经变换而得到所需要的数字滤波器的系统函数Hz 常用 的变换方法有冲激响应不变法和双线性变换法
6 2 1 Butterworth低通滤波特性的逼近
对于Butterworth滤波器有:
|Ha(j )|21[1( c)2N]
64
满足此平方幅度特性的滤波器又叫做B型滤波器 这里N为
正整数;为B 型滤波器的阶次;为截止频率
6 2 1 1 B型滤波特性 1 最平坦函数 B型滤波器的幅频特性是随增大而单调下降的 在
6 65
对上式进行z变换;便得到数字滤波器的系统函数:
N
Hz hnzn Ts AkesknTsunTs zn
n
n k1
Ts N Ak e z skTs 1 n k1 n0
Ts
N
Ak
k11eskTs
通过状态变量计算IIR 滤波器的输出
通过状态变量计算IIR 系统的输出教材第四章已经介绍了IIR 系统的直接型结构。
这里再简单地回顾这种结构,然后阐述编程方法。
数字系统的系统函数可以写为]11][[)()()(100∑∑=-=--==Mk kk Mk k k z a z b H z X z Y z H )()(210z H z H H = (1)式中,子系统∑=-=Mk kk zb z H 01)( (2)由系统函数的零点决定。
而子系统 ∑=--=Mk kk z a Z H 1211)( (3)则由系统函数的极点决定。
式(5)中,)(1z H 写在)(2Z H 的左边,表示先实现零点,后实现极点。
这样的结构称为IIR 系统的直接形式Ⅰ。
图1示出这种结构),(33==M N ,框中标出用于编程的状态变量,详见下文。
图1 IIR 系统的直接形式Ⅰ),(33==M N对于线性时不变系统来说,上述两个子系统的次序可以调换,即)()()(120z H z H H z H = (4) 这时,先实现系统的极点,后实现零点。
对应于式(4)的结构示于图2。
合并图中的延迟支路即得图3。
这样的结构称为IIR 系统的直接形式Ⅱ,又名典范形式、正准型。
IIR 直接形式通常是指直接Ⅱ型。
直接Ⅱ型有以下特点:(1) 所需要的延时单元最少。
(2) 系统调整不方便(调整任何一个系数都会影响全部零、极点) (3) 受有限字长影响大。
图2 与图1等价的结构图3 IIR 系统的直接形式Ⅱ),(33==M N根据给定的系统结构和输入序列,怎样列出差分方程,求出输出序列? 下面给出的程序有助于读者掌握这种方法。
这个程序计算图1所示IIR 直接形式Ⅰ的输出序列,演示状态变量的用法。
通过编程来实现数字网络时,最好在网络中设定状态变量。
所谓状态变量就是状态节点变量。
一个网络有许多节点,但不都是状态变量节点。
状态变量是一组根据已知输入和初始状态,可以计算出输出信号及系统内部任意节点变量值的最少节点变量。
IIR滤波器系数的计算
IIR滤波器系数的计算IIR滤波器是无限冲击响应滤波器,其优点:1. 采用模拟原型滤波的标准设计,容易理解。
2. 可以用低阶设计实现,并且可以高速运行3. 对于相同公差设计方案,其阶数比FIR短。
4. 可以采用闭环设计其缺点:1. 非线性相位2. 可能会出现极限环3. 多频道设计困难,只能设计低通、高通和带通4. 反馈会引入不稳定5. 非常难得到高速流水线设计IIR滤波器可以模拟4类原型滤波器:ButterWorth、ChebyShevI、ChebyShevII、椭圆。
典型的二阶滤波器函数公式:H(Z)=(b0+b1*Z^-1+b2*Z^-2)/(a0+a1*Z^-1+a2*Z^-2);典型理想IIR输出公式:Y(n)={b0x(n)+b1x(n-1)+...+bmx(n-m)}-{a1x(n-1)+a2x(n-2)+...+amx(n-m)}对于二阶IIR滤波器,输出公式Y(n)=b0xn+b1xn-1+b2xn-2-(a1xn-1+a2xn-2) 式1式1中a1,a2,b0,b1,b2是二阶滤波器IIR系数,其决定滤波器的频响应曲线以及增益。
如何求a0,a1,a2,b0,b1,b2?对于一个二阶IIR滤波器,标准的技术指标如下:1. 中心频率f0;(中心频率: 通常定义为带通滤波器(或带阻滤波器)的两个3 dB点之间的中点,一般用两个3 dB点的算术平均来表示。
其实低通和高通滤波器也有中心频率只不过它的定义和带通就不一样了,它就等于我们通常说的截止频率,但我们在说低通高通时,都是用截止频率,而几乎不用其中心频率。
不过在做归一化时就会有这个概念了。
那时可以看到,低通高通的归一化截止频率=截止频率/中心频率=1. )2. 采样频率fs;3. 增益db;4. 品质因数;根据上面技术指标,可以确定二阶IIR滤波的低通,带通或高通的系数根据上面的技术指标,可以确定以下几个通用计算量:A=sqrt[10^(db/20)];Omega=2*Pi*f0/fs;sin=sin(omega);cons=cos(omega);alpha=sin(2*Q);所以二阶IIR高通滤波器系数的计算:b0=(1+cos)/2;b1=-(1+cos);b2=(1+cos)/2;a0=1+alpha;a2=1-alpha;二阶IIR低通滤波器系数的计算:b0=(1-cos)/2;b1=1-cos;b2=(1-cos)/2;a0=1+alpha;a1=-2*cos;a2=1-alpha;二阶IIR带通滤波器的系数的计算:b0=sin/2=Q*alhpa;b1=0;b2=-sin/2=-Q*alpha; a0=1+alpha;a1=-2*cos;a2=1-alpha;。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
通过状态变量计算IIR 系统的输出教材第四章已经介绍了IIR 系统的直接型结构。
这里再简单地回顾这种结构,然后阐述编程方法。
数字系统的系统函数可以写为]11][[)()()(100∑∑=-=--==Mk kk Mk k k z a z b H z X z Y z H )()(210z H z H H = (1)式中,子系统∑=-=Mk kk zb z H 01)( (2)由系统函数的零点决定。
而子系统 ∑=--=Mk kk z a Z H 1211)( (3)则由系统函数的极点决定。
式(5)中,)(1z H 写在)(2Z H 的左边,表示先实现零点,后实现极点。
这样的结构称为IIR 系统的直接形式Ⅰ。
图1示出这种结构),(33==M N ,框中标出用于编程的状态变量,详见下文。
图1 IIR 系统的直接形式Ⅰ),(33==M N对于线性时不变系统来说,上述两个子系统的次序可以调换,即)()()(120z H z H H z H = (4) 这时,先实现系统的极点,后实现零点。
对应于式(4)的结构示于图2。
合并图中的延迟支路即得图3。
这样的结构称为IIR 系统的直接形式Ⅱ,又名典范形式、正准型。
IIR 直接形式通常是指直接Ⅱ型。
直接Ⅱ型有以下特点:(1) 所需要的延时单元最少。
(2) 系统调整不方便(调整任何一个系数都会影响全部零、极点) (3) 受有限字长影响大。
图2 与图1等价的结构图3 IIR 系统的直接形式Ⅱ),(33==M N根据给定的系统结构和输入序列,怎样列出差分方程,求出输出序列? 下面给出的程序有助于读者掌握这种方法。
这个程序计算图1所示IIR 直接形式Ⅰ的输出序列,演示状态变量的用法。
通过编程来实现数字网络时,最好在网络中设定状态变量。
所谓状态变量就是状态节点变量。
一个网络有许多节点,但不都是状态变量节点。
状态变量是一组根据已知输入和初始状态,可以计算出输出信号及系统内部任意节点变量值的最少节点变量。
图1设定7个状态变量,即)2(~)0(),3(~)0(v v u u 。
下面给出用C 语言编写的函数dir1,。
调用这个函数可以实现图1所示IIR 直接形式Ⅰ。
函数dir1的参数意义如下:Points : 输入参数,输入输出序列点数 Order : 输入参数,系统阶数H0 : 输入参数,系统函数的常数因子N[] : 输入参数,系统函数的分子多项式系数组 D[] : 输入参数,系统函数的分母多项式系数组 x[] : 输入参数,输入序列y[] : 输出参数,输出序列 函数dir1的运行过程如下:(1) 将状态变量数组 ] [u 和 ] [v 初始化为0。
(2)对输入序列每一个样点a. 求输出y[i] = N[0] * x[i] * H0b. 累加系统函数的分子多项式对输出y[i]的贡献。
c. 累加求系统函数的分母多项式对输出y[i]的贡献。
d.刷新状态变量数组(请注意刷新顺序:下标值最大的状态变量先被刷新)// 求直接 1 型 IIR 系统的输出void dir1(int points, int order, double H0, double N[], double D[], double x[], double y[]){int i, j, k;double u[20], v[20];for(i = 0; i<=order; i++) // 状态变量数组初始化 {u[i] = 0; v[i] = 0; }for(i = 0; i < points; i++) // 计算每一个输出点 {y[i] = N[0] * x[i] * H0; for(j = 1; j<= order; j++) y[i] = y[i] + u[j] * N[j]; for(k = 1; k<= order; k++) y[i] = y[i] - v[k] * D[k]; // 状态变量数组刷新 for(j = order; j>=2; j--) {u[j] = u[j - 1];v[j] = v[j - 1];}u[1] = x[i] * H0; v[1] = y[i]; } }下面介绍IIR 系统的级联实现形式。
在这种形式中,系统函数被分解为零、极点形式,即∏∏∑∑=-=-=-=---=-=N k kMk kM k kk Mk kk z p z zH z a zb z H 1111010)1()1(1)( (5)实际上,对IIR 滤波器来说,其系统函数的分子分母多项式是同阶的,即N M =。
式(5)中,}{k z 是零点数组,}{k p 是极点数组。
系统的零、极点可能是复数。
但由于}{k a 和}{k b 是实数数组,所以复数零、极点必将是共轭成对的。
合并共轭成对的零点或极点,可得一个实系数的二次多项式。
还可以将实值零、极点合并。
合并后,式(5)可以改写为∏∏==----=++++=Pk k Pk k k k k z H H z z z z H z H 101221122110)(11)(ααββ (6a ) 即IIR 系统是由P 个二阶节级联而成。
根据教材第8章的分析,有些带通、带阻IIR 滤波器是由Q 个四阶节级联而成的。
这样的系统函数可表为∏∏==--------=++++++++=Qk k Qk kk k k k k k k H H z z z z z z z z H z H 1014433221144332211011)(ααααββββ (6b ) 对于任何一种情况,IIR 系统的级联结构如图4 所示。
其中的基本单元是图5所示的二阶节或四阶节。
图4 IIR 系统的级联结构图5 IIR 系统的级联单元【例1】 图6 示出一个切比雪夫Ⅰ型低通IIR 滤波器的系统函数的分子、分母二次多项式因子。
这个滤波器的阶数为5,第1个二阶节其实是一阶节。
把它作为二阶节处理后,这个滤波器就有三个级联的二阶节。
图6 一个切比雪夫Ⅰ型低通IIR 滤波器的3个二阶节【例2】 光盘所附VB 可视化程序B49从文件BP401.dat (该文件附于本文末尾)读出一个IIR 带通滤波器的数据,用以演示IIR 系统级联型结构的实现。
这个滤波器有4个级联四阶节(4=M )。
图7示出这个滤波器的结构。
图中,画出第k 个四阶节,并标出编程所用的状态变量。
给出级联结构的所有参数以及输入序列)(n x ,求输出序列)(n y 。
解 通过状态变量来实现IIR 级联系统是很方便的。
如图16所示,第k 节的状态变量0k w 和1k w 分别代表该节的输入)(n x k 和输出)(n y k 。
对于第k 节,应根据已知的0k w 求出1k w ,将1k w 赋给下一节的输入端的状态变量0)1(+k w ,然后开始计算下一节。
对于系统实时性的要求是:在系统下一个输入样点到来之前,应求出了当前输入样点的输出。
程序B49 用VB6,0 写成。
这里,用C 语言译出,供读者参考。
主程序main 调用函数 SOS4以计算级联IIR 系统的输出序列。
图7 一个带通IIR 滤波器的级联结构子程序 SOS4 定义各个参数如下:secNum : 输入参数,级联二阶节数目points : 输入参数,输入、输出序列点数 H0 : 输入参数,系统函数的常数因子a[ ] : 输入参数,二维数组,代表二阶节的反馈参数b[ ] : 输入参数,二维数组,代表二阶节的正向传输参数 inSig[ ] : 输入参数,输入序列 outSig[ ] : 输出参数,输出序列函数SOS4的运行过程如下:(1) 将所有四阶节的状态变量数组初始化为0。
(2) 输入样点序号1+←i i ;四阶节序号0=j 。
(3) 对输入序列每一个样点a. 求第i 节的输出,以输出点状态变量赋给第1+i 节的输入点状态变量b. 四阶节序号刷新,即 1+←j jc. j 是否等于四阶节数目secNum ?如果不相等,转去步骤a ,计算下一节,如果相等,转去步骤(4)。
(2) 输入样点序号刷新,即 1+←i i 。
i 是否等于要求的计算点数?如果等于,计算完毕,否则,转去步骤(3),处理新样点。
程序是否正确,关键在于各个四阶节的状态变量是否被正确地刷新。
刷新要点如下: ● 程序运行前,所有状态变量都初始化为0。
● 某个四阶节开始处理前,应根据流图刷新状态变量2k w 。
● 某个四阶节处理完毕时,应依次刷新状态变量36~k k w w ,正确次序是 56k k w w ←,45k k w w ←,34k k w w ←,23k k w w ←。
然后把本节的输出点状 态变量赋给下一节的输入点状态变量。
#include <math.h> #include <iostream.h// 子程序 SOS4计算级联IIR 系统的输出序列void SOS4(int points, int secNum, double H0, double* ptra, double* ptrb, double inSig[], double outSig[]) {int i, j; double xx[10];double w[30][10]; // 状态变量数组, 第一维代表节序号,第二维代表节内变量序号 double a[10][5], b[10][5]; // 四阶节系数数组, 第一维代表节序号,第二维代表节内变量序号for(i=0; i<secNum; i++) for(j=0; j<5; j++) a[i][j] = *ptra++;for(i=0; i<secNum; i++)for(j=0; j<5; j++)b[i][j] = *ptrb++;// 初始化所有级联节的状态变量for(i=0;i<=30;i++)for(j=0;j<=6;j++)w[i][j] = 0;// 计算系统的输出序列for(i=0; i<points; i++){// 第0 节的输入是系统的输入乘以常数因子H0w[0][0] = inSig[i] * H0;for(j=0;j<secNum;j++){// 计算第j 节的内部状态变量w[j][2],其中的状态变量w[j][0] 代表该节的输入w[j][2] = w[j][0] - w[j][3] * a[j][1] - w[j][4] * a[j][2] - w[j][5] * a[j][3] - w[j][6] * a[j][4];// 计算第j 节的内部状态变量w[j][1],此状态变量代表该节的输出w[j][1] = w[j][2] * b[j][0] + w[j][3] * b[j][1] + w[j][4] * b[j][2] + w[j][5] * b[j][3] + w[j][6] * b[j][4];// 下一节的输入是本节的输出w[j + 1][0] = w[j][1];// 刷新状态变量w[j][6] = w[j][5]; w[j][5] = w[j][4]; w[j][4] = w[j][3]; w[j][3] = w[j][2];}// 求出输出序列的一点(最后一节的输出即是系统的输出)outSig[i] = w[secNum - 1][1];}}// 主函数void main(){int i, j;int points; // 点数int secNum; // 四阶节数目double *ptra, *ptrb; // 四阶节系数指针double twoPi = 2 * 3.14159265, H0, f1 = 50, fsamp = 600;double inSig[1024], outSig[1024]; // 输入输出序列double a[10][5], b[10][5]; // 四阶节系数数组// 本程序有一个二阶节和三个四阶节,现把二阶节也作为四阶节处理,故有四个四阶节secNum = 4;// 四阶节分子多项式系数b[0][4] = 0.0; b[0][3] = 0.0; b[0][2] = -1.0;b[0][1] = 0.0; b[0][0] = 1.0;//--------b[1][4] = 1.4384994; b[1][3] = -3.2274574; b[1][2] = 3.7271215;b[1][1] = -3.2274574; b[1][0] = 1.4384994;//--------b[2][4] = 1.1477683; b[2][3] = -3.2274574; b[2][2] = 4.3085839;b[2][1] = -3.2274574; b[2][0] = 1.1477683;//--------b[3][4] = 1.1018413; b[3][3] = -3.2274574; b[3][2] = 4.4004378;b[3][1] = -3.2274574; b[3][0] = 1.1018413;//---------// 四阶节分母多项式系数a[0][4] = 0.0; a[0][3] = 0.0; a[0][2] = .8734064;a[0][1] = -1.5115848; a[0][0] = 1.0;//---------a[1][4] = .7988188; a[1][3] = -2.7057797; a[1][2] = 4.0699851;a[1][1] = -3.0304316; a[1][0] = 1;//---------a[2][4] = .8777742; a[2][3] = -2.8534455; a[2][2] = 4.1628304;a[2][1] = -3.0506849; a[2][0] = 1;//---------a[3][4] = .9601206; a[3][3] = -3.0212184; a[3][2] = 4.2878291;a[3][1] = -3.0855728; a[3][0] = 1;// 四阶节常数因子H0 = 8.4885823E-05;points = 512; // 序列点数// 设定输入序列for(i=0; i<points; i++)inSig[i] = 0.5 * sin(i * twoPi * f1 / fsamp + twoPi / 4);ptra = &a[0][0]; ptrb = &b[0][0];// 计算输出序列SOS4(points, secNum, H0, ptra, ptrb, inSig, outSig);// 打印部分输出序列for(i=110;i<=128;i++)cout << i << " " << outSig[i] << endl;} // 主函数到此终止// -------------------------------------------------------------------------------------------------------- // 带通滤波器文件BP401.dat/*"Elliptic Digital Filter ""********************************""Band Pass"" Sampling Frequency = 600 Hz"" Points in Frequency Domain = 1024" " Pass Band :"" Fp1 = 45 Hz"" Fp2 = 80 Hz"" Apass = 0.2 dB"" Stop Band :"" Fs1 = 35 Hz"" Fs2 = 95 Hz"" Astop = 70 dB""----------------------------------" "Parameters of the Filter :"" 归一化转移函数 H(s) :"" "" 阶数 N = 7"" "" 常数 HO = 1.17844839134034E-04" " "" *****************"" 节号 k = 0----"" 分子多项式系数 "" 0.000000 0.000000 1.000000 <- 零次" " ........."" 分母多项式系数 "" 0.000000 1.000000 0.067574 <- 零次" " *****************"" 节号 k = 1----"" 分子多项式系数 "" 1.000000 0.000000 0.438499 <- 零次" " ........."" 分母多项式系数 "" 1.000000 0.113194 0.012099 <- 零次" " *****************"" 节号 k = 2----"" 分子多项式系数 "" 1.000000 0.000000 0.147768 <- 零次" " ........."" 分母多项式系数 "" 1.000000 0.066814 0.026474 <- 零次" " *****************"" 节号 k = 3----"" 分子多项式系数 "" 1.000000 0.000000 0.101841 <- 零次" " ........."" 分母多项式系数 "" 1.000000 0.021076 0.035930 <- 零次"" *****************"""" 非归一化转移函数 H(s) :"" "" 阶数 N = 7"" "" 常数 HO = 4.89536968039929E-04"" "" *****************"" 节号 k = 0----"" 分子多项式系数 "" 0.000000 0.000000 1.000000 <- 零次"" ........."" 分母多项式系数 "" 0.000000 1.000000 0.280708 <- 零次"" *****************"" 节号 k = 1----"" 分子多项式系数 "" 1.000000 0.000000 7.566915 <- 零次"" ........."" 分母多项式系数 "" 1.000000 0.470216 0.208777 <- 零次"" *****************"" 节号 k = 2----"" 分子多项式系数 "" 1.000000 0.000000 2.549946 <- 零次"" ........."" 分母多项式系数 "" 1.000000 0.277551 0.456845 <- 零次"" *****************"" 节号 k = 3----"" 分子多项式系数 "" 1.000000 0.000000 1.757413 <- 零次"" ........."" 分母多项式系数 "" 1.000000 0.087553 0.620016 <- 零次"" *****************""""-----"" 以下是便于读出的系统函数数据。