《数字信号处理》学习01-离散时间信号与序列的卷积和运算

本文主要是介绍《数字信号处理》学习01-离散时间信号与序列的卷积和运算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一,信号

二,序列的运算 

1,卷积和 

2,matlab实现 


相关的电子书籍请到这篇文章所在的专栏,并通过夸克网盘链接下载。

很多简单的知识点我就不再赘述了,接下来就着重记录我学习过程中遇到的较难理解且容易忘记的知识点,如果想要再详细些的,可以在评论区留言。

这篇文章主要是用于整理我在看书过程中自己做的一些记忆方法(个人记忆方法,因人而异,仅供参考)

一,信号

1,信号是信息的载体,也是信息的物理表现形式。例如,古时的烽火就是一个信号,一看到烽火这个信号,士兵知道有敌人来犯的信息,就可以立马采取行动,保护自己的国家。

2,什么是离散时间信号?离散时间信号就是该信号在时间变化范围是不连续的,离散的。

例如下图 :

可以看到,离散时间信号中对应的序号(时刻)的序号值都是独立的,没有与其它的序号值连一起,它们就组成了序列。为了方便,后面都用序列来表示离散时间信号。

与离散时间信号相对的就是连续时间信号,如下图:

二,序列的运算 


3,序列的六个基本运算:时间尺度变换,翻褶,移位,和,积,卷积和。

为了能够记住这六个运算的名字,我将每个运算前面的第一个字取出来,组成以下的口诀:时翻移,和积卷。

【时常翻转移动,和鸡圈】

前三个运算只有一个序列进行运算,后面三个运算需要有两个序列一起参与运算。因为前五个比较简单(用数学的基本运算就可以做出来),所以在这里就不赘述它们的运算(如果有需要的请在评论区留言,我后面再补上去)。

【需要注意】:

当离散时间变量n前面有系数k: x(kn) ,在移位之前,需要把k提到n和N的前面,才能够得到正确的表达式: x(k(n+N))

例如,有一个周期性序列x(3n),现在要将该序列向左移动5位【左加右减,上加下减】,写出移位后的序列表达式:x(3(n+5))=x(3n+15)。

同理可以通过表达式x(3n+15)知道该周期性序列的移动方向和位数:x(3n+15)=x(3(n+5))→序列向左移动5位。

1,卷积和 

接下来一起学习第一个知识点“卷积和”,这三个字中每一个分别代表着对应的运算:

  • 卷:翻褶+移位
  • 积:积运算
  • 和:和运算

概念和公式如下

可以看到,卷字不愧是”卷“,一个字就要代表两种运算。

在具体的运算中,如果两个序列没有用到卷积和,那么这两个序列的形状都不会发生太大变化,但如果两个序列之间是卷积和的运算,那么其中一个序列 x(n) 还是原来的序列,只是变量换成了m(既 x (m) ),另外一个序列 h(m) 就要开始卷了!开始卷的时候,h(m) 翻身(翻褶)有了个家(加上另外一个变量n),变成了 h(n−m) 。

卷积和就是要先卷,再积,最后求和。

卷完之后,将这两个序列乘在一起: x(m)×h(n−m) ,之后再求和。

因为序列x(n)和h(n)的定义域没给,所以这两个序列卷积和之后的结果y(n)的定义域默认为负无穷到正无穷(既n属于[-∞,+∞]),在求和的时候m也需要在 [−∞,+∞] 这个区间内:\sum_{m=−∞}^{ m=+∞}x(m)×h(n−m)=y(n)

如果觉得前面的太长,y(n)的卷积和表达式也可以用 x(n)∗h(n)=y(n) 来表示。

在教材中,卷积和的具体运算如下描述↓

(有需要教材的请在评论区留言或者是私信我,我之后在文章补发个链接)

在列出卷积和公式的时候提到“因为序列x(n)和y(n)的定义域没给,所以它们两个卷积和之后的结果序列y(n)的定义域可以是负无穷到正无穷”。如果序列x(n)和y(n)的定义域给出来,例如:

x(n)的定义域为 [a1,b1] ,y(n)的定义域为 [a2,b2] ,那么这两个序列卷积和之后的结果序列y(n)的定义域就是这两个序列的定义域的起始位置和终止位置对应相加,即:

n∈[a1+a2,b1+b2]

