0 前言
近日学习“数字信号处理”课程,上课时讲到序列卷积与相关运算,一时半会想不起来,遂趁周末复习了一下信号与系统中相关的内容,将复习所得整理如下。
1 序列卷积运算
1.1 卷积的定义
序列的卷积运算揭示了 离散信号作用于离散线性非时变系统的机理 。两个离散信号的卷积定义为:
y
[
k
]
=
x
1
[
k
]
∗
x
2
[
k
]
=
∑
n
=
−
∞
+
∞
x
1
[
n
]
x
2
[
k
−
n
]
(1.1)
y[k] = x_{1}[k] * x_{2}[k] = \sum_{n = - \infty}^{+\infty}x_{1}[n]x_{2}[k-n] \tag{1.1}
y[k]=x1[k]∗x2[k]=n=−∞∑+∞x1[n]x2[k−n](1.1)
1.2 卷积的性质
- 交换律
x 1 [ k ] ∗ x 2 [ k ] = x 2 [ k ] ∗ x 1 [ k ] x_{1}[k] * x_{2}[k] = x_{2}[k] * x_{1}[k] x1[k]∗x2[k]=x2[k]∗x1[k]
这里只对交换律进行证明,其他几条性质的证明是类似的
证:由式 ( 1.1 ) (1.1) (1.1)可得
y [ k ] = x 1 [ k ] ∗ x 2 [ k ] = ∑ n = − ∞ + ∞ x 1 [ n ] x 2 [ k − n ] (1) y[k] = x_{1}[k] * x_{2}[k] = \sum_{n = - \infty}^{+\infty}x_{1}[n]x_{2}[k-n] \tag{1} y[k]=x1[k]∗x2[k]=n=−∞∑+∞x1[n]x2[k−n](1)
换元,令 t = k − n t = k-n t=k−n,式 ( 1 ) (1) (1)变为
∑ t = + ∞ − ∞ x 1 [ k − t ] x 2 [ t ] (2) \sum_{t=+\infty}^{-\infty}x_{1}[k-t]x_{2}[t]\tag{2} t=+∞∑−∞x1[k−t]x2[t](2)
对于 累加 运算来说,将 + ∞ +\infty +∞与 − ∞ -\infty −∞颠倒一下是不影响最终结果的,因此可以将式 ( 2 ) (2) (2)写作
∑ t = − ∞ + ∞ x 1 [ k − t ] x 2 [ t ] (3) \sum_{t=-\infty}^{+\infty}x_{1}[k-t]x_{2}[t]\tag{3} t=−∞∑+∞x1[k−t]x2[t](3)
再使用 n n n替代 t t t(只是换个符号表示而已,不影响式子结果)
∑ n = − ∞ + ∞ x 1 [ k − n ] x 2 [ n ] = x 2 [ k ] ∗ x 1 [ k ] (4) \sum_{n=-\infty}^{+\infty}x_{1}[k-n]x_{2}[n]\tag{4} = x_{2}[k] * x_{1}[k] n=−∞∑+∞x1[k−n]x2[n]=x2[k]∗x1[k](4)
证毕。
- 结合律
- 分配律
- 位移特性
2 序列相关运算
为了方便记忆,一般需要将 相关运算 与 卷积运算 联系起来。
2.1 相关的定义
两个能量有限的实序列
x
[
k
]
x[k]
x[k]与
y
[
k
]
y[k]
y[k]的互相关运算定义为
r
x
y
[
n
]
=
∑
k
=
−
∞
+
∞
x
[
k
]
y
[
k
+
n
]
(2.1)
r_{xy}[n] = \sum_{k=-\infty}^{+\infty}x[k]y[k+n]\tag{2.1}
rxy[n]=k=−∞∑+∞x[k]y[k+n](2.1)
一眼看过去是不是和卷积运算 ( 1.1 ) (1.1) (1.1)很像?事实上它们确实有联系(数学推导上的),这种相似性可以帮助我们进行记忆。
以下就是通过数学推导来辅助记忆的过程
首先对于 ( 2.1 ) (2.1) (2.1)进行换元,令 t = k + n t=k+n t=k+n,于是式 ( 2.1 ) (2.1) (2.1)变为
r x y [ n ] = ∑ t = − ∞ + ∞ x [ t − n ] y [ t ] (2.2) r_{xy}[n] = \sum_{t=-\infty}^{+\infty}x[t-n]y[t]\tag{2.2} rxy[n]=t=−∞∑+∞x[t−n]y[t](2.2)
再使用 n n n替代 t t t,于是式 ( 2.2 ) (2.2) (2.2)变为
r x y [ n ] = ∑ k = − ∞ + ∞ x [ k − n ] y [ k ] (2.3) r_{xy}[n] = \sum_{k=-\infty}^{+\infty}x[k-n]y[k]\tag{2.3} rxy[n]=k=−∞∑+∞x[k−n]y[k](2.3)
是不是已经与卷积运算非常相似了?对卷积运算比较熟悉的应该已经能看出结论了,但这里还是多讲一步方便理解。
接下来的步骤请务必注意 ∑ \sum ∑的下标是 k k k还是 n n n!!!
我们将 x [ − n ] x[-n] x[−n]和 y [ n ] y[n] y[n]视作进行卷积运算的两个序列,根据式 ( 1.1 ) (1.1) (1.1), y [ n ] ∗ x [ − n ] y[n]*x[-n] y[n]∗x[−n]定义为
y [ n ] ∗ x [ − n ] = ∑ k = − ∞ + ∞ y [ k ] x [ − ( − k ) − n ] (2.4) y[n] * x[-n] = \sum_{k = - \infty}^{+\infty}y[k]x[-(-k)-n] \tag{2.4} y[n]∗x[−n]=k=−∞∑+∞y[k]x[−(−k)−n](2.4)
化简得
y [ n ] ∗ x [ − n ] = ∑ k = − ∞ + ∞ y [ k ] x [ k − n ] (2.5) y[n] * x[-n] = \sum_{k = - \infty}^{+\infty}y[k]x[k-n] \tag{2.5} y[n]∗x[−n]=k=−∞∑+∞y[k]x[k−n](2.5)
可以看到式 ( 2.3 ) (2.3) (2.3)与式 ( 2.5 ) (2.5) (2.5)是完全一致的,即
r x y [ n ] = x [ − n ] ∗ y [ n ] r_{xy}[n] = x[-n]*y[n] rxy[n]=x[−n]∗y[n]
2.2 相关运算的作用
相关运算的用途有很多,这里只展示最常见且最有用的两种
2.2.1 检测序列y[k]中是否含有序列x[k]
验证该用途所使用的matlab代码如下所示,以Akie秋绘的翻唱歌曲《なんでもないや》为例进行演示(鄙人是老绘星了)。
% 用于演示自相关运算的作用
clc;
clear;
close all;
% 1st_判断输出y[k]中是否含有x[k]
fs = 44100; % 采样频率
t = 5; % 采样时间
dt = 0:1/fs:t-1/fs; % 采样时刻
samples = [1, t*fs];
[src,fs] = audioread('music_akie.mp3', samples);
x = src(:, 1); % 取单声道数据
% sound(x, fs);
subplot(321);
plot(dt, x);
title('(a)$x[k]$', 'interpreter', 'latex');
% 计算有用信号自相关
[corr_x, lags] = xcorr(x);
subplot(322);
plot(lags, corr_x);
ylim([-2000, 3000]);
title('(b)$r_{x}[n]$', 'interpreter', 'latex');
% 创建噪声信号
noise = normrnd(0, 0.1, [t*fs, 1]);
% sound(noise, fs);
subplot(323);
plot(dt, noise);
title('(c)noise $n$', 'interpreter', 'latex');
% 计算噪声信号自相关
[corr_n, lags] = xcorr(noise);
subplot(324);
plot(lags, corr_n);
title('(d)$r_{n}[n]$', 'interpreter', 'latex');
% 混合音乐信号与噪声信号
y = x + noise;
% sound(y, fs); % 可以听一下混合后的信号,可以听到歌声,但是从是时域图上看不出来是否还含有歌声信号
subplot(325);
plot(dt, y);
title('(e)$y = x+n$', 'interpreter', 'latex');
% 计算噪声污染后音乐信号自相关
[corr_y, lags] = xcorr(y);
subplot(326);
plot(lags, corr_y);
ylim([-2000, 3000]);
title('(f)$r_{y}[n]$', 'interpreter', 'latex');
(e)受到噪声污染的音乐信号(f)被污染音乐信号的自相关函数
可以看到,音乐信号本身的自相关函数(图b)与受到污染音乐信号的自相关函数非常相似,其原因在于 噪声信号的自相关函数除了零点处均约等于0 如此一来我们就可以通过相似度计算判断受到污染的信号中是否含有原信号。
具体的原理在此不再推导,根据“2.1 相关的定义”中的内容按部就班计算即可,如需另外讲解,可以在评论区说一下,鄙人看到会来补充说明的!
值得一提的是,当我们增大噪声的幅度,就会发现受到污染音乐信号的自相关函数不再像原来的自相关函数,而是更像噪声信号的自相关函数了,换言之,个人认为,相关运算检测的是混合信号中的主要成分 !!!接下来我以Akie翻唱的另一首歌《lemon》为例演示,结果如下图所示。
2.2.2 回声消除
首先需要对回声信号进行建模,根据生活常识,回声信号
e
c
h
o
_
x
[
k
]
echo\_x[k]
echo_x[k]就是 原信号
x
[
k
]
x[k]
x[k]加上经过一段时间后返回的有衰减的信号
λ
x
[
k
−
N
]
\lambda x[k-N]
λx[k−N] 。其数学表达式如下
e
c
h
o
_
x
[
k
]
=
x
[
k
]
+
λ
x
[
k
−
N
]
echo\_x[k]=x[k]+ \lambda x[k-N]
echo_x[k]=x[k]+λx[k−N]
然后我们进行理论的推理,先求回声信号的自相关函数
r
e
c
h
o
_
x
[
n
]
r_{echo\_x}[n]
recho_x[n]
r
e
c
h
o
_
x
[
n
]
=
∑
k
=
−
∞
+
∞
e
c
h
o
_
x
[
k
]
e
c
h
o
_
x
[
k
+
n
]
=
∑
k
=
−
∞
+
∞
(
x
[
k
]
+
λ
x
[
k
−
N
]
)
(
x
[
k
+
n
]
+
λ
x
[
k
+
n
−
N
]
)
=
∑
k
=
−
∞
+
∞
(
x
[
k
]
x
[
k
+
n
]
+
λ
x
[
k
]
x
[
k
+
n
−
N
]
+
λ
x
[
k
−
N
]
x
[
k
+
n
]
+
λ
2
x
[
k
+
n
−
N
]
x
[
k
−
N
]
)
=
(
1
+
λ
2
)
r
x
[
n
]
+
λ
r
x
[
n
−
N
]
+
λ
r
x
[
n
+
N
]
r_{echo\_x}[n]=\sum_{k=-\infty}^{+\infty}echo\_x[k]echo\_x[k+n] \\ =\sum_{k=-\infty}^{+\infty}(x[k]+\lambda x[k-N])(x[k+n]+\lambda x[k+n-N]) \\ =\sum_{k=-\infty}^{+\infty}(x[k]x[k+n]+\lambda x[k]x[k+n-N]+\lambda x[k-N]x[k+n]+\lambda ^{2}x[k+n-N]x[k-N]) \\ =(1+\lambda^{2})r_{x}[n]+\lambda r_{x}[n-N]+\lambda r_{x}[n+N] \\
recho_x[n]=k=−∞∑+∞echo_x[k]echo_x[k+n]=k=−∞∑+∞(x[k]+λx[k−N])(x[k+n]+λx[k+n−N])=k=−∞∑+∞(x[k]x[k+n]+λx[k]x[k+n−N]+λx[k−N]x[k+n]+λ2x[k+n−N]x[k−N])=(1+λ2)rx[n]+λrx[n−N]+λrx[n+N]
可以看到,回声信号的自相关函数
r
e
c
h
o
_
x
[
n
]
r_{echo\_x}[n]
recho_x[n]其实是原始信号自相关函数
r
x
[
n
]
r_{x}[n]
rx[n]左右平移得到。