fpga的希尔伯特变换实现 您所在的位置:网站首页 希尔伯特变换相位变化 fpga的希尔伯特变换实现

fpga的希尔伯特变换实现

2023-07-04 12:31| 来源: 网络整理| 查看: 265

fpga的希尔伯特变换实现 零.实现背景一.希尔伯特实现的基本原理二.fpga实现1)matlab仿真2)fpga滤波器实现实现成本:fpga实现采用VIvado的FIR的IP核,第三个问题 fpga仿真0. matlab 量化后仿真结果 1.原始数据导出;fpga仿真文件仿真结果注意的问题

零.实现背景

因为今明工作项目需要使用到希尔伯特变换来处理问题,所以顺便就把设计流程和代码都整理下来,以便供他人使用。选用Xilinx的7系列板子,Vivado平台。

一.希尔伯特实现的基本原理

希尔伯特变换的物理意义十分简单:把信号的所有频率分量的相位推迟90度 希尔伯特变换器是频幅特性为1的全通滤波器,其正频率负90相移,其负频率正90相移

希尔伯特具体实现的方法用两种 -1. 实信号,通过fft这样可以得到精确的的解析函数结果,但是缺点就是必须是按照帧去计算的 可以看下这个链接:希尔伯特变换 序列xr的解析信号具有单边傅里叶变换。也就是说,对于负频率,变换消失了。为了近似分析信号,希尔伯特计算:具体可以看matlab的hilbert()函数 – 输入序列(一般来说为实数序列)的FFT, – 将对应于负频率的FFT系数用零替换, – 并计算结果的反FFT。 – 得到的复数实部为原始信号,虚部为相移信号

-2.实信号,通过希尔伯特滤波器去实现,缺点是得到的是近似的结果,但优点是可以连续的输入数据,而不是按照帧去计算。

希尔伯特滤波器的构造,可以看着个链接 fpga希尔伯特实现,这个是参照XILINX fir手册写的。

希尔伯特滤波器其实是幅度为1的全通滤波器,可以用FIR实现,也可以用IIR实现,但工程上大多使用FIR,对于偶次的FIR滤波器,必须在0h和Fs/2处降为0,且必须为带通滤波器

下图中:采样频率为1M ,通带我50kHz - 450kHz 在这里插入图片描述 而对于奇次的滤波器,则0hz增益为0,且必须是高通滤波器。 在这里插入图片描述

希尔伯特变换及其性质 希尔伯特滤波器制作

二.fpga实现

因为项目要求的数据帧长度很大,远远超过FPGA的fft核最大长度65536,而且板子资源也比较紧张,最后选择是使用FIR希尔伯特滤波器实现的方案。

1)matlab仿真 使用FDATOOL 工具去构造滤波器,选取阶数采用偶数 ,因为通带纹波的大小与阶数成反比,设定小于0.1db 也就是千分之5的变化。

在这里插入图片描述 但是得到滤波器系数去带入matlab程序,并不能完成我的项目任务。因为我的输入信号本身就是加在100K调制信号上的,而且十分微弱,这点增益的变化还是会带来项目的失败。又因为随着阶数的改变,在我调制信号的频率上增益的有时正有时负,项目中必须是正值才能完成任务,一点衰减都不行。 最后不断调试决定为8阶,在这里插入图片描述反而满足项目需求,这样告诉我一件事,根据理论大胆假设细致验证问题找原因才是关键。 又因为matlab是浮点数计算,fpga采样定点数做滤波器(采用浮点数滤波器延迟打拍的资源根本无法估量)所以会带来精度损失,有可能带来设计的失败,所以需要做定点仿真,看是否满足要求

定点仿真:采用杜勇老师《matlab与fpga的滤波器实现》源码改了改 %matlab定点仿真 fs=1000000; %采样频率 load('Num8.mat'); %Num8为滤波器系数 h_pm = Num; %滤波系数进行量化 h_pm12=round(h_pm/max(abs(h_pm))*(2^11-1));%12bit量化 h_pm14=round(h_pm/max(abs(h_pm))*(2^13-1));%14bit量化 hn=h_pm14; %转换进制 q14_hex_pm=dec2hex(h_pm14+2^14*(h_pm14


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有