FPGA FFT缩放因子配置全解析

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)”对信号开展分析—基本原理:将采集到的信号(信号长度为

N_0

看成周期为

N_0

的离散时间周期信号,并计算其DTFS。

        所以有离散傅里叶变换(DFT)的出现:对于长度为

N_0

的信号

x[n]

,将其看成周期为

N_0(\Omega = \frac{2\pi}{N_0})

的周期信号(这种做法是合理,结果会有误差,但不影响分析),其公式为:

正变换:

F(k\Omega_0) =\sum_{k=0}^{N_0-1} x[n] e^{-j k \Omega_0 n}

逆变换:

x[n] =\frac{1}{N_0} \sum_{k=0}^{N_0-1} F(k\Omega_0) e^{j k \Omega_0 n}

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

e^{0j\Omega n}

e^{j\Omega n}

e^{j2\Omega n}

,...,

e^{j(N_0-1)\Omega n}

).

        DFT的计算量:N个点直接计算DFT的总运算量为:

N^2

次复数乘法,

N(N-1)

次复数加法。分析1024个点的序列,需要进行百万次的复乘,消耗的资源比较多。

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

        FFT简单的理解就是2分法,因为将N个点分为两组

\frac{N}2{}

个点计算,仅需要

\frac{N^2}{4} + \frac{N^2}{4} =\frac{N^2}{2}

次复数乘法,相当于减少一半,依次类推,FFT复数乘法运算量

\frac{N}{2}log_2N

,两者对比:

        具体的计算就不阐述了。从 DFT 的定义式可见,由于计算过程中缺少

$1/N$

的归一化系数,其运算结果的幅值规模会随点数

$N$

呈线性增长。在基于 FPGA 的定点化实现中,这意味着动态范围的逐级扩张:基-2 架构的 FFT 每一级蝶形运算会导致数值放大 2 倍,共需进行

$\log_2 N$

级运算;相应地,基-4 架构每一级会放大 4 倍,共进行

$\log_4 N$

级。因此,必须在 IP 核中合理配置缩放因子(Scaling Factor),以抑制各级运算中的位宽增长,防止定点数溢出导致的结果失真。

1.2 FFT IP 缩放因子设置实例

 

        在代码中FFT IP配置是16384点 FFTRadix-4 架构、缩放系数 16'haaaa(这是因为FFT IP最大点数是65536(

4^8

),Radix-4 架构最大有8级,从而IP核预留的位数。因为设置的FFT IP核点数可配,因此可设置NFFT=1024。对于 1024点的 Radix-4 算法,计算一共分为 5 级,因为

$4^5 = 1024$


缩放配置的底层含义: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 位。此时,数据的动态范围是

$2^{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对比

        整个过程可以用一个公式来表达你的输出幅值

$X_{out}$

与理论真值

$X_{true}$

的关系:

$X_{out} = \frac{X_{true}}{2^{2 \times 5}} = \frac{X_{true}}{1024}$

        这意味着,你为了保证在 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),记录了整帧数据总共缩放的位数。

核心公式

