news 2026/10/26 5:42:08

FPGA FFT缩放因子配置全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
FPGA FFT缩放因子配置全解析

目录

前言

1.快速傅里叶变换(FFT)

1.1 FFT的来源

1.2 FFT IP 缩放因子设置实例

缩放配置的底层含义:16'haaaa

每一级的计算与“减肥”过程

输入准备:24 位原始数据

Stage 1:第一次蝶形运算

Stage 2:第二次蝶形运算

Stage 3 & 4:持续压缩

Stage 5:最后一级(第 1024 个点对齐)

与MATLAB对比

缩放因子过大的后果

1.3 进阶探索:Block Floating Point (BFP) 模式

1.3.1 什么是块浮点?

1.3.2 BFP 的运行机制:逐级动态监测

1.3.3 BFP 模式的优势分析

1.3.4 工程实现要点


前言

记录一下对在vivado FFT IP核中如何设置缩放因子的理解。

1.快速傅里叶变换(FFT)

1.1 FFT的来源

传感器的信号是数字信号,所以无法进行连续时间的傅里叶变换;离散时间傅里叶变换针对长度为无穷长的信号,其得到的频谱是连续的,与实际信号的情况也不一致; 离散时间傅里叶级数针对离散的信号,频谱的结果也是离散的,最有可能由计算机实现,但其针对周期信号。 实际上,计算机采用“离散傅里叶变换(DFT)”对信号开展分析—基本原理:将采集到的信号(信号长度为看成周期为的离散时间周期信号,并计算其DTFS。

所以有离散傅里叶变换(DFT)的出现:对于长度为的信号,将其看成周期为的周期信号(这种做法是合理,结果会有误差,但不影响分析),其公式为:

正变换:

逆变换:

其物理含义为:将信号分解为一系列简单的复指数序列(,,,...,).

DFT的计算量:N个点直接计算DFT的总运算量为:次复数乘法,次复数加法。分析1024个点的序列,需要进行百万次的复乘,消耗的资源比较多。

因此有了快速傅里叶的诞生。FFT是其中一种常用的方法。它是快速实现DFT的一种算法,有效降低了计算量。

FFT简单的理解就是2分法,因为将N个点分为两组个点计算,仅需要次复数乘法,相当于减少一半,依次类推,FFT复数乘法运算量,两者对比:

具体的计算就不阐述了。从 DFT 的定义式可见,由于计算过程中缺少的归一化系数,其运算结果的幅值规模会随点数呈线性增长。在基于 FPGA 的定点化实现中,这意味着动态范围的逐级扩张:基-2 架构的 FFT 每一级蝶形运算会导致数值放大 2 倍,共需进行级运算;相应地,基-4 架构每一级会放大 4 倍,共进行级。因此,必须在 IP 核中合理配置缩放因子(Scaling Factor),以抑制各级运算中的位宽增长,防止定点数溢出导致的结果失真。

1.2 FFT IP 缩放因子设置实例

在代码中FFT IP配置是16384点 FFT、Radix-4 架构、缩放系数16'haaaa(这是因为FFT IP最大点数是65536(),Radix-4 架构最大有8级,从而IP核预留的位数)。因为设置的FFT IP核点数可配,因此可设置NFFT=1024。对于 1024点的 Radix-4 算法,计算一共分为 5级,因为。


缩放配置的底层含义:16'haaaa

config_SCALE_SCH = 16'haaaa转换成二进制是:

[10] [10] [10] [10] [10] [10] [10] [10]

在 Xilinx FFT IP 中,每 2位控制一个计算级的缩放:

  • 00: 不移位(可能溢出,但精度最高)。

  • 01: 右移 1 位(数值除以 2)。

  • 10:右移 2 位(数值除以 4)。

  • 11: 右移 3 位(数值除以 8)。


每一级的计算与“减肥”过程

输入准备:24 位原始数据
  • ADC 数据进入 FFT 模块,实部和虚部各占24位。此时,数据的动态范围是。

Stage 1:第一次蝶形运算
  • 计算:Radix-4 蝶形单元同时读取 4 个样点,乘以旋转因子并相加。

  • 位宽增长:4个数相加,理论最大值会变为原来的 4倍,即位宽增加 2位(从 24 位变成 26 位)。

  • 缩放(10):硬件执行>> 2(右移 2 位)。

  • 结果:26 位 - 2 位 = 24 位。数据大小回到了安全范围,防止溢出。

Stage 2:第二次蝶形运算
  • 计算:处理 Stage 1 输出的中间结果。

  • 位宽增长:数值再次面临潜在的 $4$ 倍增长。

  • 缩放(10):再次执行>> 2。

  • 结果:维持在24位}。