表示:

  • y(n)的第一个非零点在n=a1+a2的位置,最后一个非零点在n=b1+b2的位置。

如果 n<a1+a2 或者是 n>b1+b2 ,那么y(n)的序列值一定是0,不需要再一个一个的去计算并求和。

如果 n∈[a1+a2,b1+b2] ,那么y(n)的序列值可能是0也可能是其他整数Z。

当n的值确定好之后(从a1+a2 一直取到 b1+b2),这个时候不可以直接使用卷积和公式:还需要确定m的取值范围。

从公式 \sum_{m=−∞}^{ m=+∞}x(m)×h(n−m)=y(n)可以看出,m的值与卷王序列h有关(h序列同时包含了n和m两个变量)。

公式里面的序列h(m)一直在变化:翻褶和移位(即 h(n−m) )。

当n取不同的值时,对应的y(n) 求和范围也会跟着h(n−m) 变,具体怎么变?请看下篇文章解说。

咳,防止看到这里的阅读者犯困 ,开个玩笑。

现在继续来一起探究单个y(n)怎么跟着h(n-m)变化:

1,h(n-m) 可以写成 h( -(m-n) )

2,当n=a1+a2时(a1+a2∈[a1+a2,b1+b2]), y(n)=y(a1+a2)

3,h(n-m)=h(-(m-n))=h(−(m−(a1+a2)))

  • 当n>0,既a1+a2>0时,h(-m)序列向右移 a1+a2 位。因为a1+a2>0时,和前面的负号没有抵消,变量m后面加上的数还是负数(既h(-(m-C))),根据“左加右减”,可以知道对应的序列是向右移位;
  • 当n<0,既a1+a2<0时,h(-m)序列向左移 a1+a2 位。因为a1+a2<0时,和前面的负号相互抵消,变量m后面加上的数是个正数(既h(-(m+C))),根据“左加右减”,可以知道对应的序列是向左移位;
  • 当n=0,既a1+a2=0时,h(-(m-0))=h(-m+0)=h(-m),只有翻褶,没有移位。

[有更快速的判断移位方向的方法:

因为m前面是负号,既m<0,所以移位的方向就是n的所在的方向,

  • n>0,n位于x轴的右边,序列h(-m)则向右移位n位变成h(n-m)];
  • n<0时,n位于x轴的左边,序列h(-m)则向左移位n位变成h(n-m)]。

4,确定m的取值范围:

之前有提到m的取值范围与卷王序列h(m)有关

  • 当序列h(m)经过翻褶,变成h(-m)之后向右移动a1+a2位时,本来h(m)的定义域(既m的取值范围)为[a2,b2],序列向右移动后m的取值范围也会跟着变,因为越往右边,数值越来越大,所以此时h(n-m)中的m∈[a2+(a1+a2),b2+(a1+a2)],这个时候就可以使用卷积和公式: \sum_{m=a1+(a1+a2)}^{m=b1+(a1+a2)}x(m)×h(a1+a2−m)=y(a1+a2) ;
  • 当序列h(m)经过翻褶,变成h(-m)之后向左移动a1+a2位时,本来h(m)的定义域(既m的取值范围)为[a2,b2],序列向左移动后m的取值范围也会跟着变,因为越往左边,数值越来越小,所以此时h(n-m)中的 m∈[a2-(a1+a2),b2-(a1+a2)],这个时候就可以使用卷积和公式: \sum_{m=b1-(a1+a2)}^{m=a1-(a1+a2)}x(m)×h(a1+a2−m)=y(a1+a2)

通过上述的分析之后,开始上题:

思路:

  1. 列出卷积和公式:\sum_{m=−∞}^{ m=+∞}x(m)×h(n−m)=y(n)
  2. 确定卷积和序列y(n)的定义域,n∈[-3+(-1),3+4]=[-4,7];
  3. y(n)的第一个非零取值是当n=-4时,此时 h(n-m)中的m取值范围[-1+(-4),4+(-4)],既m∈[-5,0],y(n)=y(-4)。 y(-4)=\sum_{m=-5}^{m=0}x(m)×h(-4−m) =x(-5)h(1)+x(-4)h(0)+x(-3)h(-1)+x(-2)h(-2)+x(-1)h(-3)+x(-0)h(-4)=0*0+0*0+3*2+11*0+7*0+0*0=6;
  4. y(n)的第二个非零取值是当n=-3时,此时 h(n-m)中的m取值范围[-1+(-3),4+(-3)],既m∈[-4,1],y(n)=y(-3)。 y(-3)=\sum_{m=-4}^{m=1}x(m)×h(-3−m)=x(-4)h(1)+x(-3)h(0)x(-2)h(-1)+x(-1)h(-2)+x(0)h(-3)=0*0+3*311*2+7*0+0*0=31;
  5. 之后依次求出y(-2)=47,y(-1)=6,y(0)=-51,y(1)=-5,y(2)=41,y(3)=18,y(4)=-22,y(5)=-3,y(6)=8,y(7)=2。
  6. 综上所述,当-4≤n≤7时,y(n)={6,31,47,6,-51,-5,41,18,-22,-3,8,2},当n为其它值时,y(n)=0。

2,matlab实现 

使用matlab软件绘制的卷积和波形图如下

代码:

x=[-3:1:3];
nx=[3,11,7,0,-1,4,2];
h=[-1:1:4];
nh=[2,3,0,-5,2,1];
ny=conv(nx,nh);
s=x(1)+h(1);
w=length(x)+length(h)-2;
y=[s:1:s+w];
stem(y,ny,'.');
xlabel('y');
ylabel('ny');
axis([s (s+w) -60 60]);
grid on;

如果想要了解更多关于卷积的matlab实现,请访问博客:

matlab学习004-使用matlab绘制卷积波形图_matlab卷积-CSDN博客

有问题请在评论区留言或者是私信我,回复时间不超过一天。

这篇关于《数字信号处理》学习01-离散时间信号与序列的卷积和运算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1127345

相关文章

如何利用Java获取当天的开始和结束时间

《如何利用Java获取当天的开始和结束时间》:本文主要介绍如何使用Java8的LocalDate和LocalDateTime类获取指定日期的开始和结束时间,展示了如何通过这些类进行日期和时间的处... 目录前言1. Java日期时间API概述2. 获取当天的开始和结束时间代码解析运行结果3. 总结前言在J

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

关于最长递增子序列问题概述

《关于最长递增子序列问题概述》本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效... 一、最长递增子序列问题概述1. 问题定义给定一个整数序列,例如 nums = [10, 9, 2

Java数字转换工具类NumberUtil的使用

《Java数字转换工具类NumberUtil的使用》NumberUtil是一个功能强大的Java工具类,用于处理数字的各种操作,包括数值运算、格式化、随机数生成和数值判断,下面就来介绍一下Number... 目录一、NumberUtil类概述二、主要功能介绍1. 数值运算2. 格式化3. 数值判断4. 随机

修改若依框架Token的过期时间问题

《修改若依框架Token的过期时间问题》本文介绍了如何修改若依框架中Token的过期时间,通过修改`application.yml`文件中的配置来实现,默认单位为分钟,希望此经验对大家有所帮助,也欢迎... 目录修改若依框架Token的过期时间修改Token的过期时间关闭Token的过期时js间总结修改若依

Go Mongox轻松实现MongoDB的时间字段自动填充

《GoMongox轻松实现MongoDB的时间字段自动填充》这篇文章主要为大家详细介绍了Go语言如何使用mongox库,在插入和更新数据时自动填充时间字段,从而提升开发效率并减少重复代码,需要的可以... 目录前言时间字段填充规则Mongox 的安装使用 Mongox 进行插入操作使用 Mongox 进行更

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

对postgresql日期和时间的比较

《对postgresql日期和时间的比较》文章介绍了在数据库中处理日期和时间类型时的一些注意事项,包括如何将字符串转换为日期或时间类型,以及在比较时自动转换的情况,作者建议在使用数据库时,根据具体情况... 目录PostgreSQL日期和时间比较DB里保存到时分秒,需要和年月日比较db里存储date或者ti

Python 标准库time时间的访问和转换问题小结

《Python标准库time时间的访问和转换问题小结》time模块为Python提供了处理时间和日期的多种功能,适用于多种与时间相关的场景,包括获取当前时间、格式化时间、暂停程序执行、计算程序运行时... 目录模块介绍使用场景主要类主要函数 - time()- sleep()- localtime()- g