$X_{final} = M \times 2^{-E}$

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.
$DR_{gain} = 20 \times \log_{10}(2^{10}) = 20 \times 3.01 = \mathbf{60.2\text{ dB}} $
  • 防止系统“致盲”:手动缩放(如 16'h5555)在遇到突发强干扰时会溢出导致数据错乱;BFP 则能瞬间收缩量程,保证系统不崩溃。
  • 数学归一化:它在输出时自动完成了类似 1/N 的量级调整,且该调整是基于信号实际功率动态进行的。

1.3.4 工程实现要点

  • 接口变化:没有了缩放因子,但需要监听 m_axis_data_tuser 总线,从中提取 BLK_EXP 字段。
  • 资源权衡:BFP 需要额外的逻辑进行峰值比较,可能会增加 Hold 违例 的修复难度。

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

$X_{true} =\frac{ X_{parsed} \cdot 2^{BLK\_EXP}}{N}$

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

Read more

乡村政务办公系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

乡村政务办公系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

摘要 随着信息技术的快速发展,数字化政务管理成为提升乡村治理效率的重要手段。传统的乡村政务办公模式依赖纸质文档和人工操作,存在效率低、信息传递滞后、数据易丢失等问题。乡村政务信息管理系统的建设能够有效解决这些问题,实现政务信息的数字化、规范化和高效化管理。该系统通过整合SpringBoot后端、Vue前端和MySQL数据库技术,构建了一个功能完善、操作便捷的乡村政务办公平台。关键词:乡村政务、数字化管理、SpringBoot、Vue、MySQL。 该系统采用SpringBoot作为后端框架,提供高效的接口服务和数据处理能力;Vue作为前端框架,实现用户友好的交互界面;MySQL作为数据库,确保数据的稳定存储和高效查询。系统功能涵盖村民信息管理、帮扶信息管理、新闻公告发布等模块,支持数据的增删改查、多条件筛选和统计分析。系统设计注重实用性和可扩展性,能够满足乡村政务办公的多样化需求。关键词:村民信息管理、帮扶信息管理、新闻公告、数据统计分析。 数据表设计 村民信息数据表 村民信息数据表用于存储村民的基本信息,包括姓名、身份证号、联系方式等。创建时间通过函数自动获取,村民ID是该

【开题答辩全过程】以 基于web的学校田径运动会管理系统开发与实现为例,包含答辩的问题和答案

【开题答辩全过程】以 基于web的学校田径运动会管理系统开发与实现为例,包含答辩的问题和答案

个人简介 一名14年经验的资深毕设内行人,语言擅长Java、php、微信小程序、Python、Golang、安卓Android等 开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。 感谢大家的关注与支持! "各位老师好,我是xx同学,我的毕业设计题目是《基于web的学校田径运动会管理系统开发与实现》。本系统旨在解决传统运动会管理中人工操作繁琐、容易出错的问题,通过信息化手段提高运动会组织效率。系统主要分为前端学生模块和后端管理员模块两大板块:前端包含注册登录、首页展示、比赛项目浏览、排行榜查看、比赛咨询和个人中心等功能;后端包含登录、个人中心、学生管理、比赛项目管理、项目报名管理、排行榜管理、比赛咨询管理和项目类型管理等功能。技术栈方面,后端采用SpringBoot框架,前端使用Vue框架,数据库选用MySQL,采用B/S架构设计,具有跨平台、易维护的特点。下面请各位老师批评指正。

Clawdbot镜像免配置部署Qwen3-32B:Web网关直连方案快速上手指南

Clawdbot镜像免配置部署Qwen3-32B:Web网关直连方案快速上手指南 1. 为什么你需要这个方案 你是不是也遇到过这样的情况:想试试最新发布的Qwen3-32B大模型,但一打开部署文档就看到密密麻麻的环境依赖、CUDA版本校验、模型分片加载、API服务配置……光是看就头大?更别说还要自己搭Web界面、处理跨域、调试端口转发了。 Clawdbot镜像就是为解决这个问题而生的。它不是另一个需要你从零编译、反复调试的项目,而是一个“开箱即用”的完整推理平台——把Qwen3-32B直接封装进预置镜像里,连Ollama服务、模型加载、Web网关、前端交互全给你配好了。你只需要启动它,打开浏览器,就能和320亿参数的大模型对话。 这不是概念演示,也不是简化版demo。它背后跑的是原生Qwen3-32B权重,通过Ollama标准API接入,再经由Clawdbot内置代理将8080端口无缝映射到18789网关,全程无需修改配置文件、无需安装额外组件、无需理解反向代理原理。对开发者来说,省下的是两小时部署时间;对业务方来说,换来的是当天就能试跑真实场景的响应速度。 下面我们就从零

小白前端速成:用HTML+CSS搞定超炫流动背景特效(附实战代码)

小白前端速成:用HTML+CSS搞定超炫流动背景特效(附实战代码)

小白前端速成:用HTML+CSS搞定超炫流动背景特效(附实战代码) * 小白前端速成:用HTML+CSS搞定超炫流动背景特效(附实战代码) * 先别急着敲代码,结构整明白了吗? * 所以这"流动"到底是啥黑科技? * 拆解魔法代码:从死图到会呼吸 * 第一步:先调颜料盘 * 第二步:放大画布,准备偷天换日 * 第三步:写动画关键帧,这是心跳 * 醒醒,这玩意儿在真机上可能卡成PPT * 开启GPU加速,骗浏览器用显卡 * 移动端 detection,该怂就怂 * 老浏览器 Fallback * 实战!这三个场景用流动背景简直绝配 * 场景一:登录页,让输入框不那么枯燥 * 场景二:404页面,缓解用户焦虑 * 场景三:数据看板的"活"背景 * 救命!我的背景怎么跟抽风似的?