Stage 3 & 4:持续压缩
  • 过程同上。每一级都允许数值翻 4$倍,但随即被>> 2砍掉。这两级完成后,已经处理了 4^4 = 256个点之间的相关性。

Stage 5:最后一级(第 1024 个点对齐)
  • 计算:完成最后的复数加减。

  • 缩放(10):执行最后一次>> 2。

  • 最终输出:输出的data_out_Real依然是24 位。


与MATLAB对比

整个过程可以用一个公式来表达你的输出幅值与理论真值的关系:

这意味着,你为了保证在100% 满量程正弦波输入时硬件不溢出,将最终的计算结果缩小了 1024倍。

维度输入 (Input)输出 (Output)损失 (Loss)
位宽24 bit24 bit0 bit
数值精度原生精度有效信息被右移了 10 位丢失了低 10 位的细节
动态范围~144 dB~144 dB约 60 dB 被推入噪声层

这里需要区分MATLAB的FFT运算。尽管二者均涉及 1/N 的归一化处理,但 MATLAB 基于浮点运算,能够完整保留计算过程中的微弱细节;相比之下,FPGA 的定点运算在逐级缩放过程中不可避免地会引入量化损失。因此,缩放因子(Scaling Factor)的配置必须根据输入信号的动态范围进行‘动态适配’:针对满量程(Full-scale)信号,应优先采用保守的缩放策略以确保数值不溢出;而对于非满量程信号(如幅值减半),则可适当降低缩放比例(如每级仅缩小 2 倍),从而在动态范围与系统稳定性之间取得最优平衡。”举个例子:

如果信号不是占满全量程(ADC 没爆表),可以尝试“前松后紧”的策略。修改config_SCALE_SCH:

  • 建议方案:16'h5555(即01 01 01 01 01 01 01 01)

  • 效果:每一级只右移 1 位(除以 2)。这样总共只缩小了 2^5 = 32 倍。

  • 好处:能多找回5 位的精度,让 10Hz 附近的微弱扫频信号更加清晰。最后在MATLAB中处理的时候再做除以2^5即可。

缩放因子过大的后果

信号太弱:如果你观测的扫频信号本身就很微弱,经过这 5 级>> 2的连续截断,信号的能量可能直接被移成了 0。这就是为什么有时候背景看起来非常干净(全是蓝色),因为微弱的噪声和信号都被“缩放”没了。

量化噪声:每一级右移都会产生舍入误差。由于可能没有开启Convergent Rounding(收敛舍入),这些误差会累积,导致频谱的底部并不平整。

在你的“星载数字系统”笔记中,Block Floating Point (BFP,块浮点)模式可以作为解决“弱信号丢失”与“强干扰溢出”矛盾的高级方案。它在硬件开销与计算精度之间取得了一种近乎完美的平衡。

以下是为你整理的详细介绍,可直接填入你的笔记1.3 章节:


1.3 进阶探索:Block Floating Point (BFP) 模式

1.3.1 什么是块浮点?

块浮点是一种特殊的定点运算模式。如果说手动缩放(Scaled)是每一步都“切掉”固定的位数,那么块浮点就是“按需剪裁”。

在每一级蝶形运算开始前,硬件会实时扫描该块数据(Block)中的最大值,根据其量级动态决定本级是否需要右移缩放。

  • 核心公式:

    • M(Mantissa):FFT 输出的尾数(即 24-bit 数据)。

    • E(Exponent):块阶码(BLK_EXP),记录了整帧数据总共缩放的位数。

