一 原理
我们知道,对于一个线性时不变系统来说,当给定其离散的输入序列时,要想计算该序列通过该线性时不变系统所引起的零状态响应时,可以使用该序列与该系统的冲激响应序列相卷积进行求解,也即式(1-1-1).
y(n)=∑k=−∞∞x(k)h(n−k)(1-1-1) y(n)=\sum_{k=-\infty}^{\infty}x(k)h(n-k) \tag{1-1-1} y(n)=k=−∞∑∞x(k)h(n−k)(1-1-1)
实际进行编程时,我们可能需要使用三重循环来进行计算,但是当输入的数据序列无限长,而线性时不变系统的冲激响应序列比较短时,该方法会有很大的计算量.尤其是进行实时滤波,我们不可能要把所需要使用的输入序列都收集完毕后再进行运算,而是希望能够一边输入序列,一边进行计算.重叠相加法计算线性卷积是这样的,首先将输入序列x(n)x(n)x(n)拆分成许多的小区间,
然后用每一个小区间和冲击序列h(n)h(n)h(n)进行卷积计算,最后将所得的每一个序列重叠部分进行叠加即可,算法的可行性见式(1-1-2),示意图见式(1-1-3).
y(n)=x(n)∗h(n)=h(n)∗∑k=0∞xk(n)=∑k=0∞yk(n)(1-1-2) y(n)=x(n)*h(n)=h(n)*\sum_{k=0}^{\infty}x_k(n)=\sum_{k=0}^{\infty}y_k(n) \tag{1-1-2} y(n)=x(n)∗h(n)=h(n)∗k=0∑∞xk(n)=k=0∑∞yk(n)(1-1-2)

实际上计算输入序列小区间和冲激序列卷积时,可以利用圆周卷积计算,而圆周卷积的计算可以用FFTFFTFFT进行.
二 算法流程
-
i=0,L=M+N−1i=0,L=M+N-1i=0,L=M+N−1;计算并保存H(k)=DFT[h(n)]LH(k)=DFT[h(n)]_LH(k)=DFT[h(n)]L;
-
读入xi(n)=x(n)RM(n−iM)x_i(n)=x(n)R_M(n-iM)xi(n)=x(n)RM(n−iM),并计算保存X(k)=DFT[xi(n)]LX(k)=DFT[x_i(n)]_LX(k)=DFT[xi(n)]L;
-
Yi(k)=H(k)Xi(k)Y_i(k)=H(k)X_i(k)Yi(k)=H(k)Xi(k)
-
yi(n)=IDFT[Yi(k)]L,n=0,1,2,⋯ ,L−1y_i(n)=IDFT[Y_i(k)]_L,n=0,1,2,\cdots,L-1

本文详细介绍了线性时不变系统中如何使用重叠相加法进行线性卷积的计算,以降低计算量,实现实时滤波。这种方法通过将输入序列拆分为小区间,与系统冲激响应进行卷积,再叠加重叠部分,有效减少了运算复杂度。同时,文章给出了C语言实现的算法流程,包括FFT和IFFT的运用,以及具体的代码示例。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



