FIR多相滤波器

作为一个外行,对数字信号处理书上的描述感到头大。以下是我的理解。

抽取的目的就是降低采样率。以4倍抽取来说,就是假设原来每秒有100M个点,现在让他只有25M个点。怎么实现呢,直接每隔4个点取一个点就得了?不行,每秒100M个点,包含了0-50Mhz的信号。抽取之后25Mhz,应当包含0-12.5Mhz的信号。所以要先把12.5Mhz以上的信号过滤掉,否则这些信号就会包含在输出里,但我们又不再能够区分这些信号和0-12.5Mhz的信号,这就是混叠。

所以我们应当在抽点前增加一级低通滤波器,以滤除12.5Mhz以上的信号,这里使用FIR滤波器。

N阶FIR滤波器表示:输出的数据是连续N个输入数据分别与N个系数相乘的和。

以D(n)表示输入的数据,C(n)表示对应的N个系数,T(n)表示输出的数据。FIR滤波器可以表示为

T(n)=D(n-1)*C(0) + D(n-2)*C(1) + ...... D(n-N)*C(N);

而FIR的系数又是对称的,所以经常先把对称的两个输入相加,然后用相加结果和对应系数相乘,可以减少一半的乘法运算。

T(n)=(D(n-1)+D (n-N))*C(0) + (D(n-2)+D(n-N+1))*C(1) + ......+(D(n-N/2+1)+D(n-N/2)*C(N/2);

那么,对于一个包含8阶FIR低通滤波器的4倍抽取器来说,需要的是T(n) 和T(n + 4),其他的输出点,就算FIR计算出来也会被抛弃掉,索性不去计算了。

T(n)=D(n-1)*C(0) + D(n-2)*C(1) + D(n-3)*C(2) + D(n-4)*C(3) + D(n-5)*C(4)+ D(n-6)*C(5)+ D(n-7)*C(6) + D(n-8)*C(7);

T(n+4)=D(n+3)*C(0) + D(n+2)*C(1) + D(n+1)*C(2)+ D(n)*C(3)+ D(n-1)*C(4)+ D(n-2)*C(5)+ D(n-3)*C(6)+ D(n-4)*C(7);

这样一来,每4个数据计算一次,每个数据需要做8个乘法运算。

普通的滤波也改为有相位差的n个抽取,每个抽取器的运算量都是1/n, 然后再将抽取结果合并到一起,对于FPGA和多核处理器来说,可以大大提高运算速度。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

再看内插,这里的N倍内插是每两个个点插入N-1个0,然后进行低通滤波。

输出的每个点都要进行FIR运算,但是由于我们插入了很多0,使得对应的系数都不再需要运算。同样以8阶低通FIR为例,

T(0)=              D(-1)*C(0) + 0*C(1) + 0*C(2) + 0*C(3) + D(-2)*C(4) + 0*C(5) + 0*C(6) + 0*C(7);

T(1)=0*C(0) + D(-1)*C(1) + 0*C(2) + 0*C(3) + 0*C(4) + D(-2)*C(5) + 0*C(6) + 0*C(7);

于是,每个输出只需要两次乘法运算,只是需要对应不同的系数。

 

posted on 2013-07-23 20:46  jacob1934  阅读(2745)  评论(0)    收藏  举报

导航