FPGA数字信号处理(十二)滑动平均滤波器

上一篇介绍了数字通信系统中ASK解调技术的FPGA实现。在ASK解调系统中,需要对低通滤波器提取出的基带包络信号做判决输出,本文将介绍其中涉及到的判决门限问题,以及在FPGA中的实现方法。主要介绍了如何使用滑动平均滤波器求得信号均值。


判决门限

由上一篇可知,LPF输出的基带包络信号包含有直流分量。2ASK信号只有2种电平状态,因此只需要将基带波形的直流分量作为判决门限即可。4ASK信号有4种电平状态:最大幅度的0、1/3、2/3、1倍,选取中间值1/6、1/2、5/6作为判决门限正确率最高。可见,无论是2ASK还是4ASK,都需要先获得直流分量。

本文将讲述ASK解调系统中判决门限的选择问题,以及FPGA的设计。由于ASK解调出的基带信号含有直流分量,因此需要这样处理。对于2FSK、BPSK这种不含直流分量的解调系统而言,判决门限直接选择0即可。


滑动平均

在FPGA中,求取信号的直流分量即为求信号的均值,参与均值运算的数据越多,则计算准确度越高,消耗的资源也越大。

最方便实现的求均值方法便是滑动平均滤波器,之所以称之为滤波器是因为该算法本身有一种保留低频分量、滤除高频分量的特性。如3点滑动平均滤波器的输出y(n)=[x(n-2)+x(n-1)+x(n)]/3。滑动平均滤波器的频率响应与CIC滤波器的完全一致,系数都是1(CIC滤波器参考本系列16~19篇)。

上述示例x(n)的每个取样点权值相同,都为1/3。也可以为每个取样点选择不同的权值,即为所说的加权滑动平均滤波器,将在后面的文章中叙述。


FPGA设计

在Vivado开发环境下完成256点滑动平均滤波器的设计。模块接口如下:

`timescale 1ns / 1ps
//--------------------------------------------------------
//   ASK解调系统,符号判决模块
//--------------------------------------------------------
module gate
(
    input rst,
    input clk,
    input signed [13:0] din,  //LPF输出的基带信号包络
    output signed [13:0] mean //基带信号的直流分量
);

使用一组256个寄存器移位存储基带信号数据,即求平均值时共选取256个数据进行运算。代码如下:

//--------------------------------------------------------
//   256级寄存器移位缓存数据
//--------------------------------------------------------
reg [13:0] din_reg [255:0];
integer i, j; 

always @ (posedge clk or posedge rst)
    if (rst)        //复位清0
        for (i=0; i<=255; i=i+1)
            din_reg[i] <= 'd0;
    else begin
        din_reg[0] <= din;
        for (j=0; j<255; j=j+1)
            din_reg[j+1] <= din_reg[j];
    end 

代码中使用integer类型的变量i和j来对寄存器组进行操作。需要注意:i和j在这里只是起辅助作用,即利用for循环来使代码更简洁易懂。在综合时,这两个变量是会被综合器优化掉的,有如下提示:

[Synth 8-6014] Unused sequential element i was removed. ["C:/Users/GodWa/Desktop/ASKdemod_liuqi/ASKdemod_liuqi.srcs/sources_1/new/gate.v":20][Synth 8-6014] Unused sequential element j was removed. ["C:/Users/GodWa/Desktop/ASKdemod_liuqi/ASKdemod_liuqi.srcs/sources_1/new/gate.v":20]

这个结果是可以预料的,因为我们完全可以用“din_reg[0]=0; din_[1]=0;……”这种写法将所有寄存器清0,显然不需要用到i和j这两个变量。这就要感谢智能的综合器,可以让我们在不浪费资源的情况下,使用简洁的代码编写方式。

对连续256个寄存器数据求和并计算均值,由于是带符号数,相加时高位 应该补符号位,代码如下:

//--------------------------------------------------------
//   计算基带信号连续256个数据的均值
//--------------------------------------------------------    
reg signed [21:0] sum;

always @ (posedge clk or posedge rst)
    if (rst) sum <= 'd0;
    //将最老的数据换为最新的数据
    else sum <= sum + {{8{din[13]}},din} 
                - {{8{din_reg[255][13]}},din_reg[255]};   

assign mean = sum[21:8];  //右移8bit等效为÷256    

endmodule   

这样便得到了基带信号的直流分量。对于2ASK解调,这个值可以直接作为判决门限;对于4ASK解调,还需要由直流分量(即1/2)得到1/6和5/6两个判决门限。这会涉及到常系数的乘除法,对于FPGA而言,这两种运算很消耗资源(尤其是除法),可以采用在https://blog.csdn.net/fpgadesigner/article/details/80710344 用过的移位相加的方法来代替。


仿真与工程下载

将判决门限模块加入到ASK解调系统的工程中进行仿真。对2ASK信号解调的仿真效果如下图所示:
这里写图片描述
看到黄色标签处的基带信号最大值为3923,此时的直流分量为1904,可以作为判决门限。直流分量的值一直都比较稳定。4ASK信号解调的仿真效果如下图所示:
这里写图片描述
看到黄色标签处的基带信号最大值为4303,此时的直流分量为2031,可以作为判决门限。

不过可以预料到的是,在初始阶段,当数据点数不足256个时(不够的值会采用默认值0填充),计算得到的直流分量会有相当大的误差,这在应用于解调系统时会造成一定的错误,具体情况可参考本系列第11篇的仿真。

FPGA中实现数字信号处理算法具有吸引力的替代方案。随着FPGA技术的进步,硬件和软件设计层面上的传统限制正在被克服。FPGA硬件结构正日益实现增强的DSP块,提供更多功能和更强的性能。同时,系统级设计软件简化了从块级到硬件描述语言(HDL)的转换过程,其中一些工具集成了流行的DSP算法开发工具(如MATLAB),大大简化了在FPGA中实现信号处理算法的过程。此外,FPGA中还包含一些预先验证过的信号处理算法单元,也就是IP核或块,它们能够高效地实现常用的信号处理功能,从而降低成本、风险并缩短开发时间。引用提供了有关FPGA数字信号处理的实践应用和代码实现的详细描述。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [FPGA数字信号处理](https://blog.csdn.net/weixin_30645617/article/details/96950800)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [FPGA数字信号处理与工程应用实践](https://download.csdn.net/download/m0_37713895/10402659)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值