更新了March 27,2024
在本应用笔记中,我们利用 Moku Cloud Compile 和多仪器模式来解释如何开发通用的移动平均滤波器。我们使用 示波器 和 频率响应分析仪 检查这个基本的有限脉冲响应 (FIR) 滤波器。然后我们使用以下方法开发、部署和检查五点中值滤波器: Moku 设备。以这种方式组合线性和非线性滤波器可以有效地抑制许多控制或传感应用中的瞬态并降低噪声。
自定义仪器
自定义仪器 (MCC) 是 Liquid Instruments 的一项服务,可让您快速编译自定义硬件描述语言 (HDL) 代码并将其部署到 Moku 设备。MCC 将 Moku 中的 FPGA 开放给自定义代码,并允许用户开发特定的功能和特性。我们提供一系列示例和支持,以帮助您部署自定义功能。移动平均滤波器
移动平均滤波器非常简单,是对多个 (n) 个连续信号样本进行平均。方程为:
其中 x(t) 是离散时间序列输入信号,y(t) 是输出信号。 例如,当 n = 4 时:
这个简单的滤波器在降低信号噪声方面具有非常有用的应用。对于不相关的随机(白)噪声,此移动平均函数最适合抑制噪声并保留尖锐的阶跃响应,但阻带性能较差。在硬件中实现这一点仅需要加法器和一次除法,因此在硬件资源有限的情况下非常有用。在硬件中除以任意数字在 FPGA 中并不简单。通常,该滤波器是通过确保 n 是 2 的幂(即 n = 2^N)来实现的,从而将除法减少为右移 N 个二进制位。
图 1:二进制位移
图 2:实现移动平均的一系列加法器
因此,更一般地如图 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 代码很容易。 要开始,请访问 compile.liquidinstruments.com上传代码,然后选择构建。Liquid Instruments 服务器将生成一个文件或比特流,其中定义了 FPGA 上实现代码所需的硬件配置。对于 Moku:Go 和 Moku:Lab,编译大约需要 5 分钟;对于 Moku:Pro,由于 FPGA 尺寸更大,编译时间接近 20 分钟。我们提供了详细的编译和部署指南。 开始.测试 MCC 移动平均滤波器
为了测试这个移动平均滤波器,我们使用 Moku:Go 的多仪器模式 (MiM),如图 5 所示。在该模式下,我们可以部署两台仪器,采样率为 31.25 MHz。我们也可以在 Moku:Pro 上测试这个滤波器,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。该滤波器正常运行,符合我们的预期。
图 7:平均输入噪声
频率响应
我们可以使用 Moku 频率响应分析仪 (FRA) 仪器轻松确定移动平均值的频率响应。 FRA 在其输出上驱动扫频正弦波,并测量其输入上产生的幅度和相位。图 8 显示了测试设置:
图 8:频率响应分析仪 MiM 配置
图 9 显示了 MCC 滤波器的最终频率响应。 将其与图 10(理想移动平均滤波器的 MATLAB 图)进行比较,我们发现移动平均滤波器没有提供特别好的阻带衰减。
图 9:移动平均滤波器的频率响应
图 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:去除尖峰噪声的中值
我们在 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 中值滤波器测试系统
图 17:任意波形发生器,带脉冲的方波
图 18:Moku:Pro 中值滤波操作



