创建一个数字滤波器,从拉普拉斯到ZZ-将(零阶保持)转换为代码?

信息处理 过滤器设计 数字的
2022-02-14 21:08:10

我正在尝试在代码(C)中创建一个数字滤波器,但任何语言都可以。现在我有一个模拟滤波器,我用拉普拉斯域中的一个方程表示,我想尝试以数字方式实现它。

所以我的过滤器在拉普拉斯域中有这种形式:

as+bcs2+ds

然后我使用 MATLAB 的c2d命令,该命令使用零阶保持转换(我对此的掌握非常差,所以这可能是错误的),它给了我这个公式:

(5105)z67z2z

我尝试遵循一个我发现使用 Tustin 方法的示例c2d,但是当我在 MATLAB 中使用 Tustin 中的函数时,它给了我一个错误。

我的尝试是

hzijz2kz

b0=i,b1=h,b2=0,a0=0,a1=k,a2=j

然后我尝试过(这是错误的)

output=z0b0+z1b1+z2b2z2=z1z1=z0z0=inputa0z0a1z1a2z2

1个回答

我查看的示例使用了 tustin 或双线性转换,而不是零阶保持(matlabs“c2d”命令的默认值)。因此,这更像是对我想做的事情的回答,而不是我上面提出的问题。

我通过采用 s 域函数解决了以下问题(将 s 域函数转换为代码)。

as+bcs2+ds

并将其放入matlab(matlab命令“g = tf([ab],[cd 0])”)。然后使用 matlab 命令“c2d(g,Ts,'tustin')”执行双线性转换,其中 g 是我的传递函数,Ts 是我的采样率。这产生了输出

ez2+fz+giz2+jz+k

然后可以从这个方程中得到 a 和 b 系数,这样(如果i!=1该等式需要乘以“i”的倒数): b0=e b1=f b2=g a0=i a1=j a2=k

然后可以通过为简单起见设置初始状态将其转换为代码

z0=z1=z2=0

然后设置一个循环,重复以下算法

output=z0b0+z1b1+z2b2
z2=z1
z1=z0
z0=inputa1z1a2z2

对于像我一样迷路的其他人,这被称为 IIR 滤波器,谷歌搜索 IIR 滤波器设计帮助很大。