上回书说到了从模拟世界向数字世界的途径——采样和量化,但是,更加具体的系统模型究竟是什么样的呢?今日偶得一图,甚好!
这张图很完美的描述了数字信号处理,包括了防混叠滤波器(前置滤波器),AD转换器,DSP(digital signal processor),DA转换器,平滑滤波器(后置滤波器)。这些设备我会在后续专门讲讲,大家现在只需要有浅浅的概念就行了。
接下来,紧急插播一条关于δ(n)采样序列的用法。你一直说冲激序列能够采样,那它咋才呢?看看下面这图。
理想的对模拟信号进行采样,就是服从的这个公式。
进入到今天的正题,通信行业中的两大法宝之一——卷积。卷积这个运算平常用不到,但是,就是在滤波这一方面,几乎所有的滤波器都能跟它扯到一星半点的关系。首先,我们要知道卷积的取值范围,假设,一个序列为[0,3],另一个为[0,2],那么它们的卷积长度为6,取值范围[0,5]。简单的说,就是上限与上限加就是上限,下限与下限相加就是下限。不要整其他花里胡哨的。
谈到卷积,学的好同学,便能想到反褶,平移,相乘和相加这四个步骤。这四步呢,可以总结出一种求卷积的方法,就是经典的列表法,按照这四个步骤,慢慢的列数计算,虽这种方法比较慢,但是这很准确,也容易理解。
谈谈其他的方法,一个是对位相乘相加法。说简单点,就是多项式相加相乘。
大家可以用MATLAB验证一下,MATLAB中的卷积函数是conv()函数。这个函数只适用于离散卷积。
最后一种方法是向量-矩阵相乘法,这是我觉得最好的一种方法。我觉得它也可以叫做斜眼法。
打个比方,在计算离散卷积时,要求y(1)的值,y(1)=x(0)h(1)+x(1)h(0)。
这个就是该中方法的向量形式。这种方式也是MATLAB中conv函数最本质的算法。能想出这种算法的人真是个天才。
接着,刚说咱们可不提倡,打开MATLAB,自编一下func_conv函数。
func_conv.m
%卷积——反褶、时移、相乘、相加
function y = func_conv(x1,x2)
n1 = length(x1)
n2 = length(x2)
y = zeros(1,n1+n2-1)
k1 = zeros(1,n1+n2)
k2 = zeros(1,n1+n2)
for i = 0:n1-1
for j = 1:n2
k2(j+i) = x2(j)
k1(j+i) = x1(i+1)*k2(j+i)
y(j+i) = y(j+i)+k1(j+i)
end
end
end
main.m
%% 卷积
m =[1 1 1 1 1]
n = [1 1 1 1 1]
figure(1)
stem(conv(m,n))
figure(2)
stem(func_conv(m,n))
仿真结果:
本次代码用的是二重循环,按照反褶,平移,相乘,相加这四个步骤进行运算。但是,仔细想想,这样写的代码充满着弊端。当你序列很长的时候,所需要的时间复杂度就变高了,运行时间就要很长了。所以说怎么去优化呢?用斜眼法怎么去编?O.o!敬请期待。
说了这么多求卷积的方法,咱们聊一下它的哥们——相关,两者公式是一样的。
其实说到底,就是咱们概率论里的相关系数ρ。它的取值范围就是[0,1]。这里建议大家回头看看,或者上网搜搜。
欲知后事如何,且听下回分解。OVO!