您的当前位置:首页正文

卷积和相关的matlab实现

2023-08-05 来源:帮我找美食网


两个序列的卷积:

c(n)=a(n)*b(n)

c(n)=a(k)b(n-k)k

如果a和b的脚标范围为:[a1,a2]与[b1,b2],则c的脚标范围为[a1b1,a2b2],但是由于matlab的索引是从1开始的,这里假设a和b都是从n=1开始。知道最后的范围即可:

function c = convolution(a,b)

M= length(a); %a序列的长度

N=length(b); %b序列的长度

c=zeros(1,N+M-1); %用来存放卷积的结果

for n = 2:(M+N) %卷积之后的索引本应该的范围

tmp_max=min(n-1,M); %根据求和表达式,由1=tmp_min=max(n-N,1); %确定最终求和变量k的取值

for k =tmp_min:1:tmp_max;

c(n-1) = c(n-1) +a(k)*b(n-k);%求和,同时由于c从1开始索引,

%将n的范围2:M+N

%对应到c的1:M+N-1中去

end

end

调用matlab自带卷积函数conv验证:

>> x = 1:9;

>> y=2:8;

>> conv(x,y)

ans =

2 7 16 30 50 77 166 127 72

>> convolution(x,y)

147 182 197 200 190 112

ans =

2 7 16 30 50 77 112 147 182 197 200 190 166 127 72

两个序列的相关:

c(n)cor(a(n),b(n))

c(n)a(nk)*b(k)k

同样,如果a和b的脚标范围为:[a1,a2]与[b1,b2],则c的脚标范围为[a1b2,a2b1],但是由于matlab的索引是从1开始的,这里假设a和b都是从n=1开始。知道最后的范围即可:

function c =correlation(a,b)

M = length(a);

N = length(b);

c=zeros(1,M+N-1); %用来存放卷积的结果

for n=(-N+1):M-1 %相关运算本应该的范围

tmp_min = max(1,1-n); %根据求和表达式,由1=tmp_max = min(M-n,N); %确定最终求和变量k的取值

for k = tmp_min:tmp_max %求和,

c(n+N)=c(n+N)+a(n+k)*b(k); %同时将n的范围(-N+1):M-1对应

到c的1:M+N-1中

end

end

调用matlab自带的xcorr函数进行验证:

>> xcorr(x,y)

ans =

Columns 1 through 12

-0.0000 -0.0000 8.0000 23.0000 44.0000 70.0000 133.0000 168.0000 203.0000 238.0000 193.0000

Columns 13 through 17

100.0000

150.0000 110.0000 74.0000 43.0000 18.0000

>> correlation(x,y)

ans =

8 74 43 23 44 18

70 100 133 168 203 238 150 193 110

因篇幅问题不能全部显示,请点此查看更多更全内容