前言上一篇介绍了短时傅里叶变换 STFT。STFT 的思路是固定长度窗口 → 截取一段信号 → 加窗 → FFT → 窗口向后移动小波变换也用于分析信号的局部变化但它使用的不是固定长度窗口而是不同尺度的小波函数。小波变换特别适合分析突然出现的脉冲。边沿和跳变。短时间高频干扰。长时间低频趋势。振动、故障和冲击信号。对 FPGA 工程师来说小波变换的重点不是先记住复杂公式而是理解小波为什么要改变尺度。小波系数代表什么。小波和 STFT 的适用场景有什么不同。小波怎样实现成滤波器组。FPGA 中缓存、下采样和边界如何处理。1. 先用“放大镜”理解小波可以把小波理解成一个可以改变大小的局部波形。当小波较窄时它能观察信号中的快速变化例如尖峰 毛刺 边沿 短时高频干扰当小波变宽时它能观察较慢的变化例如趋势 低频振荡 缓慢变化的信号flowchart LR A[原始信号] -- B[窄小波] A -- C[中等尺度小波] A -- D[宽小波] B -- E[观察快速变化] C -- F[观察中等变化] D -- G[观察慢速变化]这就是小波分析和 STFT 的重要区别STFT窗口长度固定只在时间轴上移动 小波窗口宽度也会改变同时分析时间和尺度2. 小波和 STFT 的直观对比2.1 STFT 使用固定窗口假设 STFT 使用 256 点窗口。无论分析低频还是高频都使用同样长度的窗口第 0 帧256 点 第 1 帧256 点 第 2 帧256 点窗口长度不变只是位置向后移动。flowchart LR A[信号] -- B[固定窗口 256 点] B -- C[FFT] C -- D[频谱] B -- E[向后移动] E -- B2.2 小波使用不同尺度小波在高频处使用较窄的分析范围在低频处使用较宽的分析范围。高频分析窗口窄时间定位更准确 低频分析窗口宽频率定位更准确可以用下面的图理解xychart-beta title STFT 与小波的分析窗口 x-axis 时间 [0, 1, 2, 3, 4, 5, 6, 7] y-axis 分析范围 0 -- 4 line [2, 2, 2, 2, 2, 2, 2, 2] line [1, 1, 2, 2, 3, 3, 4, 4]上面第一条线可以理解为 STFT 的固定分析范围第二条线表示小波在不同尺度下的分析范围。3. 小波到底分析什么小波分析的结果通常不是“频率点”而是“小波系数”。小波系数表示当前时间附近的信号 与某个尺度的小波形状有多相似如果某个位置的小波系数很大说明信号在这个位置附近包含与该尺度小波相似的变化。小波系数通常包含两个维度维度含义时间位置信号在哪个位置出现特征尺度特征变化的快慢严格来说小波中的“尺度”不完全等于频率但尺度越小通常对应越高的频率尺度越大通常对应越低的频率。4. 连续小波变换和离散小波变换小波变换通常分为两大类。4.1 连续小波变换 CWT连续小波变换会在很多时间位置和尺度上计算系数。概念上可以理解为选择一个尺度 → 将小波放大或缩小 → 沿时间轴移动 → 计算每个位置的相似程度 → 换一个尺度 → 重复以上过程flowchart TB A[原始信号] -- B[选择尺度] B -- C[改变小波宽度] C -- D[沿时间轴移动] D -- E[计算小波系数] E -- F[更换尺度] F -- BCWT 适合观察连续的时频变化但计算量和数据量都比较大。4.2 离散小波变换 DWT离散小波变换只选择若干个离散尺度通常通过滤波器组实现。每一级都会经过低通滤波 高通滤波 下采样得到两类结果近似系数保留较低频率成分。细节系数保留较高频率成分。flowchart TB A[输入信号] -- B[低通滤波器] A -- C[高通滤波器] B -- D[下采样] C -- E[下采样] D -- F[近似系数 A1] E -- G[细节系数 D1] F -- H[继续分解] H -- I[近似系数 A2] H -- J[细节系数 D2]在 FPGA 中DWT 通常比 CWT 更容易实现因此工程中更常使用 DWT 或小波包分解。5. DWT 的基本结构假设输入信号为x[n]经过低通滤波器h[n]和高通滤波器g[n]低频分量 x[n] 与 h[n] 卷积 高频分量 x[n] 与 g[n] 卷积然后对两路结果分别进行 2 倍下采样。近似系数 A1 低通结果每隔一个点取一个 细节系数 D1 高通结果每隔一个点取一个flowchart LR A[输入 x[n]] -- B[低通滤波器 h[n]] A -- C[高通滤波器 g[n]] B -- D[2 倍下采样] C -- E[2 倍下采样] D -- F[A1近似系数] E -- G[D1细节系数]5.1 为什么要下采样经过低通滤波后信号主要保留低频成分经过高通滤波后信号主要保留高频成分。每一路的有效带宽大约变成原来的一半因此可以每隔一个采样点保留一个数据。这样做有两个好处减少数据量。降低后续处理量。第一层分解输入长度 N A1 长度约为 N / 2 D1 长度约为 N / 2第二层只继续分解 A1A1 → A2 D2因此A2 长度约为 N / 4 D2 长度约为 N / 4 D1 长度约为 N / 26. 多级小波分解小波分解通常只继续分解低频近似系数。flowchart TB A[原始信号] -- B[第 1 级分解] B -- C[A1 低频] B -- D[D1 高频] C -- E[第 2 级分解] E -- F[A2 低频] E -- G[D2 高频] F -- H[第 3 级分解] H -- I[A3 低频] H -- J[D3 高频]最终得到A3最低频近似分量 D3较低频细节分量 D2中等频率细节分量 D1最高频率细节分量对于一个采样率为fs的信号可以粗略理解为系数主要频率范围D1fs / 4 到 fs / 2D2fs / 8 到 fs / 4D3fs / 16 到 fs / 8A30 到 fs / 16实际边界会受到滤波器响应和边界处理方式影响这里只是帮助理解的近似范围。7. 小波和 STFT 的区别对比项目STFTDWT基本方法固定窗口加 FFT多级滤波器组分析窗口长度固定尺度随频率变化输出结果时间-频率矩阵近似系数和细节系数高频时间定位取决于固定窗口通常更灵活低频分析受固定窗口限制使用更宽尺度FPGA 实现FFT、缓存、加窗FIR、下采样、缓存主要优点频率概念直观对突变和多尺度特征敏感主要缺点固定时间频率折中系数含义需要结合尺度理解可以简单记忆STFT用一把固定大小的尺子观察信号 小波用不同大小的尺子观察信号8. 什么情况下优先考虑小波8.1 突发信号例如机械冲击 轴承故障 齿轮啮合异常 电力系统暂态 通信中的脉冲干扰这些信号的变化通常很快短时间内会出现明显尖峰。小波的高频细节系数通常会对这些突变比较敏感。8.2 信号中同时存在快变化和慢变化例如缓慢变化的基线 叠加短时间冲击STFT 使用固定窗口时很难同时兼顾两者。小波可以使用不同尺度分别观察慢变化和快变化。8.3 压缩和去噪小波分解后很多信号的有效信息集中在少量系数中。可以进行阈值处理系数绝对值较小 → 认为主要是噪声 系数绝对值较大 → 保留基本流程flowchart LR A[输入信号] -- B[小波分解] B -- C[系数阈值处理] C -- D[小波重构] D -- E[去噪信号]9. FPGA 中如何实现 DWTDWT 的核心通常是 FIR 滤波器和 2 倍下采样。flowchart LR A[输入采样流] -- B[移位寄存器] B -- C[低通 FIR] B -- D[高通 FIR] C -- E[偶数点输出] D -- F[偶数点输出] E -- G[A1] F -- H[D1]9.1 移位寄存器假设滤波器长度为 4当前输入为x[n]x[n-3], x[n-2], x[n-1], x[n]每个时钟到来一个新采样点移位寄存器更新一次。9.2 FIR 乘加低通输出low h0 × x[n] h1 × x[n-1] h2 × x[n-2] h3 × x[n-3]高通输出high g0 × x[n] g1 × x[n-1] g2 × x[n-2] g3 × x[n-3]9.3 下采样如果每个时钟都计算一个滤波结果可以每隔一个结果输出一次第 0 个结果保留 第 1 个结果丢弃 第 2 个结果保留 第 3 个结果丢弃也可以从结构上减少不必要的计算但必须确认滤波器和控制时序保持正确。10. FPGA 小波模块的推荐结构flowchart TB A[输入接口] -- B[输入 FIFO] B -- C[移位寄存器] C -- D[低通 FIR] C -- E[高通 FIR] D -- F[低通下采样] E -- G[高通下采样] F -- H[A1 缓存] G -- I[D1 输出] H -- J[下一层 DWT]如果实现 3 级分解flowchart TB A[输入信号] -- B[Level 1 DWT] B -- C[A1] B -- D[D1] C -- E[Level 2 DWT] E -- F[A2] E -- G[D2] F -- H[Level 3 DWT] H -- I[A3] H -- J[D3]重点是只有低频近似系数 A1 继续进入下一层 D1 直接保存或输出11. 小波系数和数据长度假设输入长度为N 1024 点一级分解后A1 约为 512 点 D1 约为 512 点二级分解A2 约为 256 点 D2 约为 256 点三级分解A3 约为 128 点 D3 约为 128 点最终保存A3128 点 D3128 点 D2256 点 D1512 点总数为128 128 256 512 1024 点这说明离散小波变换在合适的边界处理和滤波器设计下可以实现数据的分解与重构。12. 边界处理是新人容易忽略的问题滤波器在信号开头和结尾处会遇到一个问题x[n-1]、x[n-2] 还不存在例如刚输入第一个采样点时滤波器需要访问它前面的数据但这些数据并不存在。常见处理方式包括边界方式做法补零缺少的数据补 0对称延拓使用边界附近数据镜像周期延拓将信号首尾连接重复边界重复第一个或最后一个采样点丢弃边界只保留中间有效结果不同方式会影响边缘位置的小波系数。软件模型和 FPGA 如果使用了不同的边界规则即使滤波器系数完全相同结果也可能不同。工程中必须明确输入开始时如何补数据 输入结束时如何处理 每一级分解是否使用相同规则13. 定点实现注意事项13.1 小波系数需要量化假设低通滤波器系数为0.125, 0.375, 0.375, 0.125采用 16 位、保留 15 位小数的格式0.125 × 32768 4096 0.375 × 32768 12288因此存储系数可以是4096, 12288, 12288, 4096硬件乘加后需要根据小数位右移。13.2 累加器位宽要足够滤波器输出是多个乘法结果相加y c0 × x0 c1 × x1 c2 × x2 c3 × x3累加器位宽至少要考虑输入数据位宽 系数位宽 乘加带来的增长不能只按照输入数据位宽保存累加结果否则容易溢出。13.3 下采样位置必须固定下采样可以从第 0 个滤波结果开始也可以从第 1 个滤波结果开始。两种选择会导致系数时间位置不同。重构对齐方式不同。软件和硬件结果无法逐点匹配。因此需要在设计文档中固定第几个滤波输出作为第一个小波系数14. 小波重构的基本思路如果需要恢复原始信号需要执行逆小波变换。逆变换通常包括对近似系数和细节系数上采样。分别通过重构低通和高通滤波器。将两路结果相加。flowchart TB A[近似系数 A1] -- B[上采样] B -- C[重构低通滤波器] D[细节系数 D1] -- E[上采样] E -- F[重构高通滤波器] C -- G[相加] F -- G G -- H[重构信号]分析滤波器和重构滤波器不能随意组合。如果目标是无损重构需要选择满足相应条件的小波滤波器组并统一系数顺序。下采样和上采样位置。边界处理。缩放方式。舍入方式。15. 用小波做去噪最常见的小波去噪流程如下输入信号 → 多级小波分解 → 对细节系数做阈值处理 → 小波重构 → 输出去噪信号一种简单的硬阈值处理方式如果 abs(coef) threshold coef 0 否则 保留 coef伪代码def hard_threshold(coef, threshold): result coef.copy() result[np.abs(result) threshold] 0 return resultFPGA 中可以使用比较器和选择器实现flowchart LR A[小波系数] -- B[取绝对值] B -- C[与阈值比较] C -- D{是否小于阈值} D --|是| E[输出 0] D --|否| F[保留原系数]需要注意阈值并不是越大越好。阈值太小噪声保留较多阈值太大有效信号也会被削弱。16. STFT 和小波如何选择可以按下面的思路选择需求更适合的方法想观察固定频率随时间变化STFT信号频率成分比较稳定STFT关注突然出现的冲击小波同时观察慢趋势和快变化小波需要直观频率坐标STFT需要多尺度去噪或压缩小波已经有成熟 FFT IPSTFT 更容易快速实现更适合 FIR 和流水线结构DWT 更容易映射简单记忆STFT 关注“什么时候出现什么频率” 小波关注“什么时候出现什么尺度的变化”17. 调试小波 FPGA 设计的顺序建议使用下面的输入进行验证测试输入主要检查内容全零信号输出是否全部为零固定直流低频近似系数是否正确单频正弦波各级系数分布是否合理单个脉冲高频细节系数是否明显阶跃信号边沿位置是否正确随机数据软件模型和硬件逐点比较重构测试分解后重构是否接近原信号推荐的比较顺序flowchart LR A[原始输入] -- B[低通 FIR] A -- C[高通 FIR] B -- D[低通下采样] C -- E[高通下采样] D -- F[A1] E -- G[D1] F -- H[多级分解或重构] G -- H不要只比较最后的去噪结果。应该先比较FIR 滤波器输出。下采样位置。A1 和 D1 系数。多级分解结果。最终重构结果。这样才能知道错误是来自滤波器、控制时序、边界处理还是定点缩放。18. 写 RTL 前先固定参数项目示例设置采样率8000 Hz小波类型需要明确具体滤波器分解级数3 级低通滤波器长度4 或 8 点高通滤波器长度4 或 8 点下采样方式每 2 点保留 1 点边界处理补零或对称延拓输入位宽例如 16 位系数位宽例如 16 位累加器位宽根据最大乘加结果计算舍入方式截断或四舍五入溢出处理饱和或回绕输出格式A3、D3、D2、D1小波类型不能只写“使用小波”。必须明确使用 Haar 小波 使用 Daubechies 小波 使用 Symlet 小波 使用自定义 FIR 滤波器组不同小波的滤波器系数、延迟、边界处理和重构方式都可能不同。19. 总结小波变换可以理解为使用不同大小的局部波形 观察信号在不同时间和不同尺度上的变化。与 STFT 相比STFT 使用固定窗口加 FFT DWT 使用多级滤波器组和下采样对于 FPGA 实现需要重点关注低通和高通滤波器系数。FIR 乘加结构。下采样时机。多级分解中的缓存。边界处理。定点位宽和累加器溢出。软件模型与硬件模型的一致性。小波分解与重构的系数顺序。如果目标是观察稳定频率随时间的变化STFT 更直观。如果目标是检测冲击、边沿、突发干扰或进行多尺度去噪小波通常更合适。小波不是“比 FFT 更高级的 FFT”而是另一种组织信号分析的方法。理解滤波器、下采样和尺度之后就能把小波算法拆成 FPGA 可以实现的 FIR、缓存和控制逻辑。参考资料Mallat, A Wavelet Tour of Signal ProcessingPyWavelets DocumentationSciPy Signal Processing DocumentationAMD FIR Compiler Documentation