MATLAB中的firpmord函数,一般采用的是最佳逼近最大最小准则算法,该算法可以求出原型低通滤波器的阶数,而firpm函数可以求出原型低通滤波器的系数。即:
a=firpmord([4 8],[1 0],[0.001 0.001],64);(3)
h=firpm(a,[0 4/32 8/32 1],[1 1 0 0]); (4)
(3)式中, [4 8]表示通带截止频率为4MHz,阻带截止频率为8 MHz; [1 0]表示通带幅度为1,阻带幅度为0; [0.001 0.001]表示通带、阻带波动均为0.001;64表示采样频率为64MHz。
而在(4)式中,[04/32 8/32 1]分别为对应于实际频率0、4、8、32(MH)的归一化频率;[1 1 0 0]为上述频率点上的幅度值。
求出原低通滤波器h(n)后,就可以求出多相滤波器的多相分量。图2中的多相分量是对h(n)进行8倍抽取,再做两倍内插得到的。用MATLAB语句可方便地得到各多相分量的系数,每个多相分量有6个非零系数,两倍内插后为12个系数。其MATLAB语句如下:
hp=zeros(8,2*fix(length(h)/8));
for i=1:8
hp (i,1:2:end)=h(i:8:(fix(lengh (h)/8)-1)*8+i);
end
一个多相分量的滤波运算可用三个乘加单元完成,每个乘加单元有四个乘法器,这样就可以完成12个系数的乘加。多相分量的滤波系数一般事先都将其转换为二进制补码存放在ROM中。
由上述分析可知,每个时钟节拍可完成两个信道的延迟和抽取(采用流水线操作),每个时钟节拍需要进行两个多相分量的乘加运算,即需要同时得到12个非零系数,这可用12个单口ROM实现。其中6个ROM存放1~4信道的系数。另6个ROM存放5~8通道的系数。其存储格式如表2和表3所列。
这样,每当时钟上升沿到来时,就可以同时输出两个子信道的12个非零系数。通常可以设计一个模4减法计数器来实现ROM地址的产生。当数据准备好后,发出一个计数器的使能信号,计数器开始计数。因为首先计算的是4信道和8信道,所以,计数器的初始值为3,采用减一计数,计数到0后再进行循环。
2.3 时序的设计
由于信号s(n)的输入速率为64 MHz。故在64 MHz时钟驱动下,每一个节拍计算两个子信道,8个信道的计算需要用4个节拍来完成,并得到8个复数。这8个复数必须同时进入FFT模块,所以,可在FFT之前设计一组乒乓RAM来接收这8个复数。其中一个RAM以64 MHz的速率存放前面的计算结果,每个节拍接收两个复数,4个节拍接收完8个复数后开始FFT运算,同时换成另一个RAM接收前面的计算结果。等到8个复数都存放好之后,再开始FFT运算,此时又再次换成第一个RAM接收前面的计算结果,并依次循环。根据这样的时序设计,FFT模块的时钟应为16 MHz。FFT运算由IP核完成。经FFT运算后同时可得到8个复数形式的结果,由于复数分成实虚部的表示形式,且实虚部都用32位二进制数表示,因此,8个复数需要16个32位的二进制数表示,也就是芯片上需要16×32=512个引脚,这对于任何芯片都是不可能办到的。为此,应在FFT模块的输出端也设计一个乒乓RAM。其中一个RAM先将8个FFT运算结果存储起来,然后以64 MHz的时钟频率每个节拍向外输出两个复数(即4个32为二进制数),直到4个节拍全部输出完毕(即8个复数全部输出的频率为16 MHz),同时另一个RAM以16MHz的时钟频率接收FFT的运算结果。然后将两个RAM的作用交换,再以此循环。
3 结束语
本文详细分析了复信号多相滤波器的无盲区改进算法,并根据推导出的数学模型完成了其FPGA的设计。该设计根据信道数和抽取因子之间的倍数关系,解决了延迟和抽取功能的实现问题,并使用乒乓RAM实现了复信号多相滤波器的多通道流水线输出。