[已答复] 线性卷积与圆周卷积

[复制链接]
cc21 发表于 2012-2-23 23:32:40
分别用直接卷积法、重叠保留法、重叠相加法、求以下两个序列的卷积,看结果是否相同。
每次输入序列长度为N=128;
直接卷积法:
%Function y=lineraconv(x,h)
n=[0:1:1023];
x=((0.5).^(-n/1024)).*sin(n*pi/8);
%m=[0:1:20];
h=[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];
lm=length(h);
lx=length(x);
L=lx+lm-1;
xl=[zeros(1,lm-1),x];
hl=[h(end:-1:1),zeros(1,lx-1)];
y(1)=sum(xl.*hl);
for i=2:L
    y(i)=sum(xl.*[zeros(1,i-1),hl(1:L-i+1)]);
end
plot (y);

重叠保留法:
N=128;%分段的长度,也就是做fft的长度
h=[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];%系统冲击响应h(n)
n=[0:1:1023];
x=((0.5).^(-n/1024)).*sin(n*pi/8);
Lenx=length(x);
M=length(h);
M1=M-1;%重叠部分的长度
L=N-M1;%不重叠部分的长度
h=fft(h,N);
K=floor((Lenx+M1-1)/L)+1;%分的段数
p=(K)*L-Lenx;%最后一段结尾补零数
x1=[zeros(1,M1),x,zeros(1,p)];%总的大矩阵
Y=zeros(K,N);%保存结果矩阵初始化
for k=0:K-1
    xk=fft(x1(k*L+1:k*L+N));
    Y(k+1,:)=(ifft(xk.*h));
end
Z=reshape(Y(:,M:N)',1,[])%将保存结果矩阵转成一个行向量
plot (Y);
重叠相加法:
N=128;%分段的长度,也就是做fft的长度
h=[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];%系统冲击响应h(n)
n=[0:1:1023];
x=((0.5).^(-n/1024)).*sin(n*pi/8);
Lenx=length(x);
M=length(h);
M1=M-1;%重叠部分的长度
L=N-M1;%不重叠部分的长度
h=fft(h,N);
K=ceil(Lenx/L);%分的段数
for i=Lenx:K*L-1%将x(n)补成长度为K*L的序列
    x(i+1)=0;
end
Y=zeros(K,N);%保存结果矩阵初始化
YY=zeros(1,(K-1)*L+N);%最终结果矩阵初始化
for k=0:K-1
    xk=[x(k*L+1:k*L+L),zeros(1,M1)];
    Y(k+1,:)=(ifft(fft(xk).*h));
    YY(k*L+1:k*L+N)=YY(k*L+1:k*L+N)+Y(k+1,:)
end
plot (Y);

重叠保留法和重叠相加法计算快速卷积
重叠保留法
clear all
clc
N=8;%分段的长度,也就是做fft的长度
h=[1,3,2,1];%系统冲击响应h(n)
for i=0:9   %定义x(n)
    x(i+1)=5-i;
end
for i=10:18
    x(i+1)=i-15;
end
Lenx=length(x);
M=length(h);
M1=M-1;%重叠部分的长度
L=N-M1;%不重叠部分的长度
h=fft(h,N);
K=floor((Lenx+M1-1)/L)+1;%分的段数
p=(K)*L-Lenx;%最后一段结尾补零数
x1=[zeros(1,M1),x,zeros(1,p)];%总的大矩阵
Y=zeros(K,N);%保存结果矩阵初始化
for k=0:K-1
    xk=fft(x1(k*L+1:k*L+N));
    Y(k+1,:)=(ifft(xk.*h));
end
Z=reshape(Y(:,M:N)',1,[])%将保存结果矩阵转成一个行向量

重叠相加法
clear all
clc
N=8;%分段的长度,也就是做fft的长度
h=[1,3,2,1];%系统冲击响应h(n)
for i=0:9   %定义x(n)
    x(i+1)=5-i;
end
for i=10:18
    x(i+1)=i-15;
end
Lenx=length(x);
M=length(h);
M1=M-1;%重叠部分的长度
L=N-M1;%不重叠部分的长度
h=fft(h,N);
K=ceil(Lenx/L);%分的段数
for i=Lenx:K*L-1%x(n)补成长度为K*L的序列
    x(i+1)=0;
end
Y=zeros(K,N);%保存结果矩阵初始化
YY=zeros(1,(K-1)*L+N);%最终结果矩阵初始化
for k=0:K-1
    xk=[x(k*L+1:k*L+L),zeros(1,M1)];
    Y(k+1,:)=(ifft(fft(xk).*h));
    YY(k*L+1:k*L+N)=YY(k*L+1:k*L+N)+Y(k+1,:)
end

3 条回复


yutiansky 发表于 2012-2-26 16:44:18
教程?

cc21 发表于 2012-2-27 01:26:13
yutiansky 发表于 2012-2-26 16:44
教程?

??什么意思,没看懂

callhao217 发表于 2012-11-12 21:14:57
没看懂啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表