重叠相加法(MATLAB实现)


一、重叠相加法原理

对于一个线性时不变系统来说,当给定其离散的输入序列时,要想计算该序列通过该线性时不变系统所引起的零状态响应时,可以使用该序列与该系统的冲激响应序列相卷积进行求解,如下式所示。
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(nk)
但当输入的数据序列无限长,而线性时不变系统的冲激响应序列比较短时,该方法会有很大的计算量。尤其是进行实时滤波,难以把所需要使用的输入序列都收集完毕后再进行运算,所以希望能够一边输入序列,一边进行计算。这种情况使用重叠相加法计算线性卷积,首先将输入序列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=0xk(n)=k=0yk(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)={yi1(M+n)+yi(n)yi(n)0nN1N1nM1

三、Matlab仿真

1.h(n)和x(n)序列

x ( n ) x(n) x(n)为20000点序列,h(n)=[1,2,5,8],长度为4,两个序列如下图所示。

2.使用重叠相加法计算x(n)与h(n)卷积的结果

3.使用Matlab自带的线性卷积函数的结果

为了验证重叠相加法的正确性,采用Matlab自带的conv函数来计算x(n)与h(n)的线性卷积,结果如下图所示。通过图形比较可以看出,两种方法得到的结果一样。

4.使用两种方法得到的结果的差值

为了更直观,将两种方法得到的结果进行相减,从下图可以看出,两者之差为0,因此重叠相加法的设计正确。

四、线性卷积与重叠相加法的比较

当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博客

  • 12
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_46285064

你的鼓励将是我创作的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值