重叠相加法是针对计算无限长序列线性卷积,要求利用圆周卷积代替线性卷积以方便计算机计算而提出来的,它是指通过补零延长分段序列和系统序列,以使圆周卷积结果与线性卷积结果相同,而不发生混淆的快速卷积方法。
下面我们用matlab编程实现119点DFT重叠相加法:
%产生一个长度为离500的离散时间信号cosn1;
n1 = 1:1:500;
x1 = cos(n1);
subplot(4,1,1);
stem (n1,x1);
xlabel('n1');
ylabel('x1');
grid on;
title('离散时间信号cosn1');
%产生一个长度为20的离散时间信号h;
n2 = 0:19;
h = n2;
N = length(h);
subplot(4,1,2);
stem(n2,h);
xlabel('n2');
ylabel('h');
title('离散时间信号h');
%做119点的重叠相加法
L = 119;
M = L - N + 1;
X1 = x1(1: M);
X2 = x1(M+1 : 2*M); %把x1拆成5个分段
X3 = x1(2*M+1 :3*M ); %题目要求不能使用conv函数,所以只利用fft对序列做傅里叶变换,时域的卷积等于频域的乘积
X4 = x1(3*M+1 : 4*M);
X5 = x1(4*M+1 : 5*M);
H = fft(h,L);
Y1 = fft(X1,L).*H; %进行逆变换,得到每一个分段的卷积结果
Y2 = fft(X2,L).*H;
Y3 = fft(X3,L).*H;
Y4 = fft(X4,L).*H;
Y5 = fft(X5,L).*H;
y1 = ifft(Y1,L);
y2 = ifft(Y2,L);
y3 = ifft(Y3,L);
y4 = ifft(Y4,L);
y5 = ifft(Y5,L);
y_conv = conv(h,x1);%和下面的重叠相加的结果进行对比
subplot(4,1,3);
stem(y_conv);
title('线性卷积conv函数实现的结果');
%将每一个卷积的结果相加
y_overlap = [y1(1:100),y1(101:119)+y2(1:19),y2(20:100),y2(101:119)+y3(1:19),y3(20:100),y3(101:119)+y4(1:19),y4(20:100),y4(101:119)+y5(1,19),y5(20:119)];
subplot(4,1,4);
stem(y_overlap);
title('重叠相加法结果');
axis([0 600 -40 20]);
matlab仿真结果:
离散时间信号cosn1时域波形:
离散时间信号h时域波形:
重叠相加法:
直接调用conv函数的线性卷积结果:
重叠相加法的优点:重叠相加法具有较好的时间和空间复杂度。 当数据量达到千万量级时, 运算延时更低,可运用于对信号的实时处理。