两个序列的卷积:
c(n)=a(n)*b(n)
即
c(n)=a(k)b(n-k)k
如果a和b的脚标范围为:[a1,a2]与[b1,b2],则c的脚标范围为[a1b1,a2b2],但是由于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= 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(nk)*b(k)k 同样,如果a和b的脚标范围为:[a1,a2]与[b1,b2],则c的脚标范围为[a1b2,a2b1],但是由于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= 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 因篇幅问题不能全部显示,请点此查看更多更全内容