【 MATLAB 】序列相关与序列卷积之间的关系

举报
李锐博恩 发表于 2021/07/15 06:54:37 2021/07/15
【摘要】 关于序列卷积,之前写了3篇博文: 【 MATLAB 】conv 函数介绍(卷积和多项式乘法) 这篇博文介绍的是MATLAB本身自带的函数,但这个函数conv有个不如意的地方,就是求过卷积之后我们不知道各个卷积值的位置。 然后我们后面扩展了下这个函数,命名为conv_m,这个函数在这个博文的最后给出。 【 MATLAB 】两个序列的卷积和运算的MATLAB实现(2) ...

关于序列卷积,之前写了3篇博文:

【 MATLAB 】conv 函数介绍(卷积和多项式乘法)

这篇博文介绍的是MATLAB本身自带的函数,但这个函数conv有个不如意的地方,就是求过卷积之后我们不知道各个卷积值的位置。

然后我们后面扩展了下这个函数,命名为conv_m,这个函数在这个博文的最后给出。

【 MATLAB 】两个序列的卷积和运算的MATLAB实现(2)

还有一篇博文:

【 MATLAB 】两个序列的卷积和运算的MATLAB实现(1)

这篇博文只是给出了一个实例,程序里面隐藏了求卷积值位置的脚本程序。



序列卷积和公式:

y(n) = \sum_{k=-\infty }^{+ \infty }x(k)h(n-k)

而序列的互相关公式为:

r_{x,y}(l)= \sum_{n=-\infty }^{+ \infty }x(n)y(n-l)

如果x等于y,那么就得到自相关函数的公式:

r_{x,x}(l)= \sum_{n=-\infty }^{+ \infty }x(n)x(n-l)

比较卷积和公式和互相关函数的公式,我们可以发现二者之间的关系:

r_{x,y}(l)= x(n)*y(-n)

有了这个关系,我们就可以使用卷积的函数来求两个序列的互相关了。


首先给出扩展后的卷积函数conv_m的脚本:


  
  1. function [y,ny] = conv_m(x,nx,h,nh)
  2. % Modified convolution routine for signal processing
  3. %___________________________________________________
  4. % [y,ny] = conv_m(x,nx,h,nh)
  5. % [y,ny] = convolution result
  6. % [x,nx] = first signal
  7. % [h,nh] = second signal
  8. %
  9. nyb = nx(1) + nh(1);
  10. nye = nx(length(x)) + nh(length(h));
  11. ny = nyb:nye;
  12. y = conv(x,h);

两个信号相加的函数sigadd:


  
  1. function [y,n] = sigadd(x1,n1,x2,n2)
  2. % implements y(n) = x1(n) + x2(n)
  3. % [y,n] = sigadd(x1,n1,x2,n2)
  4. %____________________________________
  5. % y = sum sequence over n, which includes n1 and n2
  6. % x1 = first sequence over n1
  7. % x2 = second sequence over n2( n2 can be different from n1)
  8. %
  9. n = min( min(n1), min(n2) ):max( max(n1), max(n2) ); %duration of y(n)
  10. y1 = zeros(1,length(n)); y2 = y1; %initialization
  11. y1( find( ( n >= min(n1) )&( n <= max(n1) ) == 1 ) ) = x1; %x1 with duration of y1
  12. y2( find( ( n >= min(n2) )&( n <= max(n2) ) == 1 ) ) = x2; %x2 with duration of y2
  13. y = y1 + y2;

信号移位函数:


  
  1. function [y,n] = sigshift(x,m,k)
  2. %implements y(n) = x(n - k)
  3. %_________________________
  4. %[y,n] = sigshift(x,m,k)
  5. %
  6. n = m+k;
  7. y = x;

预备工作做好了,下面给出一个例子:

设:

x(n)=[3, 11, 7, \underset{\Lambda }{0},-1,4,2]

是原序列,设 y(n) 是原 x(n) 受到噪声污染并移位了的序列

y(n) = x(n-2) + w(n)

这里 w(n) 是均值为0,方差为1的高斯随机序列。计算y(n)和x(n)之间的互相关。

题解:


  
  1. clc
  2. clear
  3. close all
  4. % noise sequence 1
  5. nx = -3:3;
  6. x = [3,11,7,0,-1,4,2];
  7. %
  8. % implements y(n) = x(n - k)
  9. % _________________________
  10. % [y,n] = sigshift(x,m,k)
  11. [y1,n1]= sigshift(x,nx,2);
  12. w = randn(1,length(y1));
  13. nw = n1;
  14. [y,ny] = sigadd(y1,n1,w,nw);
  15. [x,nx]=sigfold(x,nx);
  16. [rxy,nrxy]=conv_m(x,nx,y,ny);
  17. subplot(2,1,1);
  18. stem(nrxy,rxy);
  19. title('noise sequence 1');
  20. % noise sequence 2
  21. nx = -3:3;
  22. x = [3,11,7,0,-1,4,2];
  23. %
  24. % implements y(n) = x(n - k)
  25. % _________________________
  26. % [y,n] = sigshift(x,m,k)
  27. [y1,n1]= sigshift(x,nx,2);
  28. w = randn(1,length(y1));
  29. nw = n1;
  30. [y,ny] = sigadd(y1,n1,w,nw);
  31. [x,nx]=sigfold(x,nx);
  32. [rxy,nrxy]=conv_m(x,nx,y,ny);
  33. subplot(2,1,2);
  34. stem(nrxy,rxy);
  35. title('noise sequence 2');

 

噪声是随机的,所以把互相关的计算执行了两次,可见,两幅图的细节有一点点不同,但互相关的峰值都在l = 2上。

 

 

 

 

 

 

 

 

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/83304196

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。