一阶IIR数字滤波器的设计

最简单的低通滤波器传递函数入手

万事开头难,所以我们先研究这个最简单的滤波器传递函数:
H ( s ) = 1 1 + s H(s) = \frac{1}{1+s} H(s)=1+s1

这是一个最简单的1阶低通滤波器的传递函数,当s=0时, |H(s)|=1;当s= ∞ \infty ,|H(s)|=0。首先我们需要确定这个滤波器的截止频率,分析连续时间域的傅氏变换形式: H ( j Ω ) = 1 1 + j Ω H(j\Omega) = \frac{1}{1+j\Omega} H(jΩ)=1+jΩ1 求|H(j Ω \Omega Ω)|=1/ 2 \sqrt 2 2 等价于求 Ω = 1 \Omega=1 Ω=1 Ω \Omega Ω=2 π \pi πf,所以此滤波器的-3db截止频率是f=1/2 π \pi π=0.159 Hz。这个恐怕是没办法满足大部分要求的。

对原始滤波器的改造

H ( s ) = Ω c Ω c + s H(s) = \frac{\Omega_c}{\Omega_c+s} H(s)=Ωc+sΩc
这里 Ω c \Omega_c Ωc=2 π \pi π f c f_c fc, 通过这个函数可以轻松的搞定截止频率的问题,看上去我们的这个巴特沃兹一阶滤波器好像可以用了。

低通变高通

用s= 1 s \frac{1}{s} s1 带入上面的公式,就会得到高通滤波器了。
H ( s ) = Ω c s Ω c s + 1 H(s) = \frac{\Omega_c s}{\Omega_c s+1} H(s)=Ωcs+1Ωcs
可以直观的观察当s=0时, |H(s)|=0;当s= ∞ \infty ,|H(s)|=1。那此时的截止频率该怎么算,还是 Ω c \Omega_c Ωc=2 π \pi π f c f_c fc吗?答案当然是否定的了,我们定义高通截止频率 Ω h \Omega_h Ωh= 1 Ω c \frac{1}{\Omega_c} Ωc1,显然,之前在 设计低通的时候确定的截止频率要取倒数了,或者干脆放弃 Ω c \Omega_c Ωc 1 Ω h \frac{1}{\Omega_h} Ωh1=2 π \pi π f h f_h fh,我们得到 f h f_h fh= 1 2 π Ω h \frac{1}{2\pi\Omega_h} 2πΩh1
当然,我们可以用另一个直观的表达来重写这个传递函数
H ( s ) = s s + Ω h H(s) = \frac{s}{s+\Omega_h} H(s)=s+Ωhs
可以看出 Ω h \Omega_h Ωh就是截止频率了。

低通变带通

低通变带通要比之前变高通复杂了,替换公式
s = s 2 + Ω m 2 B W s s = \frac{s^2+\Omega_m ^2}{BWs} s=BWss2+Ωm2
代入最原始的低通滤波器,我们会得到如下传递函数
H ( s ) = B W s s 2 + Ω m 2 + B W s H(s) = \frac{BWs}{s^2+\Omega_m ^2+BWs} H(s)=s2+Ωm2+BWsBWs
数学推算,留给读者自己吧,我也没有推出来,以后理清了再补上。

高通变带阻

高通变带阻,一样的替换公式,
s = s 2 + Ω c 2 B W s s = \frac{s^2+\Omega_c ^2}{BWs} s=BWss2+Ωc2
带入如下初始的高通滤波器
H ( s ) = s s + 1 H(s) = \frac{s}{s+1} H(s)=s+1s
得到如下传递函数
H ( s ) = s 2 + Ω m 2 s 2 + Ω m 2 + B W s H(s) = \frac{s^2+\Omega_m ^2}{s^2+\Omega_m ^2+BWs} H(s)=s2+Ωm2+BWss2+Ωm2

从模拟到数字,采用双线性变换,简单方便

假设我们需要为外放输出的数字音频作一个高通滤波器,截止频率在400Hz,采样频率48000Hz,第一章我们已经有了一个原型: H ( s ) = s s + 1 H(s) = \frac{s}{s+1} H(s)=s+1s
数字滤波器的截止频率计算公式: ω c = 2 π f f s \omega_c =\frac{2\pi f}{f_s} ωc=fs2πf

