数字信号处理——重叠相加法计算线性卷积

此刻心情

大学的时间有时候碎片化,大大小小的琐事间隔,一段小时间区间不知干啥,于是就做点思路整理工作

重叠相加法介绍

#由来

在利用FFT计算线性卷积时,遇见长序列与短序列卷积时,FFT不一定具备简化计算的优势

#思路
分而治之的思想,可能很多情况下都使用,将大问题转为能解决的已知问题。既然一长一段不行,何不把长的分段
我们设两个序列中短序列为s(n),长度为M;长序列为l(n),长度为L;可以测试,对长序列的分段点数不影响卷积结果,那我们设每段长度为N。那么,第一段的下标应该是0~N-1,第二段应该是N ->2N-1;由于我们采用每段分别求卷积,再将每段卷积通过合适的方法组合成目标结果,那么第二段应该往左移N点,以作DFT,也可以理解为周期延拓。为了让fft 或dft 代替线性卷积结果,需要有dft点数的要求,即points=2^r>=N+M-1。因此,我们要在N点基础上进行补零,往后加points-N个0即可。同时别忘了对s(n)也进行同样的补零处理。
由于时域卷积可以频域相乘再反变换求得,我们将对s(n)和每个分段分别求卷积。在得到每个分段的卷积和后,我们要由此组织我们的结果。数学上已经给出结果了,就不赘述。对数学表达式的理解为,第一段的前N个点依旧代表结果,此后的M-1个点将与第二段的前M-个点相加,其他的类似。不严谨地说,每个分段产生N+M-1个点,第二段相当于右移N个点,必然产生混叠,第三段右移2N个点。。。看两张图,结合理解。
在这里插入图片描述

在这里插入图片描述
#matlab代码实现
由于暂时不会动态分配变量或内存,我的程序只能将序列分3段,实际上你可以修改分段数目。从程序角度看,这份代码不能满足预期功能,但编程能力有待提高。

function y=chongDieBaoLiuOf3seg(x1,x2,L)
%L为分段点数
%设x1长度小于x2
len1=length(x1);
len2=length(x2);
%实现分段
if 2*L+1<len2
x21=x2(1:L);
x22=x2(L+1:2*L);
x23=x2(2*L+1:end);
%补零
m=ceil(log2(len1+len2-1));
end
N=2^m;
if L<N
    x21=[x21,zeros(1,N-L)];
    x22=[x22,zeros(1,N-L)];
    x23=[x23,zeros(1,N-length(x23))];
end
if len1<N
    x1=[x1,zeros(1,N-len1)];
end
%卷积化为乘积
X1=fft(x1);
X22=fft(x22);
X21=fft(x21);
X23=fft(x23);
Y22=X22.*X1;
Y23=X23.*X1;
Y21=X21.*X1;
y21=ifft(Y21);
y22=ifft(Y22);
y23=ifft(Y23);
%使维度一致
y21=[y21,zeros(1,2*L)];
y22=[zeros(1,L),y22,zeros(1,L)];
y23=[zeros(1,2*L),y23];
y=y21+y22+y23;
%截取需要部分
y=y(1:len1+len2-1)

# 不知道怎么跳出代码模块
小结一下,数学运算上,matlab优势很明显,

猜你喜欢

转载自blog.csdn.net/qq_44801767/article/details/102895639