Matlab仿真中系统与其逆系统的H(z)H_i(z)乘积为何不等于1
你同时存在对逆系统的概念误解和代码实现错误,具体问题如下:
- 概念误解:逆系统的级联是时域先后处理,不是信号逐点相乘
逆系统的作用是还原原系统的输入:假设原系统传输函数为H(z)=B(z)/A(z),输入x(n)得到输出y(n)=H(z)x(n),逆系统传输函数为H_i(z)=A(z)/B(z),需要将y(n)作为逆系统的输入,得到输出y_rec(n)=H_i(z)y(n)=x(n),才能验证逆系统功能。你将两个系统输入同一个x(n)后逐点相乘,完全不符合逆系统的级联逻辑,自然不可能得到全1向量。 - 代码实现错误:stem绘图参数错误
stem(x,y)的调用逻辑错误,stem的第一个参数是横轴坐标,第二个是纵轴值,你当前写法会把输入信号的幅值作为横轴,不符合序列绘图的常规需求。
正确验证步骤
- 生成输入序列
x(n) - 输入原系统得到输出
y(n) - 将
y(n)输入逆系统,得到还原后的序列y_rec(n) - 对比
y_rec(n)和x(n),二者相等即可验证逆系统功能
修正后的代码
function y_rec = Inverse() % 原系统传输函数 H(z) = B(z)/A(z) b = [2 0 0.5]; a = [1 0 -0.25]; fprintf('原系统差分方程:2y(n)+0.5y(n-2) = x(n)-0.25x(n-2)\n') N = 30 ; n = 0:N-1 ; x = 0.8.^n; % 原系统输出 y = filter(b,a,x); subplot(3,1,1);stem(n,x);title('原始输入x(n)'); subplot(3,1,2);stem(n,y);title('原系统输出y(n)'); % 逆系统处理原系统的输出,还原输入 y_rec = filter(a,b,y); subplot(3,1,3);stem(n,y_rec);title('逆系统还原后的输入y_rec(n)'); % 打印误差验证 fprintf('x和还原信号的最大误差:%e\n', max(abs(x - y_rec))); end
补充说明
你当前使用的原系统是最小相位系统(所有零点都在单位圆内),因此对应的逆系统是因果且稳定的,上述验证可以得到几乎完全相等的还原结果(误差为计算精度级别的极小值)。如果原系统是非最小相位系统,对应的因果逆系统会不稳定,无法得到正确的还原结果。
内容的提问来源于stack exchange,提问作者WilliamW
相关产品推荐
相关产品推荐

