我有一个带通滤波器是 s域的,分子为[0 31(20002pi) 0],分母为[1 3*(20002pi) (20002pi)^2],我想用在离散域,我想用simulink中的matlab function模块实现,我怎么做
时间: 2024-01-24 22:20:15 浏览: 123
基于MAX291的无限增益多路反馈带通滤波器
首先,将该带通滤波器从 s 域转换到 z 域,可以使用 bilinear transform 方法进行转换。具体步骤如下:
1. 将 s 域的分子、分母多项式用 Laplace 变换转换为 S 域的函数 H(s),即:
H(s) = 31(20002π)s / (s^2 + 3(20002π)s + (20002π)^2)
2. 将 S 域的函数 H(s) 用双线性变换法转换为 Z 域的函数 H(z),即:
H(z) = H(s)|s=(2/T)(1-z^-1)/(1+z^-1)
其中 T 为采样周期。
将 H(s) 代入上式,得到 H(z) 的表达式:
H(z) = [0.00001562 0 -0.00001562] / (1 - 1.9999z^-1 + 0.9999z^-2)
注意,由于在双线性变换中,s 与 z 的关系为 s=(2/T)(1-z^-1)/(1+z^-1),因此在 Matlab 中需要先设置采样周期 T,然后计算出双线性变换的系数。
接下来,在 Simulink 中使用 Matlab Function 模块实现该滤波器。具体步骤如下:
1. 在 Simulink 中添加一个 Matlab Function 模块,双击打开该模块。
2. 在 Matlab Function 模块中编写 Matlab 代码,实现该滤波器的离散域计算。例如:
function y = my_filter(u)
persistent x;
if isempty(x)
x = zeros(2, 1);
end
b = [0.00001562 0 -0.00001562];
a = [1 -1.9999 0.9999];
y = b(1)*u + b(2)*x(1) + b(3)*x(2) ...
- a(2)*y(1) - a(3)*y(2);
x(2) = x(1);
x(1) = u;
y(2) = y(1);
y(1) = y;
end
其中,b 和 a 分别为离散域的分子、分母系数,在代码中进行了硬编码。x 和 y 分别为滤波器的状态变量,用于保存上一次的输入和输出。
3. 在 Simulink 中连接输入信号和 Matlab Function 模块,并设置相应参数,如采样周期 T、数据类型等。
4. 运行 Simulink 模型,即可得到带通滤波器的输出信号。
阅读全文