基于FPGA的SRRC数字滤波器设计与实现

2016-12-31 19:41张晴上海市计量测试技术研究院
数码世界 2016年6期
关键词:码元余弦滤波器

张晴上海市计量测试技术研究院



基于FPGA的SRRC数字滤波器设计与实现

张晴
上海市计量测试技术研究院

摘要:随着数字技术的不断发展,数字滤波在数字信号处理领域占据不可替代的地位。文章首先介绍了数字滤波器的理论,DSP器件在高速和实时系统中的应用有一定局限性的问题提出了基于FPGA消除基带传输系统码间干扰的实现方案。该方案设计了一个33阶的具有对称转置结构的平方根升余弦滚降(SRRC)滤波器。首先通过MATLAB对滤波器系数进行了提取,并对浮点型系数进行量化和CSD编码形成定点型系数,使之能够在FPGA中运行。利用硬件描述语言Verilog对所设计的滤波器各功能模块进行设计。最后釆用仿真综合软件Modelsim和Quartus II对顶层模块进行综合与仿真。仿真后得到的滤波后数据波形图与Matlab下理论性的滤波后数据波形图基本相吻合,证明了所设计的SRRC数字滤波器功能完全正确。

关键字:平方根升余弦滚降滤波器 仿真 硬件描述语言 冲击响应系数 移位相加方法

1 引言

由于平方根升余弦滤波器在时域具有较快的衰减,可降低抽样判决时错误的可能性,所以在数字通信中为了减少接收端的误码率,普遍采用其作为成形滤波器。以往的平方根升余弦滤波器普遍采用 DSP(Digital Signal Processing)方法来实现。数字滤波的输出是通过输入采样流与滤波器系数卷积而得到的,所需算法工作量十分庞大,而DSP器件由于软件算法在执行时的顺序性限制了在高速和实时系统中的应用。随着FPGA在容量、速度上的大幅提升,FPGA在数字信号处理领域的应用也越来越 广泛,利用FPGA可以重复配置高精度的数字滤波器,使用Verilog硬件描述语言改变滤波器的系数和阶数,并能实现大量的卷积运算算法。

2 平方根升余弦成形滤波器原理

数字基带传输系统通常由脉冲形成器、发送滤波器、信道、接收滤波器、抽样判决器与码元再生器组成。

为了让信号在有带宽限制的信道中进行传输,通常在发送端把信号经成形滤波器进行带宽限制,这样就会导致码元间的干扰。而接收端滤波器的作用是最大限度地减小码元间的干扰,使接收端能在抽样判决时刻准确恢复发送端对应码元的幅度信息,从而使系统传输误码率降到最低。从发送滤波器到接收滤波器总的传输特性:(1) 根据奈奎斯特第一准则,若H(ω)的幅频特性满足滚降系数为升余弦(RRC)滤波器特征时,可以实现无码间串扰传输。当信道噪声可忽略时,按照匹配滤波器的输出信噪比最大准则,可以将升余弦滤波器分为2个平方根升余弦滚降滤波器(SRRC)来实现,一个在发射端用于发射成形滤波,一个在接收端用于匹配滤波。

3 平方根升余弦成形滤波器的设计

3.1滤波器参数的确定可知,平方根升余弦滚降滤波器的时域表达式是一个无穷阶数的系数对称的滤波器。为了能够在硬件电路上实现,必须截取其中的一部分阶数,SRRC滤波器的阶数可以用N=L×K来表示,其中L表示每个符号的取样点数即采样倍数,K表示 考虑最佳采样点处受影响的相关码元个数,相关码元个数越多,最佳采样点处的码间干扰越小。 fdatool 是Matlab信号处理工具箱提供的一种综 合、简便的图形化用户工具[8]。本文使用fdatool进 行仿真优化,得出不同参数对信号传输误码率的影响,最终确定所设计SRRC滤波器的参数是滚降系 数α=0.20,相关码元为4个,8倍采样,滤波器阶数为33阶。3.2 SRRC滤波器的FIR实现结构设计本文根据所设计SRRC滤波器的阶数,综合FIR 直接转置型结构和线性相位型结构的特点,设计了具有线性转置型结构的SRRC滤波器,该结构具有关键路径上传输延迟小,系数减少一半等特点。

