前言
其实卷积可以说是DSP 数字信号处理的入门操作,
基本思路:我们想测试一个系统的性能,得到这个系统的传递函数,得到你信号的响应(response),说白了就是往系统里面扔信号,出来的东西是啥?我咋知道呢?
其实方法就是我扔个小石子 投石问路即可。 这里的小石子,就是一个最简单的脉冲信号
δ
(
n
)
\delta(n)
δ(n),我放进去看看效果,这个效果就是脉冲响应
h
(
n
)
h(n)
h(n),
那别的信号咋办?很简单,把你的源信号分解成一个个脉冲响应就行,这样,把所有的脉冲响应(线性)叠加起来就好了:)
那么 这和卷积有什么关系?卷积就是一个计算公式,就好像长方形面积就是底乘高。我们想要得到输出信号y(n) 可以将源信号与脉冲响应h(n)卷积:
y
(
n
)
=
x
(
n
)
∗
h
(
n
)
=
Σ
x
(
m
)
h
(
n
−
m
)
y(n)=x(n)*h(n)=\Sigma x(m)h(n-m)
y(n)=x(n)∗h(n)=Σx(m)h(n−m)
题目
循环偏移函数cirshiftd
%x 输入序列
%m 偏移值
%N 循环长度
%y 输出循环序列
function y=cirshiftd(x,m,N)
if length(x)>N
error('x > N');
end
x=[x,zeros(1,N-length(x))];
n=[0:1:N-1];
y=x(mod(n-m,N)+1);
循环卷积函数circonv
function yc=circonv(x1,x2,N)
% 非法输入控制
if length(x1)>N
error('N < x1');
end
if length(x2)>N
error('N < x2');
end
x1 = [x1,zeros(1,N-length(x1))];
x2 = [x2,zeros(1,N-length(x2))];
n=[0:1:N-1];
x2=x2(mod(-n,N)+1);
H=zeros(N,N);
for n=1:1:N
H(n,:)=cirshiftd(x2,n-1,N);
end
yc=x1*H';
总程序 运用循环卷积函数
% 输入序列
Xn=[1,2,3,4,5];
Hn=[1,2,1,2];
% 调用线性卷积、循环卷积的计算函数 进行多点循环卷积的运算
Yline=conv(Xn,Hn);
Yc5=circonv(Xn,Hn,5);
Yc6=circonv(Xn,Hn,6);
Yc9=circonv(Xn,Hn,9);
Yc10=circonv(Xn,Hn,10);
% 计算出横坐标序列长度 以便作图
Nyline=[0:1:length(Yline)-1];
Ny5=[0:1:length(Yc5)-1];
Ny6=[0:1:length(Yc6)-1];
Ny9=[0:1:length(Yc9)-1];
Ny10=[0:1:length(Yc10)-1];
% 将5张图放置于同一版面
% 线性卷积
subplot(5,1,1);
stem(Nyline,Yline,'r*');
axis([0,9,0,25]);
title('Linear convolution');
% 5点循环卷积
subplot(5,1,2);
stem(Ny5,Yc5,'r*');
axis([0,9,0,25]);
title('Circular convolution with N=5');
% 6点循环卷积
subplot(5,1,3);
stem(Ny6,Yc6,'r*');
axis([0,9,0,25]);
title('Circular convolution with N=6');
% 9点循环卷积
subplot(5,1,4);
stem(Ny9,Yc9,'r*');
axis([0,9,0,25]);
title('Circular convolution with N=9');
% 10点循环卷积
subplot(5,1,5);
stem(Ny10,Yc10,'r*');
axis([0,9,0,25]);
title('Circular convolution with N=10');
运行结果
工作区情况