基于分布式算法的FIR平方根升余弦多相滤波器的仿真上传.doc

上传人:仙人指路1688 文档编号:2388565 上传时间:2023-02-17 格式:DOC 页数:17 大小:542.50KB
返回 下载 相关 举报
基于分布式算法的FIR平方根升余弦多相滤波器的仿真上传.doc_第1页
第1页 / 共17页
基于分布式算法的FIR平方根升余弦多相滤波器的仿真上传.doc_第2页
第2页 / 共17页
基于分布式算法的FIR平方根升余弦多相滤波器的仿真上传.doc_第3页
第3页 / 共17页
基于分布式算法的FIR平方根升余弦多相滤波器的仿真上传.doc_第4页
第4页 / 共17页
基于分布式算法的FIR平方根升余弦多相滤波器的仿真上传.doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《基于分布式算法的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有关的

18、信号是最后将滤波数据读出来看是否正确,此处我们通过直接查看RAM内容来验证,故此处不用。各信号的时序图可用如下图来表示:图5_2、FIR32Top模块时序图如上图所示,工作过程如下:(1) 当当前滤波过程完成时即滤波模块传给顶层模块的CurrentBitsCompleteFlags信号变为1有效后,紧接着的clk上升沿开始下一个周期。(2) 周期开始后的第一件事是连续读两次SourceROM取出两个0、1数据。(3) 读出两个0、1数据后紧接着的周期进行4PAM编码产生PAM4ROM读取地址。(4) 读取4PAM调制数据(5) 调制数据准备好之后,就让FIREn有效,开始这一个周期的滤波运算操

19、作,FIR32Top模块又等待下一个CurrentBitsCompleteFlags上升沿的到来。 滤波过程的顶层模块(地址产生模块)图6_1、地址产生模块接口设计图该模块的时序设计如下图所示:图6_2、FIR32AddGen模块的时序图由上图可知,FIR32AddGen模块的工作过程如下:(1) 下一层次AddShift模块的完成信号CBCFASMFlags信号有效,变为1,触发FIR32AddGen模块的新周期开始。(2) 新周期开始后第一个FIRClk上升沿就让后面的AddShift模块停止工作,即让AddShiftEn=0,同时FIR32AddGen内部的一位寄存器移位一次,以保存当前

20、的最近7个周期的数据,以便下一次使用。(3) 下一周期让CurrentBitsCompleteFlags信号有效,告知FIR32Top模块,当前数据滤波过程已经完成,可以输入下一个数据了,接着就等待FIR32Top模块准备下一个数据。(4) 待FIR32Top模块数据准备好后,即FIREn又变为有效,接着就将当前的输入数据读入CurrentData中(5) 下一个周期就让下一层AddShift模块开率对当前数据进行滤波,并且从此等待CBCFASMFlags信号的再一次有效。 滤波器执行模块(Add+Shift模块) 图7_1、AddShift模块接口图此模块的时序图如下图所示:图7_2、Add

21、Shift模块时序图(开始和结束和最后一个RAM写周期)图7_3、AddShift模块时序图(总体)图7_4、AddShift模块时序图(某一次AddShift操作)如图7_2所示:(1)、AddShiftMEn的上升沿之后开始一个新的AddShift周期,周期开始的第一件事就是让CBCFASMFlags无效(2)、整个周期内比较复杂,因此我们通过图7_3来观察,整个AddShift周期内明显可分为四部分,即对应4个子滤波器的滤波过程,此处他们是串行进行的,在实际应用中,他们四个完全可以并行进行最后再将并行输出数据串行化即可。此处,对应每个子滤波器都有一次RAM的写操作,即整个周期内输出4个数

22、据,也就是1个输入对应4个输出,即4倍过采样。对于对RAM的写时序图可以看图7_2中表示出了,一个周期内最后一个RAM写过程。(3)、对于一个子滤波器的内部过程,如实验原理中的分布式算法一样,此处由于数据是12位的,因此,一个过程包括对某片ROM的12次读取过程,另外就是每次读取后对数据进行Add、Shift操作,图7_4表示出了某一次AddShift过程:图中,某时刻AddShiftClk的上升沿是读取了ROM1的第76单元的数据为4006(此处的数据实际上是前一周期的数据,即输出数据整体上往后移动了1个AddShift周期,此问题还有待解决),此时前面所有周期的累加和AccumulateS