在该结构中,输入的数据首先与17个(阶数加一的一半数量)滤波器冲击响应系数相乘,结果送入寄存器。在完成输入数据与系数h1到h16的乘累加后,反向按照h15到h0的顺序再次与系数进行乘累加,直到完成阶数数量的乘累加操作,得到最终的滤波输出结果。

4 平方根升余弦成形滤波器的FPGA实现

4.1冲击响应系数的生成 通过调用Matlab中的rcosfir函数可以生成所设 计SRRC滤波器的冲击响应系数,其中,R就是滚降因子α,本文设为0.2; nT就是代表相关码元个数用来控制滤波器长度的参数,本文设为4; rate为每个符号周期的采样点数,本文设为8; T是符号持续时间,本文设为1;

filter_type为滤波器类型参数,本文设为sqrt, 即根升余弦滤波器。

Matlab中调用rcosfir函数生成归一化的滤波器冲 击响应系数的代码如下所示: OSR=8; rollFactor=0.2;

srrcTaps1=rcosfir(rollFactor,[-2 2],OSR,1,’sqrt’);

srrcTaps2=srrcTaps1/sum(srrcTaps1)*OSR;

代码首先初始化每码元周期采样点数OSR和滚降 因子rollFactor,然后调用rosfir函数生成系数srrcTap1 并对其进行归一化处理后得到最终的冲击响应系数 srrcTaps2。

4.2冲击响应系数的Q值量化和CSD编码 FPGA主要用于以定点数为主的运算处理,而在完成SRRC滤波器设计时通过MATLAB计算出的固定系数都是浮点数,因此必须将系数量化后再用作FPGA的处理。本文将量化Q值确定为10,先把冲击响应系数(Matlab中得到的系数srrcTaps2)乘以2 的10次方即1024后再进行取整。

滤波器涉及数据与冲击响应系数相乘,如用乘法器实现,则由于乘法器所占据的面积大,延时长,常常不能满足高速的要求。鉴于冲击响应的系数是常系数,则可以通过对数据移位相加、减来实现乘法运算。 一个整数x的二进制表示(如xB-1xB-2…x2x1x0)就是若干个2的整数次幂之和,它与另一个整数y的 乘积:

其中y*2b可以通过对y进行移位操作得到.所以 当x为常数时,其二进制表示中相应的xb是定值(0或 l),因此可以通过对数据移位相加来实现乘法运算。

由于x=0时的对应项y*2b并不参加累加运算,所 以如果找到一种表示方法使非零元素数量降低,则 可以使得加法器的数量减少,从而降低硬件的规模, CSD表示法即正则有符号数字表示法正是这样的一 种方法。它的编码规则是从低位到高位用10..-(-代 表-1)替换所有大于1个1的序列,然后再看是否存在 1011,有的话用110-替换。

二进制补码使得累加多个有符号数值成为可能, 所以本文先将量化取整后的系数转换为二进制补码 形式,再进行CSD编码,得到便于在FPGA中运算处 理的数据移位相加、减运算的2的整数次幂之和形式 的定点型冲击响应系数。

4.3SRRC滤波器各功能模块的硬件语言描述 完成滤波器参数和结构的设计后,需要使用硬件描述语言对SRRC滤波器的各个功能模块进行描述,以生成可以在FPGA仿真综合软件上编译运行的硬件描述文件。本文采用模块化的思想设置一个顶层模块,并在顶层模块下划分两个子模块,一个是电平转换模块,用于根据信道传输要求将输入数 据信号转换成4级symbol信号。另一个是核心功能模 块滤波模块,完成输入数据与滤波器冲击响应系数 的乘累加运算,输出滤波后的数据信号。 Verilog是一种用于从算法级、门级到开关级的多种 抽象设计层次的数学系统建模的硬件描述语言,本文采用Verilog对SRRC滤波器各功能模块进行硬件描述。

