matlab实现重叠相加法

        重叠相加法是针对计算无限长序列线性卷积,要求利用圆周卷积代替线性卷积以方便计算机计算而提出来的,它是指通过补零延长分段序列和系统序列,以使圆周卷积结果与线性卷积结果相同,而不发生混淆的快速卷积方法。

下面我们用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函数的线性卷积结果:

重叠相加法的优点:重叠相加法具有较好的时间和空间复杂度。 当数据量达到千万量级时, 运算延时更低,可运用于对信号的实时处理。

  • 8
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值