ButterWorthFIlter(巴特沃斯滤波器)

一、背景

这种滤波器最先由英国工程师斯蒂芬·巴特沃斯(Stephen Butterworth)在1930年发表在英国《无线电工程》期刊的一篇论文中提出的。

二、特点

巴特沃斯滤波器的特点是通频带内的频率响应曲线最大限度平坦,没有起伏,而在阻频带则逐渐下降为零。 在振幅的对数对角频率的波特图上,从某一边界角频率开始,振幅随着角频率的增加而逐步减少,趋向负无穷大。一阶巴特沃斯滤波器的衰减率为每倍频6分贝,每十倍频20分贝。二阶巴特沃斯滤波器的衰减率为每倍频12分贝、三阶巴特沃斯滤波器的衰减率为每倍频18分贝、如此类推。巴特沃斯滤波器的振幅对角频率单调下降,并且也是唯一的无论阶数,振幅对角频率曲线都保持同样的形状的滤波器。只不过滤波器阶数越高,在阻频带振幅衰减速度越快。其他滤波器高阶的振幅对角频率图和低阶数的振幅对角频率有不同的形状。

由图可见,当N趋于无穷时,将会得到一个理想的低通滤波器

三、原理

1. 幅值平方

∣Ha(jw)∣2=11+(wwc)2N|H_{a}(jw)|^{2}= \frac{1}{1+ (\frac{w}{wc})^{2N}} ∣Ha​(jw)∣2=1+(wcw​)2N1​

2. 拉普拉斯变换


s=σ+jωs=\sigma+j\omega s=σ+jω
其中,
σ=0\sigma=0 σ=0
所以有,
w=sjw=\frac{s}{j} w=js​
重新带入幅值平方
∣H(s)∣2=11+(−s2wc2)N|H(s)|^{2}= \frac{1}{1+ (\frac{-s^2}{wc^2})^{N}} ∣H(s)∣2=1+(wc2−s2​)N1​

H(s)=ωcNa0ωcN+a1ωcN−1s+...an−1ωc1sn−1+sNH(s)= \frac{\omega_{c}^{N}} {a_{0}\omega_{c}^{N}+ a_{1}\omega_{c}^{N-1}s+... a_{n-1}\omega_{c}^{1}s^{n-1}+ s^{N}} H(s)=a0​ωcN​+a1​ωcN−1​s+...an−1​ωc1​sn−1+sNωcN​​
其中,
a0=1a_{0}=1 a0​=1
设数组sb的各个元素为上式分母中关于s的幂次方项的系数
sb={sb[0],sb[1],...sb[N]}={a0ωcN,a1ωcN−1,...an−1ωc1,1}sb=\{sb[0],sb[1],...sb[N]\} = \{a_{0}\omega_{c}^{N},a_{1}\omega_{c}^{N-1},...a_{n-1}\omega_{c}^{1},1\} sb={sb[0],sb[1],...sb[N]}={a0​ωcN​,a1​ωcN−1​,...an−1​ωc1​,1}

3. Z域变换(离散化)


z=esT=esT2e−sT2z=e^{sT}=\frac{e^{\frac{sT}{2}}}{e^{\frac{-sT}{2}}} z=esT=e2−sT​e2sT​​
得到
s=1Tlnzs=\frac{1}{T}ln{z} s=T1​lnz

3.1 线性化

