传递函数的离散化(二)—— C实现

    传递函数要编程实现,就必须先进行离散化。前面我们介绍了一阶传函的离散化,其过程比较简单。那么对于二阶及二阶以上的传递函数怎么离散化呢?我们可以把传函转化为状态方程,这样就可以变成多个一阶的传递函数,然后再进行离散化。

一:传递函数离散化的步骤

1.传函转化为状态方程
2. 状态方程离散化

1.1 传函转化为状态方程

这里我们举一个简单的例子,把下面的传函转化为状态方程的形式:
G ( s ) = 2 s + 1 s 2 + 7 s + 9 G_{(s)}=\frac{2s+1}{s^{2}+7s+9} G(s)=s2+7s+92s+1
这里我们借助matlab工具求解,代码如下:

>> num=[2 1];
>> den=[1 7 9];
>> sys=tf(num,den)

sys =
 
     2 s + 1
  -------------
  s^2 + 7 s + 9
 
Continuous-time transfer function.

>> [A B C D]=tf2ss(num,den)

A =

    -7    -9
     1     0


B =

     1
     0


C =

     2     1


D =

     0

>> 

所以状态方程为:
[ x 2 ˙ x 1 ˙ ] = [ − 7 − 9 1 0 ] [ x 2 x 1 ] + [ 1 0 ] u   y = [ 2 1 ] [ x 2 x 1 ] \begin{bmatrix} \dot{x_{2}}\\ \dot{x_{1}} \end{bmatrix}=\begin{bmatrix} -7 & -9\\ 1 &0 \end{bmatrix}\begin{bmatrix} x_{2}\\ x_{1} \end{bmatrix}+\begin{bmatrix} 1\\ 0 \end{bmatrix}u \\ \ \\y=\begin{bmatrix} 2 & 1\end{bmatrix}\begin{bmatrix} x_{2}\\ x_{1}\end{bmatrix} [x2˙x1˙]=[7190][x2x1]+[10]u y=[21][x2x1]
化简下:
x 2 ˙ = − 7 x 2 − 9 x 1 + u x 1 ˙ = x 2 y = x 1 + 2 x 2 \dot{x_{2}}=-7x_{2}-9x_{1}+u \\\dot{x_{1}}=x_{2} \\y=x_{1}+2x_{2} x2˙=7x29x1+ux1˙=x2y=x1+2x2

1.2 状态方程离散化

我们把上面的状态方程离散化,写出matlab function模块仿真下,代码如下:

function y = fcn(u,Ts)

persistent x1 x2;
if isempty(x1)
    x1=0;
end
if isempty(x2)
    x2=0;
end

x1 = x1 + Ts*x2;
x2 = x2 + Ts*(-9*x1-7*x2+u);
y = x1+2*x2;

end

二:传递函数离散化的仿真验证

我们把上面例子中的传递函数,状态方程和离散化的代码进行仿真验证下查看其阶跃响应:
在这里插入图片描述
三种方式的阶跃响应结果完全重合如下:
在这里插入图片描述
参考模型:https://download.youkuaiyun.com/download/wanrenqi/84389722

在 MATLAB 中生成 IIR Butterworth 带通滤波器并将其离散化成 Z 域传递函数的过程涉及几个关键步骤。我们将详细介绍每一步的操作方法,并提供具体的代码示例帮助理解。 ### 设计 IIR Butterworth 滤波器 #### 1. 确定滤波器规格 首先,你需要确定以下几个参数: - **采样率** (`Fs`):信号的采样频率。 - **下截止频率** (`Wn1`) 和 **上截止频率** (`Wn2`):带通范围内的边界频率。 - **滤波器阶数** (`N`):决定了滤波器的选择性和复杂度。较高的阶数意味着更陡峭的选择特性但也增加了计算负担。 #### 2. 使用 `butter` 函数设计连续时间域 (s) 的滤波器原型 MATLAB 提供了便捷的设计工具箱函数 `butter()` 来轻松地构建理想化的Butterworth滤波器原型。该函数返回归一化的模拟低通或高通滤波器的零点、极点及增益因子。 对于带通情况,可以通过指定两个临界角频率 `[Wn1 Wn2]` 来获得相应结果: ```matlab [N, Wn] = buttord(Wp, Ws, Rp, Rs, 's'); % 计算最小所需阶次 N 及标准化边缘频率 Wn [z,p,k] = butter(N,Wn,'bandpass','s'); % 根据给定条件生成 s 平面内带通型滤波器 ``` 这里, - `buttord` 自动帮你选择合适的最低阶数; - `'bandpass'` 参数表明这是一个带通滤波器而非其他类型; - 最后的 `'s'` 表明是在 S 平面上操作。 #### 3. 将连续时间模型转换为离散时间模型 为了适应实际应用需求,通常需要将上述设计好的模拟滤波器通过某种变换转到数字领域——即从S平面转移到Z平面上工作。最常用的技术之一就是“双线性变换法”(`c2d`),它可以很好地保持原始系统的稳定性特征并且避免频谱混叠现象的发生。 下面的例子展示了如何完成这一步转化: ```matlab [b,a] = zpk2tf(z,p,k); % 把零极点形式转化为部分分式展开式的系数表示形式 [num,den] = bilinear(b,a,Fs); % 应用双线性变化法则得到对应于 T=1/Fs 秒样本周期下的 D(z) sys_digital = tf(num, den, Fs);% 创建最终数字化版本 TF 对象 ``` 注意这里的 `fs` 是指代你所使用的具体物理系统的采样速率。 #### 具体实例演示 让我们结合以上知识点编写一段完整的脚本来展示整个过程: ```matlab clear all; %% 输入设置 Fs = 8e3; % Sample Rate in Hz F_pass1 = 400; % Lower Pass Band Edge Frequency in Hz F_stop1 = 600; % Upper Stop Band Edge Frequency in Hz Rp = 3; % Pass band ripple in dB Rs = 40; % Stop band attenuation in dB %% 规格转换 & 过渡区间的定义 Wn = [F_pass1 F_stop1]/(Fs/2); [~, ~, Wp, Ws] = cheb2ord(Wn([1 2]), Wn([1 2])+1/(Fs/2)*pi*[-1 1], Rp, Rs, 's'); %% 设计Butterworth带通滤波器 [n,Wn]=buttord(Wp,Ws,Rp,Rs,'s'); [B,A] = butter(n, Wn, 'bandpass', 's'); %% 转换到离散时间域 [Z,P,K] = tf2zp(B,A); [d_num,d_den,Ts] = c2dm(Z,P,K,[],[],Fs); %% 显示结果 disp('离散化的Z域传递函数:') disp(tf(d_num, d_den)); fvtool(d_num, d_den, 'Analysis', 'freq') % 绘制幅相响应曲线 title(['Design of Digital ', num2str(length(B)-1),'th Order Butterworth Band-Pass Filter']); xlabel('Frequency (Hz)'); ylabel('Magnitude Response (dB)'); grid on; ``` 此段程序不仅实现了由连续域到离散域的成功转变,同时也附上了直观的结果图形辅助验证正确性。 --- ### 相关问题建议深入探讨的内容包括但不限于以下几方面:
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值