基于分布式算法的FIR平方根升余弦多相滤波器的仿真上传.doc
《基于分布式算法的FIR平方根升余弦多相滤波器的仿真上传.doc》由会员分享,可在线阅读,更多相关《基于分布式算法的FIR平方根升余弦多相滤波器的仿真上传.doc(17页珍藏版)》请在三一办公上搜索。
1、基于分布式算法的FIR平方根升余弦多相滤波器的仿真、设计与实现实验要求设计的FIR根升余弦滤波器的参数要求如下:序号参数名称参数1滤波器类型平方根升余弦FIR滤波器2阶数323信号传输速率8.448Mbps4过采样点数4Points/bit5升余弦系数0.6实验原理过采样与滤波器的多相实现在通信系统中,不论是成型滤波器还是匹配滤波器都是对源信号进行过采样后的的信号进行滤波【1】。图1、过采样和滤波示意图如图1所示,将想经I倍过采样后得到,再经过冲击响应为的FIRLPF得到输出序列。在时刻 的值,是由下式来计算: (1)将 带入(1)式有: (2)进一步定义,方程(2)变为: (3)由于是经I倍
2、上采样得到的,即在每两个数据之间插入了I-1个0,因此,成立,所以方程(3)变为: (4)由方程(1)可看出,次滤波器是阶的,由于源序列是经过了I倍过采样的信号,故可以化简为方程(4),由此可看出,对于任意一个时刻,实际上只用到了2M个滤波器系数,当i不同时,所用的滤波器系数不同,也就是将原来的一个阶滤波器分成了I个2M阶的滤波器来实现,这样降低了滤波器的阶数,从而减小了滤波延时,这种实现方式即称为滤波器的多相实现方式,其中称为第i相子滤波器。此处,对信号进行4被过采样,滤波器阶数为32,因此可将滤波器分为4相实现,每个子滤波器的阶数为8。假设原滤波器系数为,则每一相的子滤波器系数,应时以下组
3、合:子滤波器对应的原滤波器系数 表1、各子滤波器所对应的滤波系数它的实现框图如图2所示:图2、4倍过采样的滤波器多相实现结构图FIR滤波器的分布式算法实现由前一部分可知,对一个I过采样的信号进行滤波时,可以将滤波器拆为I个低阶滤波器的组合来实现滤波过程这在一定程度上降低了运算量,减小了滤波延时;但是在FPGA实现时对于滤波的卷积过程的实现一般并不是直接按照卷积的定义,每输入一个数据就去求一次卷积,这样运算的计算量仍然很大,基于此问题就提出了卷积过程的分布式实现算法。由于FPGA中数据大都是std_logic_vector类型,很适合进行二进制的乘加运算,分布式算法正式基于二进制的乘加运算来实现
4、的。由于卷积相当于将其中的一个序列倒序排列后进行内积运算可表示为【2】: (5)即是前面的滤波器系数的转置再平移N步,即为输入的信息序列,假设FPGA实现是输入数据是B位的,且用补码表示,则: (6)最高位是符号位,当=0时;当0时.由此,(5)式可变为: (7)进一步化为: (8)由(8)式可以看出,将内积运算分解为B项之和,而且每一项都是一个内积运算,这样做看似变复杂了,但是进一步分析可以看出,由于(8)式中的内积运算与(5)式中的内积运算有了很大的不同:(8)式中的内积运算完全不再需要乘法器,而仅仅用加法器就可以实现,当时,则与之相乘的项就不进行加法运算;当时,则与之相乘的项就作为一个加
5、数进行运算;这就大大减小了运算量,这也是FIR滤波器的分布式算法的最大优点。实际上,在FPGA使显示,(8)式并不是即用即算的,还有更加快捷的方法。在(8)式B个内积项当中,由于,而且各项内积运算都相当于是的一个线性组合,且每一项的系数都为0或1,而这样的线性组合共有种。基于以上事实,我们可以事先先将这种组合的值算出来并存入一片ROM当中,这样一来(8)式中的B次内积运算就相当于对ROM进行B次读操作,而第B-k次读ROM的地址就是N个输入数据的第B-k位所组成的二进制序列的值,而我们知道FPGA读ROM的某一个单元仅需要一个或两个时钟周期,其延时远远小于做N次加法或更多运算所需要的时间,这样
6、就大大减小了运算量和延时。一种ROM的存储内容构造方式如图3所示【3】:图3、ROM的地址与内容对应关系本实验中,内容与地址构造方式与图3相反。在实现时,对于(8)式的一次具体运算过程设这样的:(1)、将输入的N个数据都表示成B位2进制数。(2)、将N个数的最低位(第0位)按事先排好的顺序放在一起组成一个N位的二进制数作为读取ROM的地址,并将此单元中的值读出来,存在Sum当中,之后将Sum左移一位,最高位补0,让Sum仍为B位。(3)将将N个数的第1位按事先排好的顺序放在一起组成一个N位的二进制数作为读取ROM的地址,并将此单元中的值读出来,并将其加到Sum当中,之后又将Sum左移一位,最高
7、位补0,让Sum仍为B位。(4)重复(3)直至第B-1为运算完为止。经过以上4步后就完成了一个值得计算过程。滤波器的matlab仿真和VHDL实现根据前面的实验原理,这里我分别通过matlab和quartus来实现题目所要求的滤波器,通过两种不同的路径最后得出同样地结果,来互相验证其正确性。由前面的原理可知,4倍过采样时,我们需要4个子滤波器,每个滤波器都要进行分布式实现,而且每个子滤波器都需要不同的ROM来存取各个子滤波器的滤波系数的所有可能组合,因为各个子滤波器的滤波系数是不同的如表1所示,所以他们需要不同的ROM。而且由于滤波器是32阶的,所以每个子滤波器都是8阶的,这样一来(5)式中的
8、N=8,也借4片ROM的大小都是256个单元,而每个单元的位数则有需要确定,本实验中取12位。在本实验中,为了方便验证我进行了如下处理:(1) 数据源用matlab的randint函数产生码率为1/2的0、1序列,码长为1024,之后通过4PAM调制,来使数据幅度变化。同时将1024个码元存为1片1k大小的ROM,将4PAM的4个系数也存为一片4单元的ROM,系数用12为二进制数表示。(2) 将前述的4片ROM大小为256*12(3) 将滤波后的数据存在一个2048*12大小的RAM当中,以方便验证滤波过程的正确性。这里,我并不精确到每一步如何实现,只介绍如下两部分内容:(1) 如何通过mat
9、lab仿真来产生各步所需要的数据:信源数据、4PAM编码数据、32阶滤波器的系数、子滤波器4片ROM数据等。(2) 介绍FPGA实现时每个模块的接口和时序,中间可能设计一小部分具体细节。Matlab仿真(1)32阶滤波器系数,即4个子滤波器的ROM所需数据的产生过程代码段如下:RollOff = 0.6; Delay = 4; UpSampleFactor = 4; Hn = rcosfir(RollOff, Delay, UpSampleFactor, 1, sqrt);%产生32阶滤%波器系数Fn = Hn(1:32); ROM0 = zeros(1, 256); ROM1 = zeros
10、(1, 256); ROM2 = zeros(1, 256); ROM3 = zeros(1, 256); H0 = zeros(1, 8); H1 = zeros(1, 8); H2 = zeros(1, 8); H3 = zeros(1, 8); for i = 1:8%按表1取出4个子滤波器所需要的滤波器系数 H0(i) = Fn(i - 1)*4 + 1); H1(i) = Fn(i - 1)*4 + 2); H2(i) = Fn(i - 1)*4 + 3); H3(i) = Fn(i - 1)*4 + 4); end temp = zeros(1, 8); for k = 0:255
11、 str = dec2bin(k, 8); for i = 1:8 temp(i) = str(i) - 48; end for i = 1:8%生成4片ROM所需值 ROM0(k + 1) = ROM0(k + 1) + temp(i)*H0(i); ROM1(k + 1) = ROM1(k + 1) + temp(i)*H1(i); ROM2(k + 1) = ROM2(k + 1) + temp(i)*H2(i); ROM3(k + 1) = ROM3(k + 1) + temp(i)*H3(i); end end ROM0MAX = max(ROM0); ROM1MAX = max(R
12、OM1); ROM2MAX = max(ROM2); ROM3MAX = max(ROM3); for k = 1:256%对数据量化成12位2进制数,且用补码表示 if ROM0(k) 0 ROM0(k) = floor(4096 - abs(ROM0(k)*2048/ROM0MAX); elseif ROM0(k) = ROM0MAX ROM0(k) = 2047; else ROM0(k) = floor(ROM0(k)*2048/ROM0MAX); end if ROM1(k) 0 ROM1(k) = floor(4096 - abs(ROM1(k)*2048/ROM1MAX); el
13、seif ROM0(k) = ROM0MAX ROM0(k) = 2047; else ROM1(k) = floor(ROM1(k)*2048/ROM1MAX); end if ROM2(k) 0 ROM2(k) = floor(4096 - abs(ROM2(k)*2048/ROM2MAX); elseif ROM0(k) = ROM0MAX ROM0(k) = 2047; else ROM2(k) = floor(ROM2(k)*2048/ROM2MAX); end if ROM3(k) 0 ROM3(k) = floor(4096 - abs(ROM3(k)*2048/ROM3MAX)
14、; elseif ROM0(k) = ROM0MAX ROM0(k) = 2047; else ROM3(k) = floor(ROM3(k)*2048/ROM3MAX); end end(2)数据源及4PAM信号产生过程如下: Data = -3/sqrt(5) -1/sqrt(5) 1/sqrt(5) 3/sqrt(5);%4PAM信号对应的归一化幅值 MaxData = max(Data); for k = 1:4%量化成12比特数据 if Data(k) 4096 FIRData(i - 1)*4 + 1) = FIRData(i - 1)*4 + 1) - 4096; end FIR
15、Data(i - 1)*4 + 2) = floor(FIRData(i - 1)*4 + 2)/2) + ROM1(BinDataTemp(k) + 1); if FIRData(i - 1)*4 + 2) 4096 FIRData(i - 1)*4 + 2) = FIRData(i - 1)*4 + 2) - 4096; end FIRData(i - 1)*4 + 3) = floor(FIRData(i - 1)*4 + 3)/2) + ROM2(BinDataTemp(k) + 1); if FIRData(i - 1)*4 + 3) 4096 FIRData(i - 1)*4 +
16、3) = FIRData(i - 1)*4 + 3) - 4096; end FIRData(i - 1)*4 + 4) = floor(FIRData(i - 1)*4 + 4)/2) + ROM3(BinDataTemp(k) + 1); if FIRData(i - 1)*4 + 4) 4096 FIRData(i - 1)*4 + 4) = FIRData(i - 1)*4 + 4) - 4096; end end end FPGA实现时各模块的借口与时序设计在实现时,顶层我采用了bdf文件的形式,通过此图可以清晰的看出我的总体设计结构。设计中我将整个系统分成了3个层次,顶层控制模块负
17、责将数据从数据源ROM中读出,并且进行4PAM调制,并将调制信号送给滤波层次的顶层控制模块以进行滤波;滤波层次的顶层模块则是利用前面以及传来的待滤波的数据,通过一个移位寄存器产生4个子滤波器每次所需要的八个数据,移位寄存器初始化为全0,经过7次移位后才开始产生所需要的数据并将数据传给滤波的下一模块,这一层则是完成具体的滤波过程,对4个子滤波模块分别处理,时序最为复杂。 简化的总框图如下图所示:图4、系统总框图 顶层控制模块设计如下:图5_1、顶层模块接口设计图如图,clk、enable信号是整个系统仅有的两个输入信号,其余信号根据端口名字不难理解其意思,其中FilteredDataRAM有关的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 分布式 算法 FIR 平方根 余弦 多相 滤波器 仿真 上传
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-2388565.html