利用循环卷积可以计算线性卷积,当x(n)长度很长时,可以对其分段卷积,采用两种方法处理:重叠相加法和重叠保留法。这两种方法的原理这里不再赘述,本文使用matlab计算任意长度的随机序列与三角波序列线性卷积。
首先产生一个随机序列:
close all;
xen=rand(1,512);%产生512个点的随机序列
直接线性卷积
%直接线性卷积
yline=conv(xen,xcn);
La=length(xen);
N1=length(xcn);
n=0:La+N1-2;
subplot(3,1,1);stem(n,yline);xlabel('n');ylabel('x_e(n)*x_c(n)');title('直接线性卷积');
重叠相加法线性卷积
定义函数Oversum_linecor使用重叠相加法计算线性卷积:
function [n,y_final]=Oversum_linecor(xn,hn,M)
%重叠相加法计算线性卷积
%n:线性卷积后的序列索引向量;y_final:线性卷积后的序列
%xn,hn为两个线性卷积序列,M:整个xn序列分为M段
La=length(xn);
N1=length(hn);
N2=La/M; %N1为h(n)长度,N2为序列非零长度
L=N2+N1-1;%每段序列长度
km=M-1; %分段序列矩阵行数km+1
n=0:La+N1-2;
for i=0:km
for j=1:N2
ran(i+1,j)=xn(i*64+j);
end
for j=N2+1:L
ran(i+1,j)=0; %构造序列矩阵
end
end
ycn=fft(hn,L);
for i=0:km
xr=ran(i+1,:);%取出第i+1行
yran(i+1,:)=fft(xr,L);
rany=yran(i+1,:).*ycn;
ymtx(i+1,:)=ifft(rany); %计算每一行的循环卷积
end
for i=0:km
if(i==0)
y_final(1,1:N2)=ymtx(1,1:N2);
y_final(1,N2+1:L)=ymtx(i+1,N2+1:L)+ymtx(i+2,1:N1-1);
elseif(i~=km)
y_final(1,i*N2+N1:(i+1)*N2)=ymtx(i+1,N1:N2);
y_final(1,(i+1)*N2+1:L+i*N2)=ymtx(i+1,N2+1:L)+ymtx(i+2,1:N1-1);
else
y_final(1,km*N2+N1:La+N1-1)=ymtx(km+1,N1:La-km*N2+N1-1); %重叠部分相加
end
end
end
主函数的脚本代码为:
%重叠相加法线性卷积
[n,y_final]=Oversum_linecor(xen,xdn,8);
subplot(3,1,2);stem(n,y_final);xlabel('n');ylabel('x_e(n)*x_d(n)');title('重叠相加法线性卷积'); %重叠相加法
运行结果为:
重叠保留法线性卷积
定义函数Oversave_linecor使用重叠保留法计算线性卷积
function [n,y_final]=Oversave_linecor(xn,hn,M)
%重叠保留法计算线性卷积
%n:线性卷积后的序列索引向量;y_final:线性卷积后的序列
%xn,hn为两个线性卷积序列,M:整个xn序列分为M段
La=length(xn);
N1=length(hn);
N2=La/M; %N1为h(n)长度,N2为序列非零长度
L=N2+N1-1;%每段序列长度
km=M-1; %分段序列矩阵行数km+1
n=0:La+N1-2;
ycn=fft(hn,L);
for i=0:km
if(i==0)
ymtx(1,1:N1-1)=zeros(1,N1-1);
ymtx(1,N1:L)=xn(1:N2);
else
ymtx(i+1,1:N1-1)=xn(i*N2-N1+2:i*N2);
ymtx(i+1,N1:L)=xn(i*N2+1:(i+1)*N2); %构造序列
end
end
ymtx(km+2,1:N1-1)=xn((km+1)*N2-N1+2:(km+1)*N2);
ymtx(km+2,N1:L)=zeros(1,N2); %增加全零样本
for i=0:km+1
xr=ymtx(i+1,:);%取出第i+1行
yran(i+1,:)=fft(xr,L);
rany=yran(i+1,:).*ycn;
ymtx(i+1,:)=ifft(rany); %计算每一行的循环卷积
end
for i=0:km+1
if(i~=km+1)
y_final(i*N2+1:(i+1)*N2)=ymtx(i+1,N1:L);
else
y_final((km+1)*N2+1:La+N1-1)=ymtx(km+2,N1:La+N1-1-(km+1)*N2+N1-1); %去除重叠部分
end
end
主函数脚本代码:
%重叠保留法线性卷积
[n,y_final]=Oversave_linecor(xen,xcn,8);
subplot(3,1,3);stem(n,y_final);xlabel('n');ylabel('x_e(n)*x_c(n)');title('重叠保留法线性卷积'); %重叠保留法
运行结果: