应用笔记

通过自定义实时数字滤波减少噪声和瞬变

Moku 云编译实现

更新了March 27,2024

在本应用笔记中,我们利用 Moku 云编译和多仪器模式来解释如何开发通用移动平均滤波器。我们使用示波器和频率响应分析仪来检查这个基本的有限脉冲响应 (FIR) 滤波器。然后我们使用以下方法开发、部署和检查五点中值滤波器 Moku:Pro, Moku:LabMoku:Go 设备。以这种方式组合线性和非线性滤波器可以有效地抑制许多控制或传感应用中的瞬态并降低噪声。

Moku 云编译

Moku Cloud Compile (MCC) 是 Liquid Instruments 的一项服务,可让您快速编译自定义硬件描述语言 (HDL) 代码并将其部署到 Moku 设备。 MCC 将 Moku 内的 FPGA 开放给自定义代码,并允许用户开发特定的功能和特性。我们提供一系列示例和支持来帮助您部署自定义功能。

 

移动平均滤波器

移动平均滤波器非常简单,是对多个 (n) 个连续信号样本进行平均。方程为:

其中 x(t) 是离散时间序列输入信号,y(t) 是输出信号。 例如,当 n = 4 时:

这个简单的滤波器在降低信号噪声方面具有非常有用的应用。对于不相关的随机(白)噪声,此移动平均函数最适合抑制噪声并保留尖锐的阶跃响应,但阻带性能较差。在硬件中实现这一点仅需要加法器和一次除法,因此在硬件资源有限的情况下非常有用。在硬件中除以任意数字在 FPGA 中并不简单。通常,该滤波器是通过确保 n 是 2 的幂(即 n = 2^N)来实现的,从而将除法减少为右移 N 个二进制位。

图 1:二进制位移

直接的硬件实现如图 2 所示。

图 2:实现移动平均的一系列加法器

此实现需要 2^N-1 个加法器,并且硬件成本昂贵。深系列加法器还可能需要时钟寄存器来满足合理的时序性能。我们可以通过以下方式改进这一点:

因此,更一般地如图 3 所示:

图 3:累加器实现

这表明每个输出都取决于先前的输出和当前的输入。 我们现在已将移动平均函数简化为一个累加器、一个减法函数和一个 n 级移位寄存器,然后是 2^N 除法的按位右移(图 3)。 当 N > 4 时,这种硬件节省变得很重要,限制因素是 2^N 级移位寄存器。 此外,不需要其他时钟元件来满足时序限制。

 

VHDL实现

图 4 显示了 VHDL 实现的核心。 这个过滤器的核心非常简单,只有 12 行代码。 p_moving_average 是最后 N 个样本的时间历史,其中第 8 行在最新输入之前添加并丢弃最旧输入。 在第 9 行,累加器 r_acc 添加新输入,而第 10 行生成输出所需的位移位(除法器)。

图 4:移动平均 VHDL 代码

编译部署

编译和综合此 VHDL 代码很容易。 要开始,请访问 编译.liquidinstruments.com,上传代码,然后选择构建。 Liquid Instruments 服务器将生成一个文件或比特流,定义 FPGA 上实现代码所需的硬件配置。 对于Moku:Go和Moku:Lab,编译大约需要5分钟; 对于 Moku:Pro,由于 FPGA 的尺寸更大,该时间接近 20 分钟。

提供了指导您完成编译和部署的详细说明 点击此处.

 

测试 MCC 移动平均滤波器

为了测试此移动平均滤波器,我们对 Moku:Go 使用多仪器模式 (MiM),如图 5 所示。在此模式下,我们可以部署两台采样率为 31.25 MHz 的仪器。 我们还可以在 Moku:Pro 上测试此滤波器,它允许在 MiM 中同时使用四个仪器和 312.5 MHz 的输入采样率。

 

插槽 1 包含我们的 Moku Cloud Compile 移动平均滤波器,而插槽 2 包含示波器仪器。我们使用示波器观察从模数 (ADC) 输入 1 馈送的已滤波和未滤波信号。示波器还具有一个集成波形发生器,用于生成测试信号。在本例中,我们使用示波器的内置波形发生器生成 2 kHz 的方波,并将其驱动至输出 1。我们在外部将信号衰减 60 dB,使其接近 Moku:Go 的本底噪声。然后我们将该信号路由回输入 1。

 

 

图 5:多仪器模式下的滤波器测试设置

在图 6 中,我们可以在蓝色轨迹中看到衰减后的噪声方波。 红色轨迹显示移动平均器的输出具有明显更干净的方波。 这是一种有用的降噪技术,使用 MCC 和 MiM 的一个插槽即可启用。

图 6:使用 MCC 移动平均滤波器进行降噪

因此,这种最简单的滤波器对于降低噪声很有用。它的计算量也非常小,只需要累加器、减法器和按位移位。这意味着它可以在 Moku:Pro 上以 312.5 MSa/s 的速度运行,在 Moku:Go 上以 31.25 MSa/s 的速度运行。

将注意力转向噪声功率,我们知道该平均滤波器将噪声功率降低了 2 倍N;噪声幅度降低√2N。我们的实现使用 N=8,因此噪声幅度应降低至原始值的 6.25% (1/16)。

图 7 显示了 Moku:Go 输入噪声(蓝色迹线)和移动平均信号(红色迹线),振幅分别为 161.2 mV 和 9.162 mV。 由此,我们可以看出,滤波器后的噪声幅度接近原始噪声的预期因子 1/16,即 9.162 / 161.2 mV = 0.057。 该过滤器正在运行并符合我们的期望。

MCC- 输入噪声被平均

图 7:平均输入噪声

频率响应

我们可以使用 Moku 频率响应分析仪 (FRA) 仪器轻松确定移动平均值的频率响应。 FRA 在其输出上驱动扫频正弦波,并测量其输入上产生的幅度和相位。图 8 显示了测试设置:

图 8:频率响应分析仪 MiM 配置

图 9 显示了 MCC 滤波器的最终频率响应。 将其与图 10(理想移动平均滤波器的 MATLAB 图)进行比较,我们发现移动平均滤波器没有提供特别好的阻带衰减。

移动平均滤波器的频率响应

图 9:移动平均滤波器的频率响应

                                                                                       理想移动平均滤波器的 MATLAB 图

图 10:理想移动平均滤波器的 MATLAB 图

中值滤波器

中值滤波器是确定小移动窗口的中值的非线性滤波器。 输入样本通过窗口,输出是样本在任何给定时间的中值。 移动平均滤波器适用于滤除均匀分布的随机噪声,而中值滤波器适用于滤除非常短的尖峰或脉冲噪声。 虽然它经常部署在图像处理中,但它在更一般的信号处理中也很有用。

通常,为窗口长度选择奇数个样本:3、5 或 7 个点。 这意味着输出只是值排序窗口的中间样本。

 

VHDL实现

图 11 显示了 VHDL 中五点中值函数的实现。 在时钟信号的每个上升沿,图 11 中的函数将五个输入样本从低值到高值排序。 这种排序发生在第 12 行到第 20 行的两个嵌套“for”循环中。因此,中位数是排序窗口中的第三个样本; 这被分配给第 22 行的输出。

图 11:中值滤波器 VHDL 代码

我们可以使用示波器和Moku云编译槽以及示波器的波形生成器以与移动平均滤波器相同的方式分析中值滤波器的时域性能。

图 12 显示噪声峰值显着降低,未过滤噪声的峰峰值测量值在滤波后从 3.66 mV 降低至 305 μV。 这是 1/12 的减少,不如移动平均滤波器 (1/16) 有效。

图 12:中值滤波器时域性能

由于中值滤波器的一个关键功能是消除脉冲噪声,因此我们还使用带有附加脉冲的方波来检查其性能。图 13 显示了具有前沿尖峰和低电平中途尖峰的方波(蓝色通道 B);滤波后的信号显示中值滤波器去除尖峰但保留尖锐的前缘和后缘(红色通道 A)后的方波。

去除尖峰噪声的中值

图 13:去除尖峰噪声的中值

我们在 Moku:Go 上编译并测试了这个中值滤波器,它的 MCC 时钟速率为 31.25 MHz。 但是,在为 Moku:Pro 测试此示例时,由于时钟速率增加到 312.5 MHz,我们需要调整我们的实现。 图 11 中的实现使用带变量的嵌套 for 循环。 这合成了一个大而深的组合逻辑网络,其传播延迟(图 14)超过了 Moku:Pro 时钟速率的 3.2 ns 周期。 为了满足时序要求,时钟元件之间逻辑的传播延迟必须小于时钟周期。

通过逻辑的传播延迟

图 14:通过逻辑的传播延迟

我们需要将大型逻辑块分成由寄存器或时钟元件分隔的段。 在 VHDL 中,我们通过使用信号而不是变量来实现这一点。 在这种情况下,我们将逻辑分为五个阶段以便于编码。 这意味着大约有五个时钟周期的输入到输出延迟,这适合我们的应用程序。

图 15 显示了这个五阶段流水线中值算法的一个阶段。 在可供下载的项目文件中找到完整的 VHDL 点击此处.

图 15:一级流水线中值滤波器

Moku:Pro 中值滤波测试

我们在 MiM 中使用 Moku:Pro 和任意波形发生器 (AWG) 来创建带有噪声尖峰的方波。然后,我们将 AWG 的输出连接到 MCC 中值滤波器,并使用示波器观察效果。

此 MiM 设置如图 16 所示。我们配置了 AWG,如图 17 所示。它的输出将模拟信号驱动到 Moku:Pro 的输出 3,而该信号又通过同轴电缆环接到输入 3。我们部署了Moku Cloud Compile slot 中的中值滤波器并使用示波器观察性能。

图 16:Moku:Pro 中值滤波器测试系统

最后,我们观察中值滤波器的性能,如图 18 所示。中值滤波器去除了脉冲,同时保留了方波的尖锐边缘。 由分阶段的时钟流水线的插入引起的处理延迟导致大约 44 ns 的延迟。

任意波形发生器,带脉冲的方波

图 17:任意波形发生器,带脉冲的方波

 

Moku:Pro 中值滤波操作

图 18:Moku:Pro 中值滤波操作

总结

在本应用笔记中,我们讨论了移动平均滤波器和中值滤波器的实现。为了实现这些,我们利用 Moku Cloud Compile 来构建过滤器并将其部署到 Moku:Go 设备。然后我们修改了设计以确保与增加的 Moku:Pro 时钟速率兼容。为了验证 MCC 滤波器行为,我们使用多仪器模式连接完全可定制的滤波器、示波器和任意波形发生器。这种实现方式可以有效降低噪声,同时保留数字信号处理应用中的信号边缘。

代码下载

应用笔记的代码可供下载 点击此处.

Moku:演示模式

您可以在我们的网站上下载适用于 macOS 和 Windows 的 Moku:应用程序 官网。演示模式无需任何硬件即可运行,并介绍如何使用 Moku:Go、Moku:Lab 或 Moku:Pro。 Moku:应用程序也可用于 iPadOS 端应用程序 在苹果应用商店。

有问题或想要打印版本?

如果您对此类培训课程感兴趣,想了解更多信息,请您联系 support@liquidinstruments.com.

参考文献

[1] www.mathworks.com/help/dsp/ug/how-is-moving-average-filter- Different-from-an-fir-filter.html