文章目录
一、重叠相加法原理
对于一个线性时不变系统来说,当给定其离散的输入序列时,要想计算该序列通过该线性时不变系统所引起的零状态响应时,可以使用该序列与该系统的冲激响应序列相卷积进行求解,如下式所示。
y
(
n
)
=
x
(
n
)
∗
h
(
n
)
=
∑
k
=
−
∞
∞
x
(
k
)
h
(
n
−
k
)
y(n)=x(n) * h(n)=\sum_{k=-\infty}^{\infty} x(k) h(n-k)
y(n)=x(n)∗h(n)=k=−∞∑∞x(k)h(n−k)
但当输入的数据序列无限长,而线性时不变系统的冲激响应序列比较短时,该方法会有很大的计算量。尤其是进行实时滤波,难以把所需要使用的输入序列都收集完毕后再进行运算,所以希望能够一边输入序列,一边进行计算。这种情况使用重叠相加法计算线性卷积,首先将输入序列x(n)拆分成许多的小区间, 然后用每一个小区间和冲激序列 h(n)进行卷积计算(卷积计算可以用FFT进行),最后将所得的每一个序列重叠部分进行叠加即可。算法可行性如下式所示:
y
(
n
)
=
x
(
n
)
∗
h
(
n
)
=
h
(
n
)
∗
∑
k
=
0
∞
x
k
(
n
)
=
∑
k
=
0
∞
y
k
(
n
)
y(n)=x(n) * h(n)=h(n) * \sum_{k=0}^{\infty} x_{k}(n)=\sum_{k=0}^{\infty} y_{k}(n)
y(n)=x(n)∗h(n)=h(n)∗k=0∑∞xk(n)=k=0∑∞yk(n)
示意图如下图所示:
二、算法流程
给出 x ( n ) x(n) x(n)及 h ( n ) h(n) h(n),其中 h ( n ) h(n) h(n)的长度为M。
①将 x ( n ) x(n) x(n)进行分段得到 x i ( n ) ( i = 0 , 1 , 2 , 3 , … ) x_i(n)(i=0,1,2,3,…) xi(n)(i=0,1,2,3,…),每段长度为N,接着将 x i ( n ) x_i(n) xi(n)补零延长至L=M+N-1,计算的L点FFT,得到 X i ( K ) X_i(K) Xi(K)。
②将 h ( n ) h(n) h(n)补零延长至L=M+N-1得到 h e ( n ) h_e(n) he(n),计算 h e ( n ) h_e(n) he(n)的L点FFT,得到 H e ( K ) H_e(K) He(K)。
③计算 Y i ( K ) = X i ( K ) ∗ H e ( K ) Y_{i}(K)=X_{i}(K) * H_{e}(K) Yi(K)=Xi(K)∗He(K)。
④求出 Y i ( K ) Y_i(K) Yi(K)的L点的IFFT,得到 y i ( n ) y_i(n) yi(n)。
⑤将各段
y
i
(
n
)
y_i(n)
yi(n)进行相加,但要考虑重叠部分:
y
i
(
M
+
n
)
=
{
y
i
−
1
(
M
+
n
)
+
y
i
(
n
)
0
≤
n
≤
N
−
1
y
i
(
n
)
N
−
1
≤
n
≤
M
−
1
y_{i}(M+n)=\left\{\begin{array}{ll} y_{i-1}(M+n)+y_{i}(n) & 0 \leq n \leq N-1 \\ y_{i}(n) & N-1 \leq n \leq M-1 \end{array}\right.
yi(M+n)={yi−1(M+n)+yi(n)yi(n)0≤n≤N−1N−1≤n≤M−1
三、Matlab仿真
1.h(n)和x(n)序列
x ( n ) x(n) x(n)为20000点序列,h(n)=[1,2,5,8],长度为4,两个序列如下图所示。
![](https://img-blog.csdnimg.cn/1f76f9ef42ba4d8aa948ba3526863641.jpeg)
2.使用重叠相加法计算x(n)与h(n)卷积的结果
![](https://img-blog.csdnimg.cn/e28514f8f17e4a8d96ddfceddd1d4544.jpeg)
3.使用Matlab自带的线性卷积函数的结果
为了验证重叠相加法的正确性,采用Matlab自带的conv函数来计算x(n)与h(n)的线性卷积,结果如下图所示。通过图形比较可以看出,两种方法得到的结果一样。
![](https://img-blog.csdnimg.cn/f1025168ba9b4fa8bb92e9020674dc4c.jpeg)
4.使用两种方法得到的结果的差值
为了更直观,将两种方法得到的结果进行相减,从下图可以看出,两者之差为0,因此重叠相加法的设计正确。
![](https://img-blog.csdnimg.cn/92d0026cf8f14795965cf7173a31a06b.jpeg)
四、线性卷积与重叠相加法的比较
当h(n)的长度较短,而当x(n)序列的长度十分长接近无限长时,使用重叠相加法的运算量比使用线性卷积的运算量少,在实际运算中可考虑使用重叠相加法,但当x(n)序列的长度较短时,使用线性卷积的运算量比使用重叠相加法的运算量少,在实际运算中可考虑使用线性卷积,当然重叠相加法也可以稍作考虑。
(可在Matlab中使用tic和toc函数来比较两个程序的运行时间,从而比较两者运算量)
五、重叠相加法代码
本代码适用于将x(n)刚好分为整数段的情况,因此需设计好每一段长度。
代码链接:https://download.csdn.net/download/m0_46285064/79455268?spm=1001.2014.3001.5503
参考文章
重叠相加法计算卷积_鼻始拌饭加个蛋的博客-CSDN博客_重叠相加法计算线性卷积
数字信号处理——重叠相加法计算线性卷积_进修的码农的博客-CSDN博客_重叠相加法
重叠相加法&重叠保留法_373955482的博客-CSDN博客_重叠相加法
fft重叠加法_重叠相加法与重叠保留法_六堡茶之家的博客-CSDN博客