23、um=1881,当AccumulateTemp=4006后,两者相加使AccumulateSum=1791,接着又将AccumulateSum左移一位,最高位补0使AccumulateSum=895,在等待下一次的AddShift操作。 存储模块的设计图8_1、ROM存储模块图8_2、RAM存储模块如图4(1)所示,各ROM存储块都采用quartus自带的lpmrom生成,都带有address、clock、clken、q几个端口,时序很简单,这里不再介绍。实验结果及其验证本实验通过matlab和vhdl分别实现,并通过他们各自得出的滤波结果的对比来验证算法设计和vhdl实现的正确性。 用mat

24、lab实现是滤波后的结果如下图所示:292129312532195916643668391020202104164310674642927611793278131023125250217521407177724602976299229672439176319651791248429852951289325202083169814871065617437619106816183813234425202893295329952487177714021747246030062993293224522167213016631727166315851905245229322991298724541775

25、198118972433297130042971243318971979177524542987299129222449191916011677170616242128304424612803281830853233322429362647180281127840510851799198318081107420264762181728013103311524811735141918172441283628393069316431002842281124583040211716161751180617091780179317612744234823692300220117831849178916

26、431743186819292068176311426083906161142161817791934189517552163230229852195204016201144618384595114016452069301419711732166918283919217816581899250529732968295424811897155716751761165820742964254831213083278818418673973393933694008421856291832313009182055212262217592715297932163182305428452867244217

27、921962175224632999296729172521205916831494109162941158611101639182519471840222228271839183316291488188125793123305127691867903390320417480520742118516202032300730001945204216731129458234743185228253053307825982027162514861145670386532113317903065284411104142787921777264529643267319029202675294531673

28、149285627762412193617253771227337841702187624913087 用vhdl滤波结果如下图所示:以上结果分别是用matlab和vhdl滤波结果的前320个数,其中vhdl的前8个数据舍去是因为输入还没有凑足8个数据相当于滤波过程当中边上的点。由以上数据可以看出,他们吻合得很好,这及说明了算法设计的正确性,也说明了vhdl实现的正确性。由于数据较多这里不全部列出,更多的数据,师兄可以运行两个程序,去对比。实验过程中遇到了但还没解决的问题 当系统最开始运行读第一片ROM时,不知为什么,它自动在绕让读出的第一个ROM数据为0(并不是ROM第一个单元中的0,而是在

29、前面在插入了一个0),此处为了仿真验证,暂时解决办法是在matlab仿真当中,给数据源最开始处插入一个0。 当系统进行到AddShift运算操作时,从ROM中读出的数据也自动向后延迟了一个读取周期,暂时解决办法,是在每个数据的12次AddShift操作当中,将其变为13次,但利用的是后12次,第一次只读不进行操作,此时将累加和赋值为0.参考文献【1】 作者不详. 数字中频,电信科学技术研究院硕士学位论文【2】 张会生,王效洪,耿光辉. 基于FPGA实现根升余弦滤波器的研究,西北工业大学电子信息学院,无线通信技术,2005年第2期【3】 毕占坤,吴伶锡. FIR滤波器分布式算法的原理及FPGA实

30、现,电子技术应用,2004年第7期Acknowledgements My deepest gratitude goes first and foremost to Professor aaa , my supervisor, for her constant encouragement and guidance. She has walked me through all the stages of the writing of this thesis. Without her consistent and illuminating instruction, this thesis could

31、 not havereached its present form. Second, I would like to express my heartfelt gratitude to Professor aaa, who led me into the world of translation. I am also greatly indebted to the professors and teachers at the Department of English: Professor dddd, Professor ssss, who have instructed and helped

32、 me a lot in the past two years. Last my thanks would go to my beloved family for their loving considerations and great confidence in me all through these years. I also owe my sincere gratitude to my friends and my fellow classmates who gave me their help and time in listening to me and helping me w

33、ork out my problems during the difficult course of the thesis. My deepest gratitude goes first and foremost to Professor aaa , my supervisor, for her constant encouragement and guidance. She has walked me through all the stages of the writing of this thesis. Without her consistent and illuminating i

34、nstruction, this thesis could not havereached its present form. Second, I would like to express my heartfelt gratitude to Professor aaa, who led me into the world of translation. I am also greatly indebted to the professors and teachers at the Department of English: Professor dddd, Professor ssss, w

35、ho have instructed and helped me a lot in the past two years. Last my thanks would go to my beloved family for their loving considerations and great confidence in me all through these years. I also owe my sincere gratitude to my friends and my fellow classmates who gave me their help and time in listening to me and helping me work out my problems during the difficult course of the thesis.

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号