4.3.1电平信号转换模块的Verilog代码实现 要数字信号传输进行远距离传输时必须将基带 信号调制到高处。本文在滤波器滤波模块前设置了 电平信号转换模块,使用欧洲电信标准化协会(ETSI)推荐性标准中的4FSK这样的多进制频 移键控调制方法来降低信道系统信噪比的要求。该模块根据基带脉冲输入序列4个码元(00,01,10, 11)转换成4个symbol信号(+3,+1,-1,-3),对应 四种载波的频率,其中一个码元对应两个bit,所以 symbol速率为symbol速率的两倍,一个symbol周期是一个symbol周期的两倍。

本文所设计的SRRC滤波器的系统时钟频率设为50MHZ,采样频率设为38400HZ。因此采样周期是系统时钟周期的

50000000/38400=1302倍,也就是说每1302个系统时钟周期滤波器会采一次样。所以在电平信号转换模块设置了一个计数器count,在系统时钟信号的上升沿或者复位信号的下降沿触发,从0 计到1301,计数未满1301时,count加1,相关代码如下所示:

always @(posedge sclk or negedge reset_n)

if(!reset_n)

count<=12’b0;

else if(div_t==2’b01)

begin

if(count

count<=count+1’b1;

else count<=12’b0;

end

else if(div_t[0]==1)

begin if(count

else count<=12’b0;

end

else if(div_t==2’b10)

begin

count<=12’b0;

end

本文设计的SRRC滤波器采用8倍采样速率,每采8次样完成一个symbol的传输,所以本文设置了一个3位的计数器count_8,当计数器count计到1301(即 按38400Hz的采样频率采一次样)时,计数器count_8 加1,从0计到7。每计到7时将symbol传输完成标志 symbol_rate_flag置为高电平,表示symbol信号传输 完成。由于采用4FSK调制方法,一个symbol周期是 bit周期的2倍,1个bit信号占4个采样点,所以本文 设置计数器count_8在计到3和7时将bit传输完成标志 bit_rate_flag置为高电平,表示bit信号传输完成,相关代码如下所示:

always@(posedge sclk)

if(!reset_n) count_8<=3’b0;

else if(count==COUNT_BIT_RATE-1)

count_8<=count_8+1’b1;

else if(div_t==2’b10)

count_8<=3’b0; always@(posedge sclk)

if(count==COUNT_BIT_RATE-2)

begin if(count_8==3’d3||count_8==3’d7)

bit_rate_flag<=1’b1;

end

else bit_rate_flag<=1’b0; //symbol_rate_flag

always@(posedge sclk)

if(count==COUNT_BIT_RATE-1)

begin

if(count_8==3’d7)

symbol_rate_flag<=1’b1;

end

else symbol_rate_flag<=1’b0;

在电平信号转换部分,本模块将输入的电平信号赋值给定义的2位输入缓冲信号寄存器data_in_buf 的低位,原输入缓冲信号的低位传入到高位,这样便完成输入数据的串转并转换,以满足4FSK调制方 法对输入序列码元的要求。接着根据data_ in_buf中的信号值使用case语句将4级symbol信号分别赋值

为 +3,+1,-1,-3,相关代码如下所示:

//l4_symbol_v

always @(posedge sclk) l4_symbol_v<=data_in_buf_v;

//convert to 4 level symbol

always @(posedge sclk) if(symbol_rate_flag)

begin case(data_in_buf)

2’b10:

begin l4_symbol<=3’b011;

end

2’b00:

begin l4_symbol<=3’b001;

end

2’b01begin l4_symbol<=3’b111;

end

2’b11:

begin l4_symbol<=3’b101;

end

endcase

end

最后将4级symbol有效信号赋值给输出有效信号 dov,将4级symbol信号14_symbol赋值给数据输出信 号dout,完成转换后数据信号的输出,相关代码如 下所示:

//dov

always @(posedge sclk)

if(!reset_n) dov<=’b0;

else

dov<=14_symbol_v;

always @(posedge sclk)

if(inserted_flag_t && count_8==3’d0 &&

l4_symbol_v) dout<=

l4_symbol;

else if(inserted_flag_t && count_8>3’d0 &&

l4_symbol_v) dout<=3’d0;

else if(last_count==13’d1303 &&

l4_symbol_v) dout<=3’d0;

endmodule

4.3.2滤波模块的Verilog代码实现 输入数据信号完成电平信号转换后输出到滤波器 的核心功能模块滤波模块中进行滤波。

在滤波模块的输入端,din作为数据输入信号是 来自电平转换模块的输出信号,din_valid作为数据 输入有效信号。在输出端,dout为数据输出信号也 是顶层模块的最终输出,din_valid为数据输出有效 信号。 本文采用移位相加方法实现SRRC滤波器的滤 波模块。 移位相加法是通过输入数据按照冲击响应系数 的CSD编码进行移位相加以完成输入数据与系数的相 乘运算的方法。首先在滤波模块中定义三个寄存器r ,h和q,r寄存器为输入数据信号的移位值,h寄存 器为冲击响应系数和输入数据之间的移位相加结果 ,q寄存器存储h寄存器值的累加和。

CSD编码后的冲击响应系数中2的 整数次幂的最高指数为10,最低指数为0,所以将输 入数据从移0位到移10位后的结果依次赋值到寄存器 r[0]到 r[10]中去,相关代码如下所示:

//r0~r7

always @ (posedge sclk)

if(base_cnt==’d1)

begin

r[0]<=din_t;

r[1]<=din_t<<1;

r[2]<=din_t<<2;

r[3]<=din_t<<3;

r[4]<=din_t<<4;

r[5]<=din_t<<5;

r[6]<=din_t<<6;

r[7]<=din_t<<7;

r[8]<=din_t<<8;

r[9]<=din_t<<9;

r[10]<=din_t<<10;

end

完成r寄存器的赋值后将存储其中的移位值按照 系数在CSD编码后的2的整数次幂和的形式进行加减 后赋值到17个存放冲击响应系数的寄存器h[0]到 h[16]中去,并逐个进行累加,累加的和依次存入到 寄存器q[0]到q[32]。最终累加结果也就是滤波后的 数据存储在q[32]中,将其赋值给数据输出信号 dout。

5 仿真验证

5.1Matlab下对测试数据进行SRRC滤波试验 对于所设计的SRRC滤波器的仿真验证,本文 使用Modelsim仿真和连接FPGA开发板使用Quartus II进行仿真两种方法,分别输出滤波数据结果波形 图与Matlab下的理论性滤波输出数据结果波形图进 行比较以验证所设计SRRC滤波器功能的正确性。 首先在Matlab下编辑代码生成一组随机数据, 将该数据进行8倍升采样后与调用升余弦滤波器函数 并进行归一化处理后获得的滤波器系数srrcTaps2进行卷积运算,运行得到Matlab下的理论滤波结果 srrcout。

5.2使用modelsim进行仿真验证 在modelsim中建立滤波器仿真工程,在工程目 录下建立目录mif_data并将Matlab下生成的测试数据 转换为16进制后按照一定格式保存为mif文件(通用数据交换文件),存放到mif_data目录下。 编写仿真工程启动脚本文件start.fdo,内容包括添加编写的SRRC滤波器各功能模块和顶层测试模块的Verilog代码文件以及仿真所需要的库文件 220model.v和altera_mf.v并进行编译、设置波形窗口 和波形的参数等。在Modelsim命令行中执行do start. fdo命令,Modelsim编译添加的文件并添加滤波 模块中各信号的波形图到显示窗口。

将Modelsim下生成的滤波输出数据信号波形图与Matlab下的理论性输出数据波形图相比较,发现两者基本相吻合,Modelsim下的仿真结果验证了所设计SRRC滤波器功能的正确性。

5.3使用Quartus II连接FPGA开发板进行仿真验证首先在Quartus II下新建滤波器仿真工程,调用 Tool菜单中的MegaWizard插件管理器选取Memory Compiler中的RAM-1PORT单口读写插件,设置存放测试输入数据的mif文件的文件夹路径,生成单口读写模块例化文件存储在新建Quartus II仿真工程的ipcore_dir目录下,并在滤波器顶层模块中加以定义。然后添加编写的滤波器各功能模块的Verilog代 码文件以及单口读写模块文件并进行编译。编译完成后在Quartus II中新建SignalTapII逻辑分析仪文件生成SignalTapII逻辑分析仪窗口,配置采样深度,添加需要观察的波形的信号并分配管脚,使用USB 下载线通过JTAG接口将FPGA开发板与计算机相连并在逻辑分析仪窗口中选中所连接开发板的硬件类型。最后执行SignalTapII逻辑分析仪的分析程序生 成连接FPGA开发板进行仿真所输出的滤波模块信号 波形图。将Quartus II下生成的滤波输出数据信号波形图 与Matlab下的理论性输出数据波形图相比较,发现两者同样基本相吻合,进一步验证了所设计的SRRC滤波器功能的正确性。

6 结束语

本文探索使用Verilog硬件描述语言设计基于 FPGA的SRRC数字滤波器的实现方法,并使用仿真 软件Modelsim和Quartus II对实现SRRC滤波器各 功能模块进行仿真验证,然后将仿真的滤波输出数 据与Matlab下的理论性滤波输出数据进行了比较分 析,证明所设计的基于FPGA的SRRC数字滤波器的 实现方法具有精确、快速、灵活、适用性强及硬件 资源耗费少等特点,但其功能还需要改进和完善以 在进一步提高速度的同时,减少资源的占用。

参考文献

[1]山蕊,蒋林,杜慧敏,等.平方根升余弦滤波器的设计与FPGA实现[J].西安邮电学院学报, 2011,16(3):30-33.

[2]周文辉,程钢,苏凯雄,等.一种新型的基带成型SRRC滤波器的设计[J].福州大学学报,自然科学版,2009,37(4):14-518.

[3]刘建成,邹应全,徐伟,等.基于FPGA的FIR滤波器设计与仿真[J].南京信息工程大学学报,自然科学版,2010,2(5):400-404.

[4]赵林军.根升余弦脉冲成形滤波器FPG实现[J].现代电子技术,2011,34(1):23-28.

[5]李和,李思敏.高速基带匹配滤波器的FPGA实现及验证[J].现代电子技术,2007,22: 154-156.

[6]卢莹莹,潘长勇.高阶平方根升余弦滚降滤波器的FPGA实现.器件与用,2008,32(2),30-32.

[7]张松轶.基于FPGA的平方根升余弦滤波器设计[J].无线电通信技术,2012,38(3):43-46.

猜你喜欢
码元余弦滤波器
旋转变压器接线故障分析法的研究
基于ZYNQ的IRIG-B(DC)码设计与实现
LFM-BPSK复合调制参数快速估计及码元恢复
短码元长度长波ASK信号的一种混沌检测方法*
从滤波器理解卷积
Comparison of decompression tubes with metallic stents for the management of right-sided malignant colonic obstruction
开关电源EMI滤波器的应用方法探讨
关于网络隐私保护的数字信息加密技术
一种微带交指滤波器的仿真
两个含余弦函数的三角母不等式及其推论