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

举报
李锐博恩 发表于 2021/07/15 06:54:37 2021/07/15
3.6k+ 0 0
【摘要】 关于序列卷积,之前写了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的脚本:


      function [y,ny] = conv_m(x,nx,h,nh)
      % Modified convolution routine for signal processing
      %___________________________________________________
      % [y,ny] = conv_m(x,nx,h,nh)
      % [y,ny] = convolution result
      % [x,nx] = first signal
      % [h,nh] = second signal
      %
      nyb = nx(1) + nh(1);
      nye = nx(length(x)) + nh(length(h));
      ny = nyb:nye;
      y = conv(x,h);
  
 

两个信号相加的函数sigadd:


      function [y,n] = sigadd(x1,n1,x2,n2)
      % implements y(n) = x1(n) + x2(n)
      % [y,n] = sigadd(x1,n1,x2,n2)
      %____________________________________
      % y = sum sequence over n, which includes n1 and n2
      % x1 = first sequence over n1
      % x2 = second sequence over n2( n2 can be different from n1)
      %
      n = min( min(n1), min(n2) ):max( max(n1), max(n2) ); %duration of y(n)
      y1 = zeros(1,length(n)); y2 = y1; %initialization
      y1( find( ( n >= min(n1) )&( n <= max(n1) ) == 1  )  ) = x1; %x1 with duration of y1
      y2( find( ( n >= min(n2) )&( n <= max(n2) ) == 1  )  ) = x2; %x2 with duration of y2
      y = y1 + y2;
  
 

信号移位函数:


      function [y,n] = sigshift(x,m,k)
      %implements y(n) = x(n - k)
      %_________________________
      %[y,n] = sigshift(x,m,k)
      %
      n = m+k;
      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)之间的互相关。

题解:


      clc
      clear
      close all
      % noise sequence 1
      nx = -3:3;
      x = [3,11,7,0,-1,4,2];
      %
      %  implements y(n) = x(n - k)
      %  _________________________
      % [y,n] = sigshift(x,m,k)
      [y1,n1]= sigshift(x,nx,2);
      w = randn(1,length(y1));
      nw = n1;
      [y,ny] = sigadd(y1,n1,w,nw);
      [x,nx]=sigfold(x,nx);
      [rxy,nrxy]=conv_m(x,nx,y,ny);
      subplot(2,1,1);
      stem(nrxy,rxy);
      title('noise sequence 1');
      % noise sequence 2
      nx = -3:3;
      x = [3,11,7,0,-1,4,2];
      %
      %  implements y(n) = x(n - k)
      %  _________________________
      % [y,n] = sigshift(x,m,k)
      [y1,n1]= sigshift(x,nx,2);
      w = randn(1,length(y1));
      nw = n1;
      [y,ny] = sigadd(y1,n1,w,nw);
      [x,nx]=sigfold(x,nx);
      [rxy,nrxy]=conv_m(x,nx,y,ny);
      subplot(2,1,2);
      stem(nrxy,rxy);
      title('noise sequence 2');
  
 

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

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

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

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

作者其他文章

评论(0

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

    全部回复

    上滑加载中

    设置昵称

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

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

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