当前位置: 首页 > news >正文

数字信号处理及MATLAB仿真(2)——离散系统

        上回书说到如何来编写一些简单的离散时间序列,今天咱们就来谈谈一些关于常系数差分方程的操作吧。

        说到这里咱们对于常系数差分方程可能最关心的就是怎么去求解了。

        其中最关键的部分就是filter函数,可以用来计算系统在输入信号为x的输出信号y。大家学过这个函数的可能会有个疑问——filter函数不是一个用来滤波函数吗?对于这个我只能说问的好。因为答案往往就在疑问的背后,其实filter函数的具体工作原理是基于差分方程的数学运算。它根据输入信号x以及系数向量a和b,按照差分方程的规则逐步计算输出信号y的每个样本值。在计算过程中,会考虑输入信号的当前和过去样本值,以及输出信号的过去样本值,以得到符合差分方程关系的输出结果。这种计算方式能够模拟离散系统对输入信号的响应。需要注意的是,在使用filter函数时,要确保a向量的第一个元素不为零,否则需要对ba的元素进行相应的处理。

        来看两个例子吧。一个是一阶的方程求解,还有一个是二阶方程的求解。程序如下。

%差分方程的求解
%差分方程为y[n]-0.5y[n-1]=x[n]。

clear all
clc

% 定义差分方程系数
a = [1, -0.5]; % y[n] 的系数
b = 1;         % x[n] 的系数

% 生成输入信号 x[n](这里用正弦波示例)
n = 0:99;
x = sin(2*pi*0.1*n);

% 使用 filter 函数求解差分方程
y = filter(b, a, x);

% 绘制输入信号和输出信号
figure;
subplot(2,1,1);
plot(n, x);
xlabel('n');
ylabel('x[n]');
title('输入信号');

subplot(2,1,2);
plot(n, y);
xlabel('n');
ylabel('y[n]');
title('输出信号');

% 显示差分方程
disp('差分方程:');
disp('y[n] - 0.5y[n-1] = x[n]');

%%

% 定义差分方程系数
a = [1, -1.5, 0.7]; % y[n] 的系数
b = [1, 0.5];       % x[n] 的系数

% 生成输入信号 x[n](这里用正弦波示例)
n = 0:99;
x = sin(2*pi*0.1*n);

% 使用 filter 函数求解差分方程
y = filter(b, a, x);

% 绘制输入信号和输出信号
figure;
subplot(2,1,1);
plot(n, x);
xlabel('n');
ylabel('x[n]');
title('输入信号');

subplot(2,1,2);
plot(n, y);
xlabel('n');
ylabel('y[n]');
title('输出信号');

% 显示差分方程
disp('差分方程:');
disp('y[n] - 1.5y[n-1] + 0.7y[n-2] = x[n] + 0.5x[n-1]');

        运行结果:

        结果大概就这样了,大家细细比较还是有那么点区别。但是具体一点的区别,大家可以用双零分解的方法去求求,验证一下,理论和实际之间还是有区别的。

        接下来看看,单位冲激响应怎么搞,核心是impz函数,在 MATLAB 中,impz函数用于计算并返回数字滤波器的单位冲激响应。差分方程为y[n] - 1.5y[n-1] + 0.7y[n-2] = x[n] + 0.5x[n-1],程序如下图。

%单位冲激响应
%差分方程为y[n] - 1.5y[n-1] + 0.7y[n-2] = x[n] + 0.5x[n-1]

% 定义差分方程系数
a = [1, -1.5, 0.7]; % y[n] 的系数
b = [1, 0.5];       % x[n] 的系数

% 计算单位冲激响应
[h, n] = impz(b, a);

% 绘制单位冲激响应
figure;
stem(n, h);
xlabel('n');
ylabel('h[n]');
title('单位冲激响应');
grid on;

% 显示差分方程
disp('差分方程:');
disp('y[n] - 1.5y[n-1] + 0.7y[n-2] = x[n] + 0.5x[n-1]');

       首先,定义了差分方程中与y[n] 的系数 a 和 x[n] 的系数 b 。然后,使用 impz函数计算单位冲激响应 h以及对应的时间索引 n。接下来,通过 stem函数绘制单位冲激响应的图形xlabel 和 ylabel 分别设置了横纵坐标的标签,title 给出了图形的标题,grid on 显示网格。最后,使用 disp 函数显示了定义的差分方程。运行这段代码,将会得到单位冲激响应的图形。结果如下图所示。

今天主要讲的就是离散时间系统,结合例子理解更加的合适。

欲知后事如何,且听下回分解。OVO........

http://www.lryc.cn/news/392378.html

相关文章:

  • 大模型思维链(Chain-of-Thought)技术原理
  • gda动态调试-cnblog
  • Double 4 VR仿真情景实训教学系统在法律专业课堂上的应用
  • k8s-第一节-minikube
  • html+js+css在线倒计时
  • 构建LangChain应用程序的示例代码:55、如何实现多代理模拟,其中特权代理决定谁发言。这遵循与多代理分散发言者选择相反的选择方案
  • 船舶雷达与导航系统选择7/8防水插座的原因分析
  • 墨烯的C语言技术栈-C语言基础-006
  • 常用SHELL命令
  • Python脚本:将Word文档转换为Excel文件
  • 【单链表】03 设L为带头结点的单链表,编写算法实现从尾到头反向输出每个结点的值。
  • 鸿蒙开发设备管理:【@ohos.vibrator (振动)】
  • 【信息学奥赛】CSP-J/S初赛07 排序算法及其他算法在初赛中的考察
  • 第N7周:seq2seq翻译实战-pytorch复现-小白版
  • java集合(1)
  • 分布式数据库HBase:从零开始了解列式存储
  • 接口测试流程及测试点!
  • 已经安装deveco-studio-4.1.3.500的基础上安装deveco-studio-3.1.0.501
  • 【C++】 解决 C++ 语言报错:Use of Uninitialized Variable
  • 2024年7月6日 十二生肖 今日运势
  • ubuntu丢失网络/网卡的一种原因解决方案
  • 第6篇 共识机制深度解析:PoW、PoS、DPoS和PBFT
  • Windows环境使用SpringBoot整合Minio平替OSS
  • LeetCode 196, 73, 105
  • 在Apache HTTP服务器上配置 TLS加密
  • C语言力扣刷题11——打家劫舍1——[线性动态规划]
  • 房屋租赁管理小程序的设计
  • oracle sql语句 排序 fjd = ‘0101‘ 排在 fjd = ‘0103‘ 的前面
  • 初试成绩占比百分之70!计算机专硕均分340+!华中师范大学计算机考研考情分析!
  • 【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(十)-git(2)