1.3.2 BFP 的运行机制:逐级动态监测

对于1024点(5 级)Radix-4 FFT:

  • 峰值检测:在 Stage 1 计算前,硬件检测输入数据的峰值。
  • 自适应缩放:

    • 若信号极弱(如空间背景噪声):硬件检测到没有溢出风险,本级执行00(不移位),保留全部 24 bit 精度。

    • 若信号极强(如强电磁干扰):硬件检测到峰值接近饱和,本级自动执行10(右移 2 位)防溢出。

  1. 阶码累加:每一级自动缩放的位数都会累加到BLK_EXP中。最终输出时,所有频点共享这一个阶码。

1.3.3 BFP 模式的优势分析

在“波动探测”任务中,BFP 模式相比16'haaaa手动缩放具有显著优势:

  • 最大化信噪比 (SNR):它能在处理微弱扫频信号时,自动找回因手动缩放丢失的低 10 位精度,动态范围提升最高可达60 dB.

  • 防止系统“致盲”:手动缩放(如16'h5555)在遇到突发强干扰时会溢出导致数据错乱;BFP 则能瞬间收缩量程,保证系统不崩溃。

  • 数学归一化:它在输出时自动完成了类似 1/N 的量级调整,且该调整是基于信号实际功率动态进行的。

1.3.4 工程实现要点

  • 接口变化:没有了缩放因子,但需要监听m_axis_data_tuser总线,从中提取BLK_EXP字段。

  • 资源权衡:BFP 需要额外的逻辑进行峰值比较,可能会增加Hold 违例的修复难度。

  • 后端还原:在 MATLAB 解析时,真实的幅值需补回阶码:

以上就是本次的笔记记录。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/26 4:15:59

快过年了 , 我就简简单单写一个总结吧 ! | 马年快乐 !

1. 项目正式上线了 书接上回 , 经过一个月的不懈努力 , 我和另一个哥们终于把这个项目 (帮学校做校园宿舍报修系统小程序) 拿下了. 但是这边宿管长这边又出了点状况: 因为这个项目是为学校做公益,没有问宿管长要一分钱. 但是服务器的钱肯定是要宿管长联系学校那边给报销一下…

作者头像 李华
网站建设 2026/10/26 4:16:05

生命的二元张力:弗洛伊德生的本能与死的本能理论解析

生命的二元张力:弗洛伊德生的本能与死的本能理论解析 在经典精神分析理论体系中,西格蒙德弗洛伊德(Sigmund Freud)晚年提出的“生的本能”(Eros)与“死的本能”(Thanatos)二元理论&…

作者头像 李华
网站建设 2026/10/26 4:16:06

tauri2应用添加系统托盘Tray

官网文档:https://v2.tauri.app/learn/system-tray/ 有两种方式可以添加系统托盘,一种是在js中,一种是在rust中,官方都有使用案例,其中要注意: 要记得在配置文件中添加这个特性。 这里我记录一下在js中添…

作者头像 李华
网站建设 2026/10/26 4:16:15

大模型的数学工厂:揭秘GPU与TPU如何重塑AI计算架构

文章探讨了为什么大语言模型需要专门的硬件而非传统CPU。LLM本质上是数学工厂,执行大规模并行矩阵乘法运算。CPU因设计用于逻辑运算和分支决策而不适合处理这种计算密集型任务。GPU通过大规模并行核心和Tensor Core优化矩阵运算,而Google的TPU采用脉动阵…

作者头像 李华
网站建设 2026/10/26 4:16:06

智能环境测试仪设计

目录智能环境测试仪的设计要点关键技术实现应用场景示例源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!智能环境测试仪的设计要点 硬件设计 采用高精度传感器模块(如温湿度传感器、PM2.5传感器、CO₂传感器等)&…

作者头像 李华
网站建设 2026/10/26 4:16:34

智能货车集装箱系统

目录智能货车集装箱系统的核心功能系统的主要技术组成数据分析与优化应用安全监控与风险预警行业应用价值体现源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!智能货车集装箱系统的核心功能 智能货车集装箱系统通过物联网、大数据和人工…

作者头像 李华