利用重叠相加法和重叠保留法计算序列线性卷积

        利用循环卷积可以计算线性卷积,当x(n)长度很长时,可以对其分段卷积,采用两种方法处理:重叠相加法和重叠保留法。这两种方法的原理这里不再赘述,本文使用matlab计算任意长度的随机序列与三角波序列x_c(n)=[0,1,2,3,4,3,2,1]线性卷积。

        首先产生一个随机序列x_e(n)

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('重叠保留法线性卷积'); %重叠保留法

运行结果:

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值