数字信号处理 三、再探时域数字信号处理

基本信号与基本算法

信号的表示方法

  • 本章以一维信号为学习对象
  • 连续信号f(t)
  • 对应离散序列 x[n],其中 x[n] 是对 f(t) 的取样
  • n 表示范围落在R,R+,RR_-,R_+,R中的整数
    • n 的单位是“个”,即没有单位
    • n<0指的是记录器开始的数据,无穷表示“未知”

离散时间信号的书写表示

  • 大括号内数字序列:

    {x[n]}={...,0.2,2.2,1.1,0.2,3.7,...}\{x[n]\}=\{...,-0.2,2.2,1.1,0.2,-3.7,...\}

  • 在上市中x[1]=0.2,x[0]=2.2,x[1]=1.1x[-1]=-0.2,x[0]=2.2,x[1]=1.1

  • n 的范围必须标注,如n=-3:5 或 -1<n<无穷

  • x不能大写,大写的表示频域

离散时间信号的编程

  • 在编程处理中,一个序列的起始时间不一定是0或1
    • 如x[n],n=-3:5
    • 各个编程语言中数组都是从0或者1 indexed
    • 或用其它方法,定义n数列,定义其实坐标+换算的方法进行处理。
  • 编程练习作业1(推荐,选做)
    • 定义一个数组表示信号,信号的起始时间不是0或者1

信号的表示

  • 信号维度不受限制
    • 多维信号还可以分为单一信号源的多维信号和多源的多维信号
  • 本课主要讨论1维,但实践中大多是2维、3维及更高维度的信号
  • 多不同维度进行简单展示y=f(x1,x2,x3,...)y=f(x_1,x_2,x_3,...)

信号维度展示 1维

语音信号

信号维度展示 2维

灰度图像

信号维度展示 3维

RGB 3维彩色图像

信号维度 4维

视频信号 每帧是个彩色图像3维+时间1维

V=f(x,y,c,t)V=f(x,y,c,t)

信号维度的学习与理解

  • 上课学习处理1维信号
  • 对于高维信号,算法会有升维的运算
    • 2维卷积,2维傅里叶变换
    • 难度不高
  • 很多情况下,各个维度具有独立性,或者如果我们只希望观测某一个维度的性质,可以把高维信号使用一维方法处理

4维信号的1维处理案例:潜意识广告

几个基本的信号分类

  • 除了连续、离散的信号分类外,还有
    • 实函数和复函数
      • 关于复数信号的一些说明
    • 纯量信号,只有一个信号源产生
    • 由多个信号源产生的信号

基本处理方法

  • 基本处理包括
    • 多信号处理:加法、数乘、乘法
    • 卷积、差分、微分等

基本处理-补零

对不齐就必须补零

  • 补零是基本的处理操作
    • 对于不同长度或不在统一时间范围的序列的运算,必须先对部一致的部分序列做适当的补零
    • 例子(看不清)
    • 例子(看不清)

基本处理-加法

  • 加法运算

    • f(t)=g(t)+k(t)f(t)=g(t)+k(t)
  • 应用例子:去噪

  • 滑动窗口

基本运算-乘法

  • 乘法运算:放大器,一般会将噪声干扰一起放大, 需要和其它处理方法配合使用

应用:

  • 遮罩
  • 调制,如:用不同的正弦信号调制任意模拟信号

基本运算-时移

时间位移运算

g(t)=f(t0t)g(t)=f(t_0-t)

离散版本

g(n)=f(nN)g(n)=f(n-N),其中 N 为整数。

其中

  • N>0N>0,延迟运算
  • N<0N<0,超前运算

基本运算-反折

  • 时间反向或是折迭运算

    g(t)=f(t)g(t)=f(-t)

  • 离散格式y[n]=x[n]y[n]=x[-n]

基本运算-拉伸

g(t)=f(kt)g(t)=f(k*t)

上采样和下采样

相对复杂的运算

基本运算-差分

  • 离散格式: x[n] 代替f(t) ,则最小间隔由Δt→0而Δn=1,

    f(t+Δt)→x[n+Δn]=x[n+1]

    f(t)→x[n]

    ⇒ x′ [n]=x[n+1]-x[n]

  • 上述公式成为离散序列的差分

基本运算-累加

差分的逆运算

卷积

  • 卷积是整个数字信号处理中最重要的运算。

    • 我们所学的基础处理整合起来称为“系统”
    • 在本课程中我们只学习一种系统“线性时不变系统”
    • 一个线性时不变系统,不管多么复杂,其都可以变成输出信号=输入信息与特定(且固定)信号的卷积
  • 即:本课程的任何系统,都可以用卷积来表示和研究。

  • 卷积分为两种:线性卷积和周期(循环)卷积

  • 线性卷积的连续性表达式为

F(t)=f(t)g(t)=abf(tm)g(m)dmF(t)=f(t)∗g(t)=∫_a^bf(t-m)⋅g(m)dm

  • 其离散表示

y(n)=x(n)h(n)=k=x[nk]h[k]y(n)=x(n)∗h(n)=∑_{k=-∞}^∞x[n-k]⋅h[k]

  • 注1:上述式子中的h(n)为什么使用h在后文会有所解释

  • 注2:请注意上述式子中的所有时间序列符号, y(n), x(n), h(n),累加中的x[n-k],h[k] 累加的上下限分别为∞,-∞

  • 运算基本流程: y(n)=x(n)h(n)=k=x[nk]h[k]y(n)=x(n)∗h(n)=∑_{k=-∞}^∞x[n-k]⋅h[k]

    • 将h(n)反转,作为滑动窗
    • 对应公式中的 h(k)与x(n-k)
    • 窗口内处理h(n),并进行对位相乘后求和
    • 对应公式中的k=∑_{k=-∞}^∞,滑动窗内求和
    • 将滑动窗做x(n)最左侧一直移动到最右侧
    • 对每一个点x(n) 进行运算,在公式中没有体现,

快速卷积

  • 使用右侧对位相乘求和法求卷积,步骤:
    • 两序列右对齐(不做反转)
    • 逐个样值对应相乘但不进位
    • 同列乘积值相加(注意n=0的点)

相关说明

  • 所谓的快速卷积只是给人类手动算卷积准备的

    • 节省的时间是不需要处理边缘效果的那几次滑动
  • 当窗口很大时,节省的时间微乎其微

    • 手动编写感受
  • 所以计算机并不使用快速卷积

    • 计算机使用转频域-> 算乘法->转回时域的方法
  • 这个需要循环卷积

循环卷积

  • 循环卷积的处理分为两部分:循环扩展和卷积

  • 循环扩展:

    • 循环卷积表述方法为k-循环卷积:需要把一个长度为n的序列扩展到长度为k,然后反复“拷贝”,构造循环序列
    • 表述为 x(n)∙R_k (n)
    • 做循环的意义在于引入信号的周期性,周期信号可以使用傅立叶变换进行“真.快速卷积”
    • 请注意,循环卷积的k,是可能大于x(n)的长度N
  • 扩展后再做常规卷积,整体公式表示为

    y(n)=x(n)h(n)=(k=(x[nk]h[k])Rk(n)y(n)=x(n)⊛h(n)=(∑_{k=-∞}^∞(x[n-k]⋅h[k])∙R_k (n)

  • 循环卷积与线性卷积的关系:

    • 当x(n)与h[k]做线性卷积,其长度为N+K-1
    • L点循环卷积,长度为 L
    • 当L≥N+K-1时,两者输出序列一样
    • 当L<N+K-1时,两者输出不同
    • 请自行数学验证、计算验证、编程验证。
  • 请根据算法知识,自行估算卷积的运算复杂度

  • 为了降低卷积的算法复杂度,我们通常使用

    • 傅立叶变换->乘法->逆傅里叶变换的方法
  • 来计算 有限长序列的卷积,所以需要循环卷积

卷积的性质

1.交换律

x(n)h(n)=h(n)x(n)x(n)∗h(n)=h(n)∗x(n)

2.结合律

x(n)h1(n)h2(n)=x(n)[h1(n)h2(n)]x(n)∗h_1 (n)∗h_2 (n)=x(n)∗[h_1 (n)∗h_2 (n)]

3.分配律

x(n)[h1(n)+h2(n)]=x(n)h1(n)+x(n)h2(n)x(n)∗[h_1 (n)+h_2 (n)]=x(n)∗h_1 (n)+x(n)∗h_2 (n)

4.不存在微分、积分性质。

总结

线性操作:

  • 加法、累加、减法、数乘、差分等

线性操作打包后对应一个卷积
非线性操作:

  • 上采样、下采样