数字和模拟频率的转换关系: Ω c = ω c T \Omega_c = \frac{\omega_c}{T} Ωc=Tωc
双线性变换一般要求对频率作预畸变处理,采用如下公式: Ω c = 2 T tan ⁡ ω c 2 \Omega_c = \frac{2}{T}\tan{\frac{\omega_c}{2}} Ωc=T2tan2ωc
以400Hz截止频率和48000Hz采样率来计算: ω c = 2 π f f s = π 60 ≈ 0.05236 \omega_c =\frac{2\pi f}{f_s}=\frac{\pi}{60}\approx 0.05236 ωc=fs2πf=60π0.05236
直接变换
Ω c = ω c T ≈ 0.05236 T \Omega_c = \frac{\omega_c}{T}\approx \frac{0.05236}{T} Ωc=TωcT0.05236
预压缩变换
Ω c = 2 T tan ⁡ ω c 2 ≈ 0.05236 T \Omega_c = \frac{2}{T}\tan{\frac{\omega_c}{2}} \approx \frac{0.05236}{T} Ωc=T2tan2ωcT0.05236
居然两个结果算得一样,哈哈。做如下代换 s = s Ω c {s=\frac{s}{\Omega_c}} s=Ωcs我们得到如下传递函数 H ( s ) = s Ω c + s = s T 0.05236 + s T H(s) = \frac{s}{\Omega_c+s}= \frac{sT}{0.05236 +sT} H(s)=Ωc+ss=0.05236+sTsT
最后用双线性变换公式: s = 2 T z − 1 z + 1 = 2 T 1 − z − 1 1 + z − 1 s = \frac{2}{T} \frac{z-1}{z+1}=\frac{2}{T} \frac{1-z^{-1}}{1+z^{-1}} s=T2z+1z1=T21+z11z1把s域映射到z域:
H 1 ( z ) = 1 − z − 1 1.02618 − 0.97371 z − 1 H_1(z) = \frac{1-z^{-1}}{1.02618-0.97371z^{-1}} H1(z)=1.026180.97371z11z1

频域分析

利用Octave开源的工具,几乎可以替换Matlab, H ( z ) H(z) H(z)绘出频域响应曲线
H(z)
至此,我们一阶的高通滤波器的系数已经得出。

结论

我们用最简单的模拟低通滤波器推导出一个简单的数字高通滤波器,基本满足假设的使用要求。本文主要参考了《Real-Time Digital Signal Processing Fundamentals, Implementations and Applications》,其他内容如有纰漏欢迎回复指正,谢谢。

  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在C语言中,可以使用差分方程的形式来实现IIR数字滤波器。具体的实现步骤如下: 1. 定义滤波器的系数: - b系数:代表前馈(feedforward)系数,即输出与输入直接相关的系数。 - a系数:代表反馈(feedback)系数,即输出与过去输出相关的系数。 2. 初始化滤波器的状态变量: - y:过去输出的值。 - x:过去输入的值。 3. 实现滤波器的差分方程: - 使用循环结构,遍历输入信号的每一个样本。 - 计算当前输出值: `y[n] = b[0]*x[n] + b[1]*x[n-1] + ... + b[N]*x[n-N] - a[1]*y[n-1] - ... - a[M]*y[n-M]` - 更新状态变量: `x[n-1] = x[n]` `y[n-1] = y[n]` 下面是一个简单的示例代码,实现了一个一阶低通IIR数字滤波器: ```c #define N 2 // 前馈系数个数 #define M 1 // 反馈系数个数 float b[N+1] = {0.5, 0.5}; // 前馈系数 float a[M+1] = {1.0, -0.8}; // 反馈系数 float x[N+1] = {0}; // 输入状态变量 float y[M+1] = {0}; // 输出状态变量 float iir_filter(float input) { float output = 0; // 更新输入状态变量 for (int i = N; i > 0; i--) { x[i] = x[i - 1]; } x[0] = input; // 计算输出 for (int i = 0; i <= N; i++) { output += b[i] * x[i]; } for (int i = 1; i <= M; i++) { output -= a[i] * y[i]; } // 更新输出状态变量 for (int i = M; i > 0; i--) { y[i] = y[i - 1]; } y[0] = output; return output; } ``` 请注意,此示例仅演示了一个简单的一阶低通IIR数字滤波器的实现。对于更高或其他类型的IIR滤波器,需要相应地调整系数和状态变量的数量,并根据具体的滤波器设计进行实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值