音频进阶学习二十五——脉冲响应不变法实现低通滤波器
文章目录
- 前言
- 一、脉冲响应不变法
- 1.定义
- 2.模拟系统冲激响应的周期采样
- 3.模拟系统和数字系统的频域响应关系
- 1)S域和Z域的关系
- 2)幅频响应的关系
- 4.通过有理函数设计滤波器
- 5.总结
- 二、低通滤波器的设计实例
- 1.给定数字滤波器指标
- 2.转换模拟滤波器指标
- 3.模拟滤波器的设计
- 4.模拟滤波器的传递函数
- 5.转换为数字系统的传递函数
- 三、使用matlab实现
- 1.通过传递函数实现
- 2.使用matlab工具
- 总结
前言
上一篇文章中,我们介绍了滤波器的设计流程,并且提到了从模拟滤波器传递函数到数字滤波器传递函数的两种转变方法:脉冲响应不变法、双线性转换法。
本篇文章将使用脉冲响应不变法设计出一个低通滤波器。在文章的开始,将会对于脉冲响应不变法原理、频域、幅频响应做一个深入解析。然后根据给定的指标,通过巴特沃斯滤波器得到数字滤波器的传递函数,并且在计算机中进行低通滤波的验证。
|版本声明:山河君,未经博主允许,禁止转载
一、脉冲响应不变法
1.定义
保持模拟系统的冲激响应不变,而离散化后的数字滤波器具有与原模拟滤波器相同的冲激响应。即 h a [ t ] h_a[t] ha[t]是模拟滤波器的单位冲激响应,而 h [ n ] = h a [ n T ] h[n]=h_a[nT] h[n]=ha[nT],其中 T T T为采样周期。从而实现 H c ( s ) H_c(s) Hc(s)到 H ( z ) H(z) H(z)的转换。
整体过程如下:
注意,梳理下文中所有用到的公式:
- H c ( s ) = ∫ − ∞ ∞ h a ( t ) e − s t d t H_c(s)=\int_{-\infty}^{\infty}h_a(t)e^{-st}dt Hc(s)=∫−∞∞ha(t)e−stdt:连续时间(模拟)系统的传递函数
- H c ( s ) = ∑ k = 1 N A k s − s k H_c(s)=\sum_{k=1}^N\frac{A_k}{s-s_k} Hc(s)=∑k=1Ns−skAk:模拟系统的传递函数为以部分分式展开的形式
- H a ( j Ω ) = H c ( s ) ∣ s = j Ω = ∫ − ∞ ∞ h a ( t ) e − j Ω t d t H_a(j\Omega)=H_c(s)|_{s=j\Omega}=\int_{-\infty}^{\infty}h_a(t)e^{-j\Omega t}dt Ha(jΩ)=Hc(s)∣s=jΩ=∫−∞∞ha(t)e−jΩtdt:传递函数的傅里叶变换,即模拟系统的幅频响应
- H ( e j ω ) = ∑ n = − ∞ ∞ x [ n ] e − j ω n H(e^{j\omega})=\sum_{n=-\infty}^{\infty}x[n]e^{-j\omega n} H(ejω)=∑n=−∞∞x[n]e−jωn:离散系统的幅频响应
- H ( z ) = ∑ n = − ∞ ∞ x [ n ] z − n H(z)=\sum_{n=-\infty}^{\infty}x[n]z^{-n} H(z)=∑n=−∞∞x[n]z−n:离散时间(数字)系统的传递函数
- H s ( s ) = ∑ n = − ∞ ∞ ∫ − ∞ ∞ h a ( t ) δ ( t − n T s ) e − s t d t H_s(s)=\sum_{n=-\infty}^{\infty}\int_{-\infty}^{\infty}h_a(t)\delta(t-nTs)e^{-st}dt Hs(s)=∑n=−∞∞∫−∞∞ha(t)δ(t−nTs)e−stdt:离散时间系统的拉普拉斯变换(下文中推导)
接下来,我们就具体分析其中的步骤
2.模拟系统冲激响应的周期采样
由上文可知,首先设计利用冲激串 s ( t ) s(t) s(t)进行周期采样,采样周期为 T s T_s Ts:
s ( t ) = ∑ n = − ∞ ∞ δ ( t − n T s ) s(t)=\sum_{n=-\infty}^{\infty}\delta(t-nTs) s(t)=n=−∞∑∞δ(t−nTs)
再对于模拟滤波器冲激响应进行采样:
h [ n ] = h a ( t ) ∣ t = n T s = h a [ n T s ] = h s [ n T s ] , h s ( t ) = h a ( t ) s ( t ) h[n]=h_a(t)|_{t=nT_s}=h_a[nT_s]=h_s[nT_s],\quad h_s(t)=h_a(t)s(t) h[n]=ha(t)∣t=nTs=ha[nTs]=hs[nTs],hs(t)=ha(t)s(t)
由上文可知:连续时间信号的系统的传递函数,以及连续时间系统频率响应分别为
H c ( s ) = ∫ − ∞ ∞ h a ( t ) e − s t d t , H a ( j Ω ) = H c ( s ) ∣ s = j Ω H_c(s)=\int_{-\infty}^{\infty}h_a(t)e^{-st}dt, \quad H_a(j\Omega)=H_c(s)|_{s=j\Omega} Hc(s)=∫−∞∞ha(t)e−stdt,Ha(jΩ)=Hc(s)∣s=jΩ
其中, s s s是复数,为 σ + j Ω \sigma+j\Omega σ+jΩ ,由此对于模拟系统的幅频响应的采样为:
H s ( s ) = ∫ − ∞ ∞ h a ( t ) ∑ n = − ∞ ∞ δ ( t − n T s ) e − s t d t H_s(s)=\int_{-\infty}^{\infty}h_a(t)\sum_{n=-\infty}^{\infty}\delta(t-nTs)e^{-st}dt Hs(s)=∫−∞∞ha(t)n=−∞∑∞δ(t−nTs)e−stdt
对于上式同样有线性性,那么上式为:
H s ( s ) = ∑ n = − ∞ ∞ ∫ − ∞ ∞ h a ( t ) δ ( t − n T s ) e − s t d t , t = n T s = ∑ n = − ∞ ∞ h a ( n T s ) e − s n T s H_s(s)=\sum_{n=-\infty}^{\infty}\int_{-\infty}^{\infty}h_a(t)\delta(t-nTs)e^{-st}dt, \quad t=nT_s\\ =\sum_{n=-\infty}^{\infty}h_a(nT_s)e^{-snT_s} Hs(s)=n=−∞∑∞∫−∞∞ha(t)δ(t−nTs)e−stdt,t=nTs=n=−∞∑∞ha(nTs)e−snTs
此时对比Z变换 H ( z ) = ∑ n = − ∞ ∞ h [ n ] z − n H(z)=\sum_{n=-\infty}^{\infty}h[n]z^{-n} H(z)=∑n=−∞∞h[n]z−n,即当 z = e s T s z=e^{sT_s} z=esTs时,两者相等,此时 H ( z ) = H s ( s ) ∣ s = ln ( z ) / T s H(z)=H_s(s)|_{s=\ln(z)/T_s} H(z)=Hs(s)∣s=ln(z)/Ts。这就是脉冲响应不变法的原理推导。
3.模拟系统和数字系统的频域响应关系
1)S域和Z域的关系
上文中说当 z = e s T s z=e^{sT_s} z=esTs时, H ( z ) = H s ( s ) ∣ s = ln ( z ) / T s H(z)=H_s(s)|_{s=\ln(z)/T_s} H(z)=Hs(s)∣s=ln(z)/Ts,我们知道:
- s = σ + j Ω s=\sigma+j\Omega s=σ+jΩ
- z = r e j ω z=re^{j\omega} z=rejω
则将上式转为实部与虚部 r e j ω = e ( σ + j Ω ) T s = e σ T s e j Ω T s re^{j\omega}=e^{(\sigma+j\Omega)T_s}=e^{\sigma T_s}e^{j\Omega T_s} rejω=e(σ+jΩ)Ts=eσTsejΩTs,此时就有:
- r = e σ T s r=e^{\sigma T_s} r=eσTs,决定了模值
- ω = Ω T s \omega=\Omega T_s ω=ΩTs,决定了角度
然而由于指数函数在虚部方向是周期性的 e s T s + 2 π k T s = e s T s ∗ 1 e^{sT_s+2\pi kT_s}=e^{sT_s} * 1 esTs+2πkTs=esTs∗1,即对于不同频率分量 k k k实际上映射到了同一点,这也就是多重映射:
- σ = 0 \sigma=0 σ=0时, ∣ z ∣ = 1 |z|=1 ∣z∣=1,此时S域中虚轴就变成了Z域上的单位圆
- σ < 0 \sigma<0 σ<0时, ∣ z ∣ < 1 |z|<1 ∣z∣<1,此时S域就映射到了单位圆内部,此时为因果稳定系统
- σ > 0 \sigma>0 σ>0时, ∣ z ∣ > 1 |z|>1 ∣z∣>1,此时S域就映射到了单位圆外
2)幅频响应的关系
从连续时间傅里叶变换CTFT到DTFT,即描述连续时间系统频率响应和离散时间系统频率响应关系存在以下公式:
H ( e j ω ) = 1 T s ∑ k = − ∞ ∞ H a ( j ω T s − j 2 π k T s ) H(e^{j\omega})=\frac{1}{T_s}\sum_{k=-\infty}^{\infty}H_a(j\frac{\omega}{T_s}-j\frac{2\pi k}{T_s}) H(ejω)=Ts1k=−∞∑∞Ha(jTsω−jTs2πk)
- 混叠
根据采样定理:采样过程实际上是在时域对信号进行周期性地重复。采样后的信号的频域会变成周期性的。也就是在频域上,信号会以采样频率 f s = 1 / T s f_s=1/T_s fs=1/Ts为周期出现重复。此时会发生:- 连续时间的频率响应基本上是非带限的信号,具有无限带宽,所以在S域映射到Z域(如上图)时,高频信号会折叠到低频信号,但是这种折叠在低频时可以忽略不计
- 如果冲激响应的的最高频率很高,但是采样频率低,这种重复可能会导致幅频响应 H ( e j ω ) H(e^{j\omega}) H(ejω)的混叠,如下图
所以冲激响应不变法只适用于低通滤波器。
- 增益
我们知道,在实际应用中,语音是先通过模数转换为数字信号处理,然后通过数模转为为模拟信号播出,在数模转换时现在给出增益为 T s T_s Ts。在滤波器中,我们知道到输出的频谱是输入的频谱乘上冲激响应频谱:
Y ( e j ω ) = X ( e j ω ) H ( e j ω ) Y(e^{j\omega})=X(e^{j\omega})H(e^{j\omega}) Y(ejω)=X(ejω)H(ejω)
而根据上式我们知道 X ( e j ω ) H ( e j ω ) X(e^{j\omega})H(e^{j\omega}) X(ejω)H(ejω)对于频谱缩小了 1 / T s 2 1/T_s^2 1/Ts2,即使数模转换时的增益时 T s T_s Ts依旧缩小了 1 / T s 1/T_s 1/Ts,所以在实际对于连续时间冲激响应的周期采样实际上是对于 T s H ( s ) T_sH(s) TsH(s)采样。
4.通过有理函数设计滤波器
由上文可知,对于模拟系统的传递函数为以部分分式展开的形式表示为
H c ( s ) = ∑ k = 1 N A k s − s k H_c(s)=\sum_{k=1}^N\frac{A_k}{s-s_k} Hc(s)=k=1∑Ns−skAk
其中:
- s k s_k sk:系统的极点
- A k A_k Ak:每个极点对应的系数
- N N N:代表系统的极点个数。
对于它的反变换得到 h ( t ) h(t) h(t):
h ( t ) = ∑ k = 1 N A k e s k t u ( t ) h(t)=\sum_{k=1}^NA_ke^{s_kt}u(t) h(t)=k=1∑NAkesktu(t)
由上文可知对其进行采样,需要扩大增益为 T s T_s Ts,即:
h [ n ] = T s h ( t ) ∣ t = n T s = > h [ n ] = T s ∑ k = 1 N A k e s k n T s u [ n T s ] h[n]=T_sh(t)|_{t=nT_s} \quad =>\quad h[n]=T_s\sum_{k=1}^NA_ke^{s_knT_s}u[nT_s] h[n]=Tsh(t)∣t=nTs=>h[n]=Tsk=1∑NAkesknTsu[nTs]
在以前的文章中音频进阶学习十三——Z变换二(有理z变换、稳定性与反变换),我们知道 a n u [ n ] a^nu[n] anu[n]的Z变换为 1 1 − a z − 1 \frac{1}{1-a^z{-1}} 1−az−11,所以上式的Z变换为
H ( z ) = ∑ k = 1 N T s A k 1 − e s k T s z − 1 H(z)=\sum_{k=1}^N\frac{T_sA_k}{1-e^{s_kT_s}z^{-1}} H(z)=k=1∑N1−eskTsz−1TsAk
5.总结
从模拟系统通过脉冲响应不变法设计数字系统的总过程分为:
- 通过模拟系统的有理传递函数得到脉冲响应
- 通过模拟系统的脉冲响应采样得到数字系统的脉冲响应
- 通过数字系统的脉冲响应得到数字系统的有理传递函数
最终表示为:
H ( z ) = ∑ k = 1 N T s A k 1 − e s k T s z − 1 H(z)=\sum_{k=1}^N\frac{T_sA_k}{1-e^{s_kT_s}z^{-1}} H(z)=k=1∑N1−eskTsz−1TsAk
其中需要注意的是:
- 在低频段可以保持远小于采样频率,而高频段会出现混叠,所以脉冲响应不变法更适合于低通滤波器
- 由于使得数字系统脉冲响应很好地逼近原始系统的频率响应,所以时域逼近良好
- 相位线性变换,可以保持线性相位
- 为了满足数模转换幅频相同,所以要对于系统进行 T s T_s Ts的增益
二、低通滤波器的设计实例
在上一篇文章音频进阶学习二十四——滤波器设计方法中,给定了数字滤波器设计的总过程如下图:
现在结合实例来一步步设计一个数字滤波器
1.给定数字滤波器指标
现在给出通带截止频率和阻带截止频率,设计一个低通的数字滤波器
{ 0.89125 ≤ ∣ H ( e j ω ) ∣ < 1 , ∣ ω ∣ ≤ 0.2 π ∣ H ( e j ω ) ∣ < 0.17783 , 0.3 π ≤ ∣ ω ∣ ≤ π \begin{cases} 0.89125 \leq |H(e^{j\omega})| < 1, \quad |\omega| \leq 0.2\pi \\ |H(e^{j\omega})| < 0.17783, \quad 0.3\pi\leq|\omega| \leq \pi \end{cases} {0.89125≤∣H(ejω)∣<1,∣ω∣≤0.2π∣H(ejω)∣<0.17783,0.3π≤∣ω∣≤π
即如下图
也就是说,如果采样率是1k,那么根据归一化频率 ω = 2 π f / Ω \omega=2\pi f/\Omega ω=2πf/Ω:
- 通带截止频率: 2 π f 0.2 π = 1000 , f = 100 H z \frac{2\pi f}{0.2\pi}=1000, \quad f=100Hz 0.2π2πf=1000,f=100Hz
- 通带截止频率: 2 π f 0.3 π = 1000 , f = 150 H z \frac{2\pi f}{0.3\pi}=1000, \quad f=150Hz 0.3π2πf=1000,f=150Hz
2.转换模拟滤波器指标
根据脉冲响应不变法, Ω = ω / T s \Omega=\omega/T_s Ω=ω/Ts,则模拟滤波器的指标为:
{ 0.89125 ≤ ∣ H ( j Ω ) ∣ < 1 , ∣ Ω ∣ ≤ 0.2 π T s ∣ H ( j Ω ) ∣ < 0.17783 , 0.3 π T s ≤ ∣ Ω ∣ ≤ π T s \begin{cases} 0.89125 \leq |H(j\Omega)| < 1, \quad |\Omega| \leq \frac{0.2\pi}{T_s} \\ |H(j\Omega)| < 0.17783, \quad \frac{0.3\pi}{T_s} \leq|\Omega| \leq \frac{\pi}{T_s} \end{cases} {0.89125≤∣H(jΩ)∣<1,∣Ω∣≤Ts0.2π∣H(jΩ)∣<0.17783,Ts0.3π≤∣Ω∣≤Tsπ
如下图所示
3.模拟滤波器的设计
根据上一篇文章中给定的巴特沃斯滤波器
∣ H a ( j Ω ) ∣ 2 = 1 1 + ( Ω Ω c ) 2 N |H_a(j\Omega)|^2=\frac{1}{1+(\frac{\Omega}{\Omega_c})^{2N}} ∣Ha(jΩ)∣2=1+(ΩcΩ)2N1
将指标代入
{ ∣ H ( j 0.2 π T s ) ∣ ≥ 0.89125 ∣ H ( j 0.3 π T s ) ∣ ≤ 0.17783 = > { 1 + ( 0.2 π T s Ω c ) 2 N = ( 1 0.89125 ) 2 1 + ( 0.3 π T s Ω c ) 2 N = ( 1 0.17783 ) 2 \begin{cases} |H(j\frac{0.2\pi}{T_s})| \geq 0.89125 \\ |H(j\frac{0.3\pi}{T_s})| \leq 0.17783\end{cases} => \begin{cases} 1+(\frac{0.2\pi}{T_s\Omega_c})^{2N} =(\frac{1}{0.89125 })^2 \\ \\ 1+(\frac{0.3\pi}{T_s\Omega_c})^{2N} =(\frac{1}{0.17783})^2 \end{cases} {∣H(jTs0.2π)∣≥0.89125∣H(jTs0.3π)∣≤0.17783=>⎩ ⎨ ⎧1+(TsΩc0.2π)2N=(0.891251)21+(TsΩc0.3π)2N=(0.177831)2
对于该式求解:
{ 1 + ( 0.2 π T s Ω c ) 2 N = ( 1 0.89125 ) 2 1 + ( 0.3 π T s Ω c ) 2 N = ( 1 0.17783 ) 2 = > { ( 0.2 π T s Ω c ) 2 N = 0.2589 ( 0.3 π T s Ω c ) 2 N = 30.622 = > ( 0.2 π 0.3 π ) 2 N = 0.008456 \begin{cases} 1+(\frac{0.2\pi}{T_s\Omega_c})^{2N} =(\frac{1}{0.89125 })^2 \\ \\ 1+(\frac{0.3\pi}{T_s\Omega_c})^{2N} =(\frac{1}{0.17783})^2 \end{cases} => \begin{cases} (\frac{0.2\pi}{T_s\Omega_c})^{2N} =0.2589\\ \\ (\frac{0.3\pi}{T_s\Omega_c})^{2N} =30.622\end{cases} =>(\frac{0.2\pi}{0.3\pi})^{2N}=0.008456 ⎩ ⎨ ⎧1+(TsΩc0.2π)2N=(0.891251)21+(TsΩc0.3π)2N=(0.177831)2=>⎩ ⎨ ⎧(TsΩc0.2π)2N=0.2589(TsΩc0.3π)2N=30.622=>(0.3π0.2π)2N=0.008456
此时取对数 ( 4 9 ) N = 0.008456 , N = 5.8858 (\frac{4}{9})^N=0.008456 , \quad N=5.8858 (94)N=0.008456,N=5.8858,即得到的指标为:
{ 1 + ( 0.2 π T s Ω c ) 12 = ( 1 0.89125 ) 2 1 + ( 0.3 π T s Ω c ) 12 = ( 1 0.17783 ) 2 = > Ω c = 0.7032 / T s \begin{cases} 1+(\frac{0.2\pi}{T_s\Omega_c})^{12} =(\frac{1}{0.89125 })^2 \\ \\ 1+(\frac{0.3\pi}{T_s\Omega_c})^{12} =(\frac{1}{0.17783})^2 \end{cases} =>\Omega_c=0.7032/T_s ⎩ ⎨ ⎧1+(TsΩc0.2π)12=(0.891251)21+(TsΩc0.3π)12=(0.177831)2=>Ωc=0.7032/Ts
4.模拟滤波器的传递函数
在上文中说过,对于模拟系统的频率响应和传递函数关系为: H a ( j Ω ) = H c ( s ) ∣ s = j Ω H_a(j\Omega)=H_c(s)|_{s=j\Omega} Ha(jΩ)=Hc(s)∣s=jΩ,
由音频进阶学习十八——幅频响应相同系统、全通系统、最小相位系统中对于幅频响应相同系统的特点,对于巴特沃斯滤波器存在 H ( s ) H ∗ ( − s ∗ ) = 1 1 + ( s j Ω c ) 2 N H(s)H^*(-s^*)=\frac{1}{1+(\frac{s}{j\Omega_c})^{2N}} H(s)H∗(−s∗)=1+(jΩcs)2N1,由就可以得到对于给定指定模拟系统的极点
( s j Ω c ) 12 = − 1 = > s j Ω C = e j 2 π k 12 = > s = j Ω c e j 2 π k 12 (\frac{s}{j\Omega_c})^{12}=-1 \quad =>\quad \frac{s}{j\Omega_C}=e^{j\frac{2\pi k}{12}}=>s=j\Omega_ce^{j\frac{2\pi k}{12}} (jΩcs)12=−1=>jΩCs=ej122πk=>s=jΩcej122πk
此时可知 k = 0 , 1 , 2 , . . . , 11 k=0,1,2,...,11 k=0,1,2,...,11,也就是说共有12个极点,且均匀地分布在一个以原点为中心,半径为 Ω c \Omega_c Ωc的圆上。所以每个极点的角度为 2 π / 12 = π / 6 2\pi/12=\pi/6 2π/12=π/6.根据上文可知,S域的左半平面映射到Z平面保证在单位圆内,由此选取所左边平面的一组6个极点为:
{ [ − 0.182 ± j ( 0.679 ) ] / T s [ − 0.497 ± j ( 0.497 ) ] / T s [ − 0.679 ± j ( 0.182 ) ] / T s \begin{cases} [-0.182\pm j(0.679)]/T_s \\ [-0.497\pm j(0.497)]/T_s \\ [-0.679\pm j(0.182)]/T_s \end{cases} ⎩ ⎨ ⎧[−0.182±j(0.679)]/Ts[−0.497±j(0.497)]/Ts[−0.679±j(0.182)]/Ts
如同下图
将极点代入到模拟系统的传递函数为以部分分式展开为连加形式:
H c ( s ) = ∑ k = 1 N A k s − s k = 0.7032 / T s × 0.7032 / T s ( s − ( − 0.182 − j ( 0.679 ) / T s ) ( − 0.182 + j ( 0.679 ) / T s ) × 0.7032 / T s × 0.7032 / T s ( s − ( − 0.497 − j ( 0.497 ) / T s ) ( − 0.497 + j ( 0.497 ) / T s ) × 0.7032 / T s × 0.7032 / T s ( s − ( − 0.679 − j ( 0.182 ) / T s ) ( − 0.679 + j ( 0.182 ) / T s ) H_c(s)=\sum_{k=1}^N\frac{A_k}{s-s_k}=\\ \frac{0.7032/T_s \times 0.7032/T_s}{(s-(-0.182 - j(0.679)/T_s)(-0.182 + j(0.679)/T_s)} \\ \times \frac{0.7032/T_s \times 0.7032/T_s}{(s-(-0.497- j(0.497)/T_s)(-0.497+ j(0.497)/T_s)} \\ \times \frac{0.7032/T_s \times 0.7032/T_s}{(s-(-0.679- j(0.182 )/T_s)(-0.679+ j(0.182 )/T_s)} Hc(s)=k=1∑Ns−skAk=(s−(−0.182−j(0.679)/Ts)(−0.182+j(0.679)/Ts)0.7032/Ts×0.7032/Ts×(s−(−0.497−j(0.497)/Ts)(−0.497+j(0.497)/Ts)0.7032/Ts×0.7032/Ts×(s−(−0.679−j(0.182)/Ts)(−0.679+j(0.182)/Ts)0.7032/Ts×0.7032/Ts
5.转换为数字系统的传递函数
根据 H ( z ) = ∑ k = 1 N T s A k 1 − e s k T s z − 1 H(z)=\sum_{k=1}^N\frac{T_sA_k}{1-e^{s_kT_s}z^{-1}} H(z)=∑k=1N1−eskTsz−1TsAk,将 A k , s k A_k,s_k Ak,sk代入,得到数字滤波器的传递函数为
H ( z ) = ∑ k = 1 N A k s − s k = 0.1435 − 0.2486 i 1 − ( 0.6485 − 0.5237 i ) z − 1 + 0.1435 + 0.2486 i 1 − ( 0.6485 + 0.5237 i ) z − 1 − 1.0714 − 0.0001 i 1 − ( 0.5346 + 0.2901 i ) z − 1 + − 1.0714 + 0.0001 i 1 − ( 0.5346 − 0.2901 i ) z − 1 0.9278 − 1.6093 i 1 − ( 0.4986 + 0.0916 i ) z − 1 + 0.9278 + 1.6093 i 1 − ( 0.4986 − 0.0916 i ) z − 1 H(z)=\sum_{k=1}^N\frac{A_k}{s-s_k}=\\ \frac{0.1435-0.2486i}{1-(0.6485- 0.5237i)z^{-1}}+ \frac{0.1435+0.2486i}{1-(0.6485+0.5237i)z^{-1}}\\ \frac{-1.0714-0.0001i}{1-(0.5346+0.2901i)z^{-1}}+ \frac{-1.0714+0.0001i}{1-(0.5346-0.2901i)z^{-1}} \\ \frac{0.9278-1.6093i}{1-(0.4986+0.0916i)z^{-1}}+ \frac{0.9278+1.6093i}{1-(0.4986-0.0916i)z^{-1}} H(z)=k=1∑Ns−skAk=1−(0.6485−0.5237i)z−10.1435−0.2486i+1−(0.6485+0.5237i)z−10.1435+0.2486i1−(0.5346+0.2901i)z−1−1.0714−0.0001i+1−(0.5346−0.2901i)z−1−1.0714+0.0001i1−(0.4986+0.0916i)z−10.9278−1.6093i+1−(0.4986−0.0916i)z−10.9278+1.6093i
三、使用matlab实现
1.通过传递函数实现
对于上文最终得到的传递函数,使用matlab画出频率响应,并给出信号为 50Hz 和 200Hz 叠加信号,进行滤波器过滤
% 合并共轭对为二阶分式(实数系数)% 第一对:项1和项2
A1 = 0.1435 - 0.2486i; % 分子系数
p1 = 0.6485 - 0.5237i; % 极点% 计算二阶分式的分子和分母
num_biquad1 = [2*real(A1), -2*real(A1*conj(p1))]; % 分子多项式
den_biquad1 = [1, -2*real(p1), abs(p1)^2]; % 分母多项式% 第二对:项3和项4
A2 = -1.0714 - 0.0001i;
p2 = 0.5346 + 0.2901i;num_biquad2 = [2*real(A2), -2*real(A2*conj(p2))];
den_biquad2 = [1, -2*real(p2), abs(p2)^2];% 第三对:项5和项6
A3 = 0.9278 - 1.6093i;
p3 = 0.4986 + 0.0916i;num_biquad3 = [2*real(A3), -2*real(A3*conj(p3))];
den_biquad3 = [1, -2*real(p3), abs(p3)^2];% 创建传递函数并相加(实数系数)
sys_total = tf(num_biquad1, den_biquad1, 1, 'Variable', 'z^-1') + ...tf(num_biquad2, den_biquad2, 1, 'Variable', 'z^-1') + ...tf(num_biquad3, den_biquad3, 1, 'Variable', 'z^-1');% 验证系数为实数
disp('分子系数:');
disp(sys_total.Numerator{1})
disp('分母系数:');
disp(sys_total.Denominator{1})% 计算频率响应(采样率16kHz,实际设置Ts=1/16000)
Fs = 1000;
N_freq = 1024;
[H_total, w] = freqz(sys_total.Numerator{1}, sys_total.Denominator{1}, N_freq, Fs);% 归一化频率(0到π)
f_normalized = w / (Fs/2) * pi; % 绘制归一化幅频响应
figure;
plot(f_normalized/pi, 20*log10(abs(H_total))); % 归一化为 ×π rad/sample
xlabel('Normalized Frequency (×π rad/sample)');
ylabel('Magnitude (dB)');
title('Normalized Frequency Magnitude Response');
grid on;% 进行滤波测试
t = 0:1/Fs:1; % 1秒信号
x = sin(2*pi*50*t) + sin(2*pi*200*t); % 50Hz 和 200Hz 叠加信号
y = filter(b, a, x); % 通过滤波器% 画出滤波前后的信号
figure;
subplot(2,1,1);
plot(t, x);
title('输入信号 (50Hz + 200Hz)');
xlabel('时间 (s)');
ylabel('幅值');
grid on;subplot(2,1,2);
plot(t, y);
title('滤波后信号');
xlabel('时间 (s)');
ylabel('幅值');
grid on;
2.使用matlab工具
matlab自带的工具转换,只需要输入指标
clc; clear; close all;% 设计巴特沃斯滤波器
N = 3; % 阶数 (可能需要调整)
Wp = 0.2 * pi; % 归一化通带频率
Ws = 0.3 * pi; % 归一化阻带频率
Rp = -20 * log10(0.89125); % 通带最大衰减 (dB)
Rs = -20 * log10(0.17783); % 阻带最小衰减 (dB)% 设计模拟低通巴特沃斯滤波器
[~, Wn] = buttord(Wp/pi, Ws/pi, Rp, Rs);
[b, a] = butter(N, Wn);Fs=1000;
% 计算数字滤波器频率响应
[H, w] = freqz(b, a, 1024, Fs);
f_normalized = w / (Fs/2) * pi; % 绘制幅频响应
figure;
subplot(2,1,1);
plot(f_normalized/pi, abs(H)); grid on;
xlabel('归一化频率 (\times\pi rad/sample)');
ylabel('幅值');
title('滤波器幅频响应');% 进行滤波测试
t = 0:1/Fs:1; % 1秒信号
x = sin(2*pi*50*t) + sin(2*pi*200*t); % 50Hz 和 200Hz 叠加信号
y = filter(b, a, x); % 通过滤波器% 画出滤波前后的信号
figure;
subplot(2,1,1);
plot(t, x);
title('输入信号 (50Hz + 200Hz)');
xlabel('时间 (s)');
ylabel('幅值');
grid on;subplot(2,1,2);
plot(t, y);
title('滤波后信号');
xlabel('时间 (s)');
ylabel('幅值');
grid on;
总结
本篇文章给定的采样率是1kHz,根据给出的滤波器指标,我们过滤的是100Hz以上的语音信号,过渡带的范围是在150H以内。有兴趣的同学可以将给出的matlab程序修改一下验证其他采样率的过滤效果。
那么我们也通过对于脉冲响应不变法的原理和频域分析知道,对于脉冲响应不变法设计滤波器时,存在混叠的影响,所以适合于低通滤波器。那么下一章将介绍另外一种滤波器设计方法:双线性变换法。
反正收藏也不会看,不如点个赞吧
相关文章:
音频进阶学习二十五——脉冲响应不变法实现低通滤波器
文章目录 前言一、脉冲响应不变法1.定义2.模拟系统冲激响应的周期采样3.模拟系统和数字系统的频域响应关系1)S域和Z域的关系2)幅频响应的关系 4.通过有理函数设计滤波器5.总结 二、低通滤波器的设计实例1.给定数字滤波器指标2.转换模拟滤波器指标3.模拟滤…...
Linux中输入输出管理技巧
一、输入输出使用到的系统资源 1、字符设备(Character Devices) 什么是字符设备 字符设备是 Linux 中的一类设备,支持以字符为单位进行数据传输。与块设备不同,字符设备不需要缓 冲区,即数据是逐字节直接传递的。典…...
wireshark抓包工具的使用
下载地址:https://www.wireshark.org/#downloadLink 安装方式,一路next。 使用方式 第一步启动后选择你要抓包的网卡,ipconfig 可以查看你的默认网卡,我的是 以太网 双击进入。 筛选操作(快速筛选方式)…...
javaweb自用笔记:文件上传案例、登录(统一拦截)案例
文件上传 或者说新建一个类配置好信息,然后到aliOssUtils里面用getter、setter方法获取到配置项 登录(统一拦截) 前端要json格式的数据,捕获到异常后前端可以显示错误(对不起,操作失败,请联系管…...
【区块链安全 | 第十七篇】类型之引用类型(一)
文章目录 引用类型数据存储位置分配行为 数组特殊数组:bytes 和 string 类型bytes.concat 和 string.concat 的功能分配 memory 数组数组字面量(Array Literals)二维数组字面量数组成员(Array Members)悬空引用&#x…...
2025国内DevOps新手突围指南:从Gitee零门槛入门到工具链深度对比
对于刚接触DevOps的新手,推荐优先选择Gitee DevOps平台,其次是Jenkins和GitLab。Gitee DevOps作为国内领先的一站式研发效能平台,深度融合代码托管、持续集成/持续交付(CI/CD)、项目协作等功能,不仅界面简洁…...
【C语言】文件操作(2)
一、文件的随机读写 在前面我们学习了文件的顺序读写的函数,那么当我们要读取某个指定位置的内容的时候,是否只能顺序的读取到这个内容?还有在对文件进行输入的时候,需要对指定的位置进行写入,那么此时应该怎么办呢&a…...
将内网的IP地址映射到外网的几种方案
文章目录 1. 背景与目标2. 核心方案选型3. 方案A:路由器端口映射(详细步骤)3.1 前置条件3.2 配置流程3.3 验证访问 4. 方案B:云平台NAT网关配置(以阿里云为例)4.1 前置条件4.2 配置流程4.3 验证访问 5. 方案…...
基于深度学习的图像超分辨率技术研究与实现
一、引言 在数字图像处理领域,图像超分辨率技术一直是一个备受关注的热点话题。随着人们对图像质量要求的不断提高,如何将低分辨率图像提升到高分辨率,同时保持图像的细节和清晰度,成为了一个极具挑战性的问题。传统的图像超分辨率技术主要依赖于插值方法,如双线性插值、双…...
A股复权计算_权息数据整理
目录 前置: 步骤: 1 以通达信为参照 2 从优矿获取所需数据 2.1 股票配股信息 2.2 股票分红信息 2.3 股票拆股信息 3 合并数据,制成权息数据表 权息数据截止20250329.7z 视频 前置: 1 本系列将以 “A股复权计算_” 开头…...
如何进行Prompt调优?
一. 神奇的咒语 在输入prompt前,加入下面这一段“神奇的咒语”,中文或者英文,就能帮你优化提示词。 I want you to become my Expert Prompt Creator. Your goal is to help me craft the best possible prompt for my needs. The prompt yo…...
Git Tag 详解:版本管理与实战指南
文章目录 Git Tag 详解:版本管理与实战指南1. Git Tag 的类型2. Git Tag 的常见操作(1) 创建标签① 创建轻量标签② 创建附注标签③ 给指定的提交打标签 (2) 查看标签(3) 删除标签(4) 推送标签到远程① 推送单个标签② 推送所有标签 (5) 删除远程标签 3. 使用 Tag 的…...
从零开始打造HTML5拼图游戏:一个Canvas实战项目
从零开始打造HTML5拼图游戏:一个Canvas实战项目 先看效果: 你是否曾经被那些精美的网页拼图游戏所吸引?用 HTML5 的 Canvas 技术,从零开始,教你怎么画图、处理鼠标事件,还有游戏的核心逻辑,…...
【数据分享】2000—2024年我国乡镇的逐年归一化植被指数(NDVI)数据(年最大值/Shp/Excel格式)
之前我们分享过2000-2024年我国逐年的归一化植被指数(NDVI)栅格数据,该逐年数据是取的当年月归一化植被指数(NDVI)的年最大值!另外,我们基于此年度栅格数据按照行政区划取平均值,得到…...
设计模式 Day 2:工厂方法模式(Factory Method Pattern)详解
继 Day 1 学习了单例模式之后,今天我们继续深入对象创建型设计模式——工厂方法模式(Factory Method)。工厂方法模式为对象创建提供了更大的灵活性和扩展性,是实际开发中使用频率极高的一种设计模式。 一方面,我们将简…...
TensorFlow SegFormer 实战训练代码解析
一、SegFormer 实战训练代码解析 SegFormer 是一个轻量级、高效的语义分割模型,结合了 ViT(视觉 Transformer) 和 CNN 的高效特征提取能力,适用于边缘 AI 设备(如 Jetson Orin)。下面,我们深入…...
51c嵌入式~单片机~合集7~※
我自己的原文哦~ https://blog.51cto.com/whaosoft/13692314 一、芯片工作的心脏--晶振 在振荡器中采用一个特殊的元件——石英晶体,它可以产生频率高度稳定的交流信号,这种采用石英晶体的振荡器称为晶体振荡器,简称晶振。 制作方法 …...
私有知识库 Coco AI 实战(一):Linux 平台部署
Coco AI 是一个完全开源、跨平台的统一搜索和生产力工具,能够连接各种数据源,包括应用程序、文件、Google Drive、Notion、Yuque、Hugo 等,帮助用户快速智能地访问他们的信息。通过集成 DeepSeek 等大型模型,Coco AI 实现了智能个…...
大模型高质量rag构建:A Cheat Sheet and Some Recipes For Building Advanced RAG
原文:A Cheat Sheet and Some Recipes For Building Advanced RAG — LlamaIndex - Build Knowledge Assistants over your Enterprise DataLlamaIndex is a simple, flexible framework for building knowledge assistants using LLMs connected to your enterpris…...
LeetCode 78.子集
问题描述 给定一个不含重复元素的整数数组 nums,返回其所有可能的子集(幂集)。 示例 输入: nums [1,2,3] 输出: [ [], [1], [1,2], [1,2,3], [1,3], [2], [2,3], [3] ]解法:回溯算法 回溯是一种 暴力…...
变量(Variable)
免责声明 如有异议请在评论区友好交流,或者私信 内容纯属个人见解,仅供学习参考 如若从事非法行业请勿食用 如有雷同纯属巧合 版权问题请直接联系本人进行删改 前言 提示:从小学解方程变量x,到中学阶段函数自变量x因变量y&…...
【STM32】最后一刷-江科大Flash闪存-学习笔记
FLASH简介 STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分,通过闪存存储器接口(外设)可以对程序存储器和选项字节进行擦除和编程,(系统存储器用于存储原厂写入的BootLoader程序,用于串口…...
Dify 深度集成 MCP实现灾害应急响应
一、架构设计 1.1 分层架构 #mermaid-svg-5dVNjmixTX17cCfg {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-5dVNjmixTX17cCfg .error-icon{fill:#552222;}#mermaid-svg-5dVNjmixTX17cCfg .error-text{fill:#552222…...
2025 年上半年软考信息系统项目管理师备考计划
2025 年上半年软考信息系统项目管理师备考计划 2025 年上半年软考信息系统项目管理师考试时间为 5 月 24 日 - 27 日,从现在开始备考,需合理规划,高效学习。以下为详细备考计划: 一、基础学习阶段(现在 - 4 月上…...
Scikit-learn使用指南
1. Scikit-learn 简介 定义: Scikit-learn(简称 sklearn)是基于 Python 的开源机器学习库,提供了一系列算法和工具,用于数据挖掘、数据预处理、分类、回归、聚类、模型评估等任务。特点: 基于 NumPy、SciP…...
学习大模型需要具备哪些技术、知识和基础
数学基础 概率论与数理统计:用于理解模型中的不确定性、概率分布,以及进行数据的统计分析、评估模型的性能等。例如,通过概率分布来描述模型预测结果的可信度,利用统计方法对数据进行抽样、估计模型的参数等。线性代数࿱…...
十五届蓝桥杯省赛Java B组(持续更新..)
目录 十五届蓝桥杯省赛Java B组第一题:报数第二题:类斐波那契数第三题:分布式队列第四题:食堂第五题:最优分组第六题:星际旅行第七题:LITS游戏第八题:拼十字 十五届蓝桥杯省赛Java B…...
Flink SQL Client bug ---datagen connector
原始sql语句如下 CREATE TABLE test_source (event_time TIMESTAMP(3), -- 事件时间(精确到毫秒)click INT, -- 随机数值字段WATERMARK FOR event_time AS event_time - INTERVAL 5 SECOND WITH (connector datagen, …...
股指期货的多头套期保值是什么意思?
多头套期保值,又叫“买入套期保值”,听起来很复杂,其实很简单。它的核心就是“提前锁定价格,防止未来价格上涨”。 举个例子,假设你是一家工厂的老板,过几个月要买一批原材料。现在原材料的价格是100元/吨…...
hadoop集群配置-scp命令
scp 命令用于在不同主机之间复制文件或目录,在Hadoop集群配置中常用于将配置文件或相关资源分发到各个节点。以下是 scp 命令的基本用法和在Hadoop集群配置中的示例: 基本语法 scp [-r] [源文件或目录] [目标用户目标主机:目标路径] - -r :…...
Redis 源码硬核解析系列专题 - 结语:从源码看Redis的设计哲学
1. 引言 通过前七篇的源码解析,我们从Redis的整体架构、核心数据结构、事件驱动模型,到内存管理、持久化、主从复制与集群模式,逐步揭开了Redis高性能与简洁性的秘密。本篇将总结这些技术细节,提炼Redis的设计哲学,并探讨如何将源码学习成果应用到实际开发中。 2. Redis的…...
解决QSharedPointer栈变量的崩溃问题
目录 参考崩溃代码现象 解决 参考 QSharedPointer的陷阱 qt中的共享指针,QSharedPointer类 崩溃 代码 #include <QtCore/QCoreApplication> #include <QDebug> #include <QSharedPointer>class MyClass { public:void doSomething() {qDebug…...
Lambda 表达式是什么以及如何使用
目录 📌 Kotlin 的 Lambda 表达式详解 🎯 什么是 Lambda 表达式? 🔥 1. Lambda 表达式的基本语法 ✅ 示例 1:Lambda 基本写法 ✅ 示例 2:使用 it 关键字(单参数简化) ✅ 示例 3…...
C++自定义迭代器
实现自己的迭代器 最近在写数据结构,使用类模板实现,碰到了一些问题,其中有一个就是遍历的问题,查阅资料最后实现了自己的迭代器,让我实现的数据结构能像STL一样进行for循环遍历。 类的构成 #include <stdexcept…...
PWA 中的 Service Worker:如何实现应用离线功能
前言 在当今快速发展的互联网时代,Progressive Web App (PWA) 正在逐步成为现代 Web 开发的主流选择。PWA 将 Web 应用和原生应用的最佳特性相结合,提供了丰富的用户体验。而在 PWA 的众多技术中,Service Worker 无疑是其核心组件之一。 作…...
dockerfile制作镜像
1.docker pull centos:centos7 2.dockerfile内容 FROM centos:centos7 #指定镜像维护的作者和邮箱 MAINTAINER csdn< **********qq.com #设置环境变量mypath ENV MYPATH /usr/local #设置进入容器的默认目录是/usr/local WORKDIR $MYPATH # 下载并替换 CentOS 镜像源 RUN …...
网络空间安全(46)DevSecOps概述
一、定义与核心理念 DevSecOps是“开发(Development)、安全(Security)和运营(Operations)”的结合,它将安全实践融入软件开发生命周期的每个阶段,从需求、设计、开发、测试到部署和运…...
LeetCode 211
实现支持通配符的字典树(Trie):解决单词匹配问题 一、问题描述 我们需要设计一个数据结构,支持以下功能: 添加新单词搜索字符串是否与任何已添加的单词匹配,其中搜索字符串可能包含通配符 .(…...
Docker Compose 启动jar包项目
参考文章安装Docker和Docker Compose 点击跳转 配置 创建一个文件夹存放项目例如mydata mkdir /mydata上传jar包 假设我的jar包名称为goudan.jar 编写dockerfile文件 vim app-dockerfile按键盘上的i进行编辑 # 使用jdk8 FROM openjdk:8-jre# 设置时区 上海 ENV TZAsia/Sh…...
利用deepseek直接调用其他文生图网站生成图片
这次deepseek输入中文后,其实翻译英文后,是可以丢到比如pollinations.这个网站,来生成图片,用法如下: 你是一个图像生成助手,请根据我的简单描述,想象并详细描述一幅完整的画面。 然后将你的详…...
远程装个Jupyter-AI协作笔记本,Jupyter容器镜像版本怎么选?安装部署教程
通过Docker下载Jupyter镜像部署,输入jupyter会发现 有几个版本,不知道怎么选?这几个版本有什么差别? 常见版本有: jupyter/base-notebookjupyter/minimal-notebookjupyter/scipy-notebookjupyter/datascience-notebo…...
11. 盛最多水的容器
leetcode Hot 100系列 文章目录 一、核心操作二、外层配合操作三、核心模式代码总结 一、核心操作 最左右两边逐步往中间走,每次在左右中选取小的一个或–记录最大面积 提示:小白个人理解,如有错误敬请谅解! 二、外层配合操作…...
Selenium Web自动化如何快速又准确的定位元素路径,强调一遍是元素路径
如果文章对你有用,请给个赞! 匹配的ChromeDriver和浏览器版本是更好完成自动化的基础,可以从这里去下载驱动程序: 最全ChromeDriver下载含win linux mac 最新版本134.0.6998.165 持续更新..._chromedriver 134-CSDN博客 如果你问…...
Kotlin 基础语法解析
详细的 Kotlin 基础语法解析,结合概念说明和实用场景: --- ### **一、变量与常量** #### **1. 变量类型** - **val**(不可变变量):声明后不可重新赋值,类似 Java 的 final。 kotlin val name "Kotl…...
html 列表循环滚动,动态初始化字段数据
html <div class"layui-row"><div class"layui-col-md4"><div class"boxall"><div class"alltitle">超时菜品排行</div><div class"marquee-container"><div class"scroll-…...
【大模型基础_毛玉仁】5.4 定位编辑法:ROME
目录 5.4 定位编辑法:ROME5.4.1 知识存储位置1)因果跟踪实验2)阻断实验 5.4.2 知识存储机制5.4.3 精准知识编辑1)确定键向量2)优化值向量3)插入知识 5.4 定位编辑法:ROME 定位编辑:…...
Using SAP an introduction for beginners and business users
Using SAP an introduction for beginners and business users...
Android学习总结之RecyclerView补充篇
在 Android 开发中,列表数据更新的性能一直是关键痛点。传统的 notifyDataSetChanged() 会触发全量刷新,导致不必要的界面重绘。而 DiffUtil 作为 Android 提供的高效差异计算工具,能精准识别数据变化,实现局部更新,成…...
mapbox基础,使用geojson加载cluster聚合图层
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️circle点图层样式二、🍀使用geojson加…...
函数:static和extern
0.前言 在正式开始之前先说作用域和生命周期 作用域: 作用域有分为局部变量和全局变量 局部变量:一个变量仅在其中一段代码内起作用 全局变量:所有的代码都可以使用这个变量 生命周期: 生命周期是一个代码从运行开始到结束…...