matlab 实例均命名为,【 MATLAB 】序列相关与序列卷积之间的关系

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

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

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

还有一篇博文:

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

序列卷积和公式:

657c7a775bbb51b500b9d9a0ca55d0a2.gif

而序列的互相关公式为:

0950fc95f50d443135559fbedb78d46e.gif

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

06f6df1811ec7f5e3fb70955ba62581c.gif

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

784f52dbbcb295c3db8883bead6e0bd2.gif

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

首先给出扩展后的卷积函数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;

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

设:

cdc4b4c074bf347cdfcb70808bee1a1d.gif

是原序列,设 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');

7d1715edae681433d57cdb1f0f197f32.png

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

本文同步分享在 博客“李锐博恩”(CSDN)。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值