试图使用泰勒公式对s进行展开,但是lnz在z=0处没有定义,于是令
z′=z−1z+1z^{'}=\frac{z-1}{z+1} z′=z+1z−1​
于是
z=1+z′1−z′z=\frac{1+z^{'}}{1-z^{'}} z=1−z′1+z′​
对上式在z‘=0处泰勒展开,有
ln⁡z=ln⁡1+z′1−z′=2(z′+13z′3+15z′5...)\ln z=\ln {\frac{1+z^{'}}{1-z^{'}}}=2(z^{'}+\frac{1}{3}z^{'3}+\frac{1}{5}z^{'5}...) lnz=ln1−z′1+z′​=2(z′+31​z′3+51​z′5...)
带入s的定义,整理,得到
s=1Tlnz=2T(z−1z+1+13z−1z+13+15z−1z+15...)s=\frac{1}{T}ln{z}=\frac{2}{T}(\frac{z-1}{z+1}+\frac{1}{3}\frac{z-1}{z+1}^{3}+\frac{1}{5}\frac{z-1}{z+1}^{5}...) s=T1​lnz=T2​(z+1z−1​+31​z+1z−1​3+51​z+1z−1​5...)
取一阶近似,最终得到
s=1Tlnz=2T(z−1z+1)=2T(1−z−11+z−1)s=\frac{1}{T}ln{z}=\frac{2}{T}(\frac{z-1}{z+1})=\frac{2}{T}(\frac{1-z^{-1}}{1+z^{-1}}) s=T1​lnz=T2​(z+1z−1​)=T2​(1+z−11−z−1​)

3.2 双线性变换

双线性变换就是使用这种一阶估计法,将连续时间传递函数H(s)中的s替换成离散域中的z变量
即 Hd(z)=Ha(s)∣s=2T(z−1z+1)=Ha(2Tz−1z+1)H_{d}(z)=H_{a}(s)|_{s=\frac{2}{T}(\frac{z-1}{z+1})}=H_{a}(\frac{2}{T}\frac{z-1}{z+1}) Hd​(z)=Ha​(s)∣s=T2​(z+1z−1​)​=Ha​(T2​z+1z−1​)

进行整理后,最终得到
H(z)=ωcN(1+z−1)Na0ωcN(2T)N(1−z−1)N+a1ωcN−1(2T)N−1(1−z−1)N−1(1+z−1)1+...aN−mωcN−m(2T)N−m(1−z−1)N−m(1+z−1)m+...aN(1+z−1)NH(z)=\frac{\omega_{c}^{N}(1+z^{-1})^{N}} {a_{0}\omega_{c}^{N}(\frac{2}{T})^N(1-z^{-1})^{N}+ a_{1}\omega_{c}^{N-1}(\frac{2}{T})^{N-1}(1-z^{-1})^{N-1}(1+z^{-1})^{1}+ ... a_{N-m}\omega_{c}^{N-m}(\frac{2}{T})^{N-m}(1-z^{-1})^{N-m}(1+z^{-1})^{m}+... a_{N}(1+z^{-1})^{N} } H(z)=a0​ωcN​(T2​)N(1−z−1)N+a1​ωcN−1​(T2​)N−1(1−z−1)N−1(1+z−1)1+...aN−m​ωcN−m​(T2​)N−m(1−z−1)N−m(1+z−1)m+...aN​(1+z−1)NωcN​(1+z−1)N​

最终将上式写成如下:
H(z)=num[0](z−1)0+num[1](z−1)1+...num[N](z−1)Nden[0](z−1)0+den[1](z−1)1+...den[N](z−1)NH(z)=\frac { num[0](z^{-1})^{0}+ num[1](z^{-1})^{1}+... num[N](z^{-1})^{N} } { den[0](z^{-1})^{0}+ den[1](z^{-1})^{1}+... den[N](z^{-1})^{N} } H(z)=den[0](z−1)0+den[1](z−1)1+...den[N](z−1)Nnum[0](z−1)0+num[1](z−1)1+...num[N](z−1)N​
上式中的序列num、den就是离散化的目标。

四、巴特沃斯滤波器的设计(数字滤波器实现)

1.确定参数

需要确定参数如下:

  • passF:通带截止频率
  • stopF:阻带截止频率
  • fs:采样频率
  • rp:通带最大衰减
  • rs:阻带最小衰减

2.计算预畸参数

双线性变换具有从根本上避免脉冲响应不变法中的频率混叠现象,缺点是引入了频率失真,因此,引入预畸变的概念,即在双线性变换之前,进行预畸来校正频率失真的问题,使得进行双线性变换之后的频率与预期一致。

2.1 预畸原理


s=2T(z−1z+1)=σ+jΩs=\frac{2}{T}(\frac{z-1}{z+1})=\sigma+j\Omega s=T2​(z+1z−1​)=σ+jΩ
使用下式进行变量代换
z=ejwz=e^{jw} z=ejw
得到
s=2T(z−1z+1)=2T(1−e−jw1+e−jw)=2T(1−(cosω−jsin⁡ω)1+(cosω−jsin⁡ω))=2T(2jsin⁡ω2+2cos⁡ω)=2T(j2sin⁡ω2cos⁡ω24cos⁡2ω2)=2Tjtan⁡ω2=σ+jΩ\begin{aligned} s=& \frac{2}{T}(\frac{z-1}{z+1}) \\ =& \frac{2}{T}(\frac{1-e^{-jw}}{1+e^{-jw}}) \\ =& \frac{2}{T}(\frac{1-(cos \omega-j\sin \omega)}{1+(cos \omega-j\sin \omega)}) \\ =& \frac{2}{T}(\frac{2j\sin \omega}{2+2 \cos \omega}) \\ =& \frac{2}{T}(\frac{j2 \sin \frac{\omega}{2}\cos \frac{\omega}{2}}{4 \cos^{2} \frac{\omega}{2}}) \\ =& \frac{2}{T}j\tan {\frac{\omega}{2}}=\sigma+j\Omega \end{aligned} s======​T2​(z+1z−1​)T2​(1+e−jw1−e−jw​)T2​(1+(cosω−jsinω)1−(cosω−jsinω)​)T2​(2+2cosω2jsinω​)T2​(4cos22ω​j2sin2ω​cos2ω​​)T2​jtan2ω​=σ+jΩ​
所以有
Ω=2Ttan⁡ω2=2Ttan⁡πf\begin{aligned} \Omega=& \frac{2}{T}\tan{\frac{\omega}{2}} \\ =& \frac{2}{T}\tan{\pi f} \\ \end{aligned} Ω==​T2​tan2ω​T2​tanπf​

2.2 计算第一步确定的参数预畸值

passΩ=tan⁡π∗passFfspass\Omega=\tan {\frac{\pi*passF}{fs}} passΩ=tanfsπ∗passF​
stopΩ=tan⁡π∗stopFfsstop\Omega=\tan {\frac{\pi*stopF}{fs}} stopΩ=tanfsπ∗stopF​

3. 计算低通滤波器阶数


rp=10lg⁡(1+(passΩΩc)2N)rs=10lg⁡(1+(stopΩΩc)2N)\begin{aligned} rp=10\lg (1+(\frac{pass\Omega}{\Omega_c})^{2N}) \\ rs=10\lg (1+(\frac{stop\Omega}{\Omega_c})^{2N}) \end{aligned} rp=10lg(1+(Ωc​passΩ​)2N)rs=10lg(1+(Ωc​stopΩ​)2N)​
可得,阶数N
N=12=lg⁡100.1rs−1100.1rp−1lg⁡stopΩpassΩ\begin{aligned} N=\frac{1}{2}=\frac{\lg \frac{10^{0.1rs-1}}{10^{0.1rp-1}}}{\lg \frac{stop\Omega}{pass\Omega}} \end{aligned} N=21​=lgpassΩstopΩ​lg100.1rp−1100.1rs−1​​​

4. 计算截止频率\Omega_c


rs=10lg⁡(1+(stopΩΩc)2N)\begin{aligned} rs=10\lg (1+(\frac{stop\Omega}{\Omega_c})^{2N}) \end{aligned} rs=10lg(1+(Ωc​stopΩ​)2N)​

Ωc=stopΩ(100.1rs−1)12N\begin{aligned} \Omega_c=\frac{stop\Omega}{(10^{0.1rs-1})^{\frac{1}{2N}}} \end{aligned} Ωc​=(100.1rs−1)2N1​stopΩ​​

5. 确定分子分母系数数组长度length

length=N+1length=N+1 length=N+1

6. 查表,获取拉氏变换下传递函数的分母系数

H(s)=ΩcNa0ΩcN+a1ΩcN−1s+...an−1Ωc1sn−1+sNH(s)= \frac{\Omega_{c}^{N}} {a_{0}\Omega_{c}^{N}+ a_{1}\Omega_{c}^{N-1}s+... a_{n-1}\Omega_{c}^{1}s^{n-1}+ s^{N}} H(s)=a0​ΩcN​+a1​ΩcN−1​s+...an−1​Ωc1​sn−1+sNΩcN​​

即计算:
a0ΩcN+a1ΩcN−1s+...an−1Ωc1sn−1+sNa_{0}\Omega_{c}^{N}+ a_{1}\Omega_{c}^{N-1}s+... a_{n-1}\Omega_{c}^{1}s^{n-1}+ s^{N} a0​ΩcN​+a1​ΩcN−1​s+...an−1​Ωc1​sn−1+sN

其中,关于a可查表获得

最终返回数组sb数组sb的各个元素为上式分母中关于s的幂次方项的系数
sb={sb[0],sb[1],...sb[N]}={a0ωcN,a1ωcN−1,...an−1ωc1,1}sb=\{sb[0],sb[1],...sb[N]\} = \{a_{0}\omega_{c}^{N},a_{1}\omega_{c}^{N-1},...a_{n-1}\omega_{c}^{1},1\} sb={sb[0],sb[1],...sb[N]}={a0​ωcN​,a1​ωcN−1​,...an−1​ωc1​,1}

代码如下:

    for(int i = 0; i < length; i++){//a0*Wc^N+a1*Wc^(N-1)*S+....+an-1*Wc^0*S^(n-1)returnSb[i] = g_butterPb[length - 1][i] * pow(Wc, length-i); //计算系数}returnSb[length] = 1.0; //最高次幂的系数为1

7. 双线性变换

根据前面得出来的公式:
H(z)=ωcN(1+z−1)Na0ωcN(2T)N(1−z−1)N+a1ωcN−1(2T)N−1(1−z−1)N−1(1+z−1)1+...aN−mωcN−m(2T)N−m(1−z−1)N−m(1+z−1)m+...aN(1+z−1)NH(z)=\frac{\omega_{c}^{N}(1+z^{-1})^{N}} {a_{0}\omega_{c}^{N}(\frac{2}{T})^N(1-z^{-1})^{N}+ a_{1}\omega_{c}^{N-1}(\frac{2}{T})^{N-1}(1-z^{-1})^{N-1}(1+z^{-1})^{1}+ ... a_{N-m}\omega_{c}^{N-m}(\frac{2}{T})^{N-m}(1-z^{-1})^{N-m}(1+z^{-1})^{m}+... a_{N}(1+z^{-1})^{N} } H(z)=a0​ωcN​(T2​)N(1−z−1)N+a1​ωcN−1​(T2​)N−1(1−z−1)N−1(1+z−1)1+...aN−m​ωcN−m​(T2​)N−m(1−z−1)N−m(1+z−1)m+...aN​(1+z−1)NωcN​(1+z−1)N​

7.1 利用杨辉三角计算多项式(1-z^-1)、(1+z^-1)次方项内各自关于(z^-1)的系数


图片来源:https://blog.csdn.net/NDHuaErFeiFei/article/details/88379163

  • 对于 (1+z^-1),
    (z−1+1)1=1∗z−1+1∗1(z−1+1)2=1∗(z−1)2+2∗z−1+1∗1(z−1+1)3=1∗(z−1)3+3∗(z−1)2+3∗z−1+1∗1\begin{aligned} (z^{-1}+1)^{1}=& 1*z^{-1}+1*1 \\ (z^{-1}+1)^{2}=& 1*(z^{-1})^{2}+2*z^{-1}+1*1 \\ (z^{-1}+1)^{3}=& 1*(z^{-1})^{3}+3*(z^{-1})^{2}+3*z^{-1}+1*1 \end{aligned} (z−1+1)1=(z−1+1)2=(z−1+1)3=​1∗z−1+1∗11∗(z−1)2+2∗z−1+1∗11∗(z−1)3+3∗(z−1)2+3∗z−1+1∗1​

以3次方为例,杨辉三角函数输出[1,3,3,1]

  • 对于 (1-z^-1)=(-z^-1+1)
    (−z−1+1)1=−1∗z−1+1∗1(−z−1+1)2=1∗(z−1)2−2∗z−1+1∗1(−z−1+1)3=−1∗(z−1)3+3∗(z−1)2−3∗z−1+1∗1\begin{aligned} (-z^{-1}+1)^{1}=& -1*z^{-1}+1*1 \\ (-z^{-1}+1)^{2}=& 1*(z^{-1})^{2}-2*z^{-1}+1*1 \\ (-z^{-1}+1)^{3}=& -1*(z^{-1})^{3}+3*(z^{-1})^{2}-3*z^{-1}+1*1 \end{aligned} (−z−1+1)1=(−z−1+1)2=(−z−1+1)3=​−1∗z−1+1∗11∗(z−1)2−2∗z−1+1∗1−1∗(z−1)3+3∗(z−1)2−3∗z−1+1∗1​

以3次方为例,杨辉三角函数输出[-1,3,-3,1]

杨辉三角函数代码:

/*======================================================================* 函数名:  pascalTriangle* 函数功能:计算杨辉三角的第N行的值(数组),该系列值为(x+1)^N的系数,*         加改进(x-1)^N的系数** 变量名称:*          N      - 杨辉三角第N行,N=0,1,...,N*          symbol - 运算符号,0——(x+1)^N,1——(x-1)^N*          vector - 返回数组,杨辉三角的第N行的值** 返回值:  void*=====================================================================*/
void pascalTriangle(int     N,int       symbol,int      *vector)
{vector[0] = 1;if(N == 0){return;}else if (N == 1){if(symbol == SYMBOL_ADD){vector[1] = 1;}else{vector[0] = -1; //如果是减号,则第二项系数是-1vector[1] = 1;}return;}int length = N + 1; //数组长度int *temp = (int *)malloc(sizeof(int) * length);/*int temp[length];   //定义中间变量*/temp[0] = 1;temp[1] = 1;for(int i = 2; i <= N; i++){vector[i] = 1;for(int j = 1; j < i; j++){vector[j] = temp[j - 1] + temp[j]; //x[m] = x[m-1][n-1] + x[m-1]}if(i == N) //最后一次不需要给中间变量赋值{if(symbol == SYMBOL_SUB) //运算符为减号{for(int k = 0; k < length; k++){vector[k] = vector[k] * pow((float)-1, length - 1 - k);}}return;}for(int j = 1; j <= i; j++){temp[j] = vector[j];}}if (temp != NULL)free(temp);
}

具体实现:

for(int i = 0; i <= length; i++)
{for(int j = 0; j<= length; j++){tempCoef1[j] = 0;     //tempCoef1和tempCoef2进行初始化tempCoef2[j] = 0;}//i :1 - z^(-1)幂次数//otherN : 1 + z^(-1)幂次数otherN = length - i;pascalTriangle(3, SYMBOL_SUB, tempCoef1);      //利用杨辉三角计算1 - z^(-1)幂的系数pascalTriangle(otherN, SYMBOL_ADD, tempCoef2); //利用杨辉三角计算1 + z^(-1)幂的系数coefficientEquation(tempCoef1, i+1, tempCoef2, otherN+1); //两个多项式相乘,求其系数
}

7.2 利用杨辉三角计算(1-z^-1)^{N-m}*(1+z^-1)^{m}多项式关于z^-1项的系数

最终的系数数组长度:L=N-m+1+m+1-1=N+1

计算的目标多项式:
(1−z−1)N−m(1+z−1)m(1-z^{-1})^{N-m}(1+z^{-1})^{m} (1−z−1)N−m(1+z−1)m

最终得到如下形式:
C0(z−1)N+C1(z−1)N−1+...+CN(z−1)0C_{0}(z^{-1})^{N}+C_{1}(z^{-1})^{N-1}+...+C_{N}(z^{-1})^{0} C0​(z−1)N+C1​(z−1)N−1+...+CN​(z−1)0

返回:
return [C0,C1,C2…CN]

核心函数coefficientEquation()实现两个系数数组相乘后得到的多项式数组

/*======================================================================* 函数名:  coefficientEquation(整数)和coefficientEquation2(浮点数)* 函数功能:计算多项式相乘的系数** 变量名称:*          originalCoef - 原来的系数数组,计算后的系数也存储在该数组内*          N            - 上面系数对应的多项式系数个数*          nextCoef     - 与原数组相乘的数组的系数*          nextN        - 上面系数对应的多项式系数个数** 返回值:  void*=====================================================================*/
void coefficientEquation(int        *originalCoef,int       N,int       *nextCoef,int       nextN)
{int *tempCoef = (int *)malloc(sizeof(int) * (N+nextN-1));/*double tempCoef[N + nextN - 1];    //中间变量*/for(int i = 0; i < N + nextN - 1; i++){tempCoef[i] = originalCoef[i]; //中间变量初始化originalCoef[i] = 0;}//乘完之后有多少项= N + nextN - 1//设 (1,2,3) ===>N=3//   (3,4,5) ===>nextN=3// original[0]=1*3              | (z^-1)^4// original[1]=2*3+1*4          | (z^-1)^3// original[2]=3*3+2*4+1*5      | (z^-1)^2// original[3]=2*5+3*4          | (z^-1)^1// original[4]=3*5              | (z^-1)^0for(int j = 0; j < nextN; j++){for(int i = j; i < N + nextN - 1; i++){//printf("%d %d ",tempCoef[i-j],nextCoef[j]);originalCoef[i] += tempCoef[i-j] * nextCoef[j];//printf("%d %d \n",originalCoef[i],i);}}if (tempCoef != NULL)free(tempCoef);
}

7.3 计算H(z)分母系数

分母形式:
den[0](z−1)0+den[1](z−1)1+...den[N](z−1)Nden[0](z^{-1})^{0}+ den[1](z^{-1})^{1}+... den[N](z^{-1})^{N} den[0](z−1)0+den[1](z−1)1+...den[N](z−1)N

其中,
den[0]=(2T)0∗CN∗sb[0]+(2T)1∗CN∗sb[1]+...+(2T)N∗CN∗sb[N]\begin{aligned} den[0]=& (\frac{2}{T})^{0}*C_{N}*sb[0]+ (\frac{2}{T})^{1}*C_{N}*sb[1]+ ... +(\frac{2}{T})^{N}*C_{N}*sb[N] \end{aligned} den[0]=​(T2​)0∗CN​∗sb[0]+(T2​)1∗CN​∗sb[1]+...+(T2​)N∗CN​∗sb[N]​

den[1]=(2T)0∗CN−1∗sb[0]+(2T)1∗CN−1∗sb[1]+...+(2T)N∗CN−1∗sb[N]\begin{aligned} den[1]=& (\frac{2}{T})^{0}*C_{N-1}*sb[0]+ (\frac{2}{T})^{1}*C_{N-1}*sb[1]+ ... +(\frac{2}{T})^{N}*C_{N-1}*sb[N] \end{aligned} den[1]=​(T2​)0∗CN−1​∗sb[0]+(T2​)1∗CN−1​∗sb[1]+...+(T2​)N∗CN−1​∗sb[N]​

............ ......

den[N]=(2T)0∗C0∗sb[0]+(2T)1∗C0∗sb[1]+...+(2T)N∗C0∗sb[N]\begin{aligned} den[N]=& (\frac{2}{T})^{0}*C_{0}*sb[0]+ (\frac{2}{T})^{1}*C_{0}*sb[1]+ ... +(\frac{2}{T})^{N}*C_{0}*sb[N] \end{aligned} den[N]=​(T2​)0∗C0​∗sb[0]+(T2​)1∗C0​∗sb[1]+...+(T2​)N∗C0​∗sb[N]​

最终计算结果:
return [den[0],den[1], … den[N]]

实现代码:

//分母
length=N;
for(int i = 0; i <= length; i++)
{for(int j = 0; j <= length; j++){denominator[j] += pow(Fsx2, i) * (float)tempCoef1[length - j] * sb[i];}
}

7.4 计算H(z)分子系数

(1)如7.2一样,由杨辉三角计算得到(1+z^-1)^N的系数[tmpC0,tmpC1, … tmpCN]
(2)分子形式:

根据双线性变换得到的分子:

ωcN(1+z−1)N\omega_{c}^{N}(1+z^{-1})^{N} ωcN​(1+z−1)N

可以写成如下形式:

num[0](z−1)0+num[1](z−1)1+...num[N](z−1)Nnum[0](z^{-1})^{0}+ num[1](z^{-1})^{1}+... num[N](z^{-1})^{N} num[0](z−1)0+num[1](z−1)1+...num[N](z−1)N

其中,

num[0]=tmpCN∗sb[0]\begin{aligned} num[0]=&tmpC_{N}*sb[0] \end{aligned} num[0]=​tmpCN​∗sb[0]​

num[1]=tmpCN−1∗sb[0]\begin{aligned} num[1]=&tmpC_{N-1}*sb[0] \end{aligned} num[1]=​tmpCN−1​∗sb[0]​

............ ......

num[N]=tmpC0∗sb[0]\begin{aligned} num[N]=&tmpC_{0}*sb[0] \end{aligned} num[N]=​tmpC0​∗sb[0]​

(3)实现代码:

length=N;
for(int i = 0; i <= length; i++)
{//分子系数if(i == 0){for(int j = 0; j <= length; j++){numerator[j] = sb[0] * tempCoef2[length - j];}}
}

7.5 系数归一化(分子分母同除)

目标:使分母常数项=1

即:
num=num/den[0]
den=den/den[0]

实现代码:

length=N;
for(int i = 0; i <= length; i++)
{//系数归一化,分母的常数项为1for(int i = length; i >= 0; i--){numerator[i] = numerator[i] / denominator[0];denominator[i] = denominator[i] / denominator[0];}
}

7.6 设计完成

得到了num和den数组,即得到如下形式的H(z)
H(z)=num[0](z−1)0+num[1](z−1)1+...num[N](z−1)Nden[0](z−1)0+den[1](z−1)1+...den[N](z−1)NH(z)=\frac { num[0](z^{-1})^{0}+ num[1](z^{-1})^{1}+... num[N](z^{-1})^{N} } { den[0](z^{-1})^{0}+ den[1](z^{-1})^{1}+... den[N](z^{-1})^{N} } H(z)=den[0](z−1)0+den[1](z−1)1+...den[N](z−1)Nnum[0](z−1)0+num[1](z−1)1+...num[N](z−1)N​

ButterWorthFIlter(巴特沃斯滤波器)相关推荐

  1. 巴特沃斯滤波器应用场合_巴特沃斯数字低通滤波器设计及应用

    龙源期刊网 http://www.qikan.com.cn 巴特沃斯数字低通滤波器设计及应用 作者:汪其锐 王桂华 王永军 来源:<山东工业技术> 2016 年第 24 期 摘 要:现实生 ...

  2. 巴特沃斯滤波器 python_巴特沃斯、切比雪夫、贝塞尔滤波器的区别

    巴特沃斯滤波器.切比雪夫滤波器.贝塞尔滤波器均包括模拟滤波器和数字滤波器两种形式. 数字滤波器是指完成信号滤波处理功能的,用有限精度算法实现的离散时间线性非时变系统,其输入是一组数字量,其输出是经过变 ...

  3. 数字信号处理——巴特沃斯滤波器设计

    设计思路 这里采用间接法设计数字滤波器(先设计模拟滤波器再设计数字滤波器) 滤波器理解: 1.数字滤波器可以用H(z),h(n)or系统差分方程来表示,对应的就是一个系统,信号输入该系统即可改变其所含 ...

  4. 数字信号处理公式变程序(四)——巴特沃斯滤波器(下)

    之前已经讲过巴特沃斯滤波器的基础知识和数字滤波器求系统函数的代码实现,本节讲如何使用数字滤波器的系统函数实现对信号的滤波. 注:可能会有不足或者理解偏差的地方,路过的高人请不吝赐教. OK,开始! = ...

  5. 巴特沃斯滤波器、切比雪夫、椭圆滤波

    滤波器概述 滤波器的作用就是过滤波形,过滤掉不需要的波形成分,与在时间上截取某一部分波形相区别,这个波形成分一般用频率来描述,也可以用模拟角频率核数字角频率来描述.从滤波器的通带范围可以分为低通.高通 ...

  6. python实现陷波滤波器、低通滤波器、高斯滤波器、巴特沃斯滤波器

    在一幅图像中,其低频成分对应者图像变化缓慢的部分,对应着图像大致的相貌和轮廓,而其高频成分则对应着图像变化剧烈的部分,对应着图像的细节(图像的噪声也属于高频成分). 滤波器 低通滤波器 高通滤波器 陷 ...

  7. java巴特沃斯滤波器编程_EMG信号的低通巴特沃斯滤波器

    使用matlab中自带的randn函数产生一组随机数,作为EMG信号,然后EMG信号的采样率为2048hz.这里随机数产生的随机数种子采用的机遇系统时钟的随机数种子.系统输入有两个,一个是仿真时间,单 ...

  8. Matlab语音信号去噪程序,使用低通巴特沃斯滤波器

    Matlab语音信号去噪程序,使用低通巴特沃斯滤波器. 1.读取一段歌曲的信号,绘制时域频域图,并播放. 2.添加正弦噪声: 3.设计巴特沃斯低通滤波器: 4.使用滤波器去除噪声,并画出时域频域图,播 ...

  9. 基于matlab的巴特沃斯滤波器设计

    一.butterworth滤波器也称最平响应特性滤波器,其特征多项式为: |K(jΩ)|^2=K(jΩ)K(-jΩ)=(Ω/Ωc)^2N 巴特沃斯滤波器的模平方函数为: |H(jΩ)|^2=1/(1+ ...

  10. 用巴特沃斯滤波器进行潮汐滤波分析

    作业记录 题目:利用某潮位站一月份的逐时潮汐观测数据,采用巴特沃斯低通滤波器进行潮汐滤波分析,求出低通滤波结果和高通滤波结果. 一.巴特沃斯滤波器及滤波器设计 巴特沃斯滤波器 巴特沃斯滤波器是一种递归 ...

最新文章

  1. 使用 HttpResponse.Write 方法进行字符串串联
  2. 关于Android Service真正的完全详解,你需要知道的一切
  3. innerhtml js执行_JS 中 DOM 操作
  4. 【NLP】到目前为止,机器学习与自然语言处理相遇的那些事
  5. shell编程之文本处理工具awk
  6. Calendar详解
  7. man:命令帮助使用手册
  8. ScaleAnimation动画
  9. 基于redis的分布式锁
  10. C Tricks(四)—— 从数组中随机选择一个元素
  11. puppet详解(三)——file资源详解
  12. VC++的链接错误LNK2001zz
  13. C# 读取XML 写入XML 读写XML
  14. 领域驱动设计系列 (六):CQRS
  15. 读《我的身体里早已落叶纷飞》
  16. informix数据库常用的命令
  17. 远程办公和分布式协作
  18. 无处安放的野心和能力
  19. 《Java SE实战指南》10:特性修饰符
  20. matlab多边形检测_Matlab图像处理学习笔记(四):多边形检测

热门文章

  1. java 二叉树详解 + 实现代码
  2. linux运行python乱码_linux下python中文乱码解决方案
  3. 美国软件是如何最终装备在中国攻击直升机上的(二)
  4. tomcat war包解压规则
  5. 欧瑞变频器800参数设置_(完整版)ACS800变频器参数设定
  6. android电容触摸驱动
  7. java多线程 —— 面试题集合(最全集合)
  8. Modown v7.3无限制版+ Erphpdown12.3插件 + 工单系统
  9. 软考常考知识点整理-项目风险管理计划
  10. android开发笔记之xml矢量图片