DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1298|回复: 0
打印 上一主题 下一主题

[待整理] 信号去直流方法

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-12 16:26:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
利用FPGA进行数字信号处理时,信号中的直流分量通常需要去除,而直流分量在AD前段就存在,如果采用模拟电路去除直流分量比较复杂,因此通常在AD后端数字域去除直流分量。在FPGA中,常规去直流的方法是先对信号进行累加,然后对累加值进行移位即可得到直流分量,如累加8192个数据,则直流分量可由累加值右移13位得到。
         
        本文介绍一种根据Xilinx FPGA中DSP48E1资源设计的去直流模块,其基本原理采用一阶滤波器,如图1所示,通过一个一阶RC电路,在V0端可等效一个低通滤波器,得到直流分量。
       
       
        由上式可推导出,
       
        定义系数,
       
        由此可得到下式:
       
        由上式可得到如图2所示结构
       
       
        仔细观察发现图2中结构与Xilinx FPGA的DSP48E1结构十分相似,如图3所示,两个结构做了类比,其中Vi - Vo的减法可由DSP48E1中的Pre-Adder实现,k*(vi - vo)的乘法可由DSP48E1中的Multipler实现,而Vo + k*(vi - vo)加法可由DSP48E1中的Accumulator实现。因此实现这个去直流模块只需1个DSP48E1资源,并且在Xilinx 7系列FPGA中,DSP48E1最大支持25-bit的Pre-adder、25*18-bit的Multipler和48-bit的Accumulator,基本可满足常规处理。
       
       
        具体实现:
       
        在ISE的HDL language template中可以找到DSP48的宏定义,这边需要用到ADDMACC_MACRO,只需要将这个宏模板拷贝到程序中直接例化即可调用DSP48,去直流模块的DSP48E1实现代码如下所示:
       
        module DCOff_DSP(
       
        input clk,
       
        input rst,
       
        input [15:0] din,
       
        output [15:0] dc
       
        );
       
        wire signed [31:0] PRODUCT;
       
        wire signed [15:0] K;
       
        wire signed [31:0] ACOUT;
       
        assign K=16'h0085;
       
        ADDMACC_MACRO #(
       
        .DEVICE("7SERIES"), // Target Device: "VIRTEX6", "SPARTAN6", "7SERIES"
       
        .LATENCY(4), // Desired clock cycle latency, 0-4
       
        .WIDTH_PREADD(16), // Pre-adder input width, 1-25
       
        .WIDTH_MULTIPLIER(16), // Multiplier input width, 1-18
       
        .WIDTH_PRODUCT(32) // MACC output width, 1-48
       
        ) ADDMACC_MACRO_inst (
       
        .PRODUCT(PRODUCT), // MACC result output, width defined by WIDTH_PRODUCT parameter
       
        .CARRYIN(1'b0), // 1-bit carry-in input
       
        .CLK(clk), // 1-bit clock input
       
        .CE(1'b1), // 1-bit clock enable input
       
        .LOAD(1'b1), // 1-bit accumulator load input
       
        .LOAD_DATA(PRODUCT), // Accumulator load data input, width defined by WIDTH_PRODUCT parameter
       
        .MULTIPLIER(K), // Multiplier data input, width defined by WIDTH_MULTIPLIER parameter
       
        .PREADD2(-PRODUCT[31:16]), // Preadder data input, width defined by WIDTH_PREADD parameter
       
        .PREADD1(din), // Preadder data input, width defined by WIDTH_PREADD parameter
       
        .RST(rst) // 1-bit active high synchronous reset
       
        );
       
        assign dc=PRODUCT[31:16];
       
        endmodule
        以下是得到的综合报告,主要就使用了1个DSP48E1资源,并且最高时钟频率高达552MHz,可满足通信系统中频数据处理。
       
        Selected Device : 7k325tfbg676-3
       
        Slice Logic Utilization:
       
        Number of Slice LUTs : 16 out of 203800 0%
       
        Number used as Logic: 16 out of 203800 0%
       
        Number of DSP48E1s: 1 out of 840 0%
       
        Timing Summary:
       
        Minimum period: 1.811ns (Maximum Frequency: 552.273MHz)
       
        Minimum input arrival time before clock: 0.694ns
       
        Maximum output required time after clock: 0.568ns
       
       
        如图4所示为去直流模块的仿真波形,输入为有直流偏置的正弦波,从图中可看出输出直流分量随着滤波数据的增加慢慢收敛,而这个收敛速度取决于系数k,根据k的表达式可得,k的值取决于采样周期和RC值,如果采样频率固定为245.76MHz,则RC值决定了k的取值。
       
        根据多次仿真的到k的不同取值对模块的影响:
       
        k取值越大,DC值收敛得越快;k取值越小,DC值越稳定、越平滑。因此,不是k取值越大越好,收敛快但是波动比较大,如图5所示,这样直流分量肯定是滤不干净的。
       
       
        究其原因,得从原理上着手,翻看了一下信号与系统书(这些基本概念长时间不用都还给老师了,平时还得多注意复习一下基础知识),原来k的值决定了这个低通滤波器的截止频率,输出直流分量的波动性不仅仅跟k值有关,还与输入信号频率和采样频率有关,在本文实例中,输入信号频率为5MHz,采样频率为245.76MHz,在图4中k=0x85,图5中k=0x400,如图6所式为k的两个取值得到滤波器的幅频特性,并且标出了输入信号所在频点(5MHz/245.76*2=0.04068)的幅度特性,分别为-29.98dB和-12.6dB,相差了近20dB。因此在设计去直流模块时应根据实际应用情况决定k的取值。
       
       
        本文介绍了一种信号去直流的新方法,但不是所有场合都试用,如果FPGA平台DSP资源比较少,如SPARTAN系列,建议采用常规累加+移位的方法。而本文实例中采用Kintex7系列FPGA,有丰富的DSP资源,而采用此方法整个模块只需要1个DSP48E1,并且能高速处理,因此非常适用。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2025-8-2 22:55 , 耗时 0.089859 秒, 22 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表