了解嵌入式微控制器的数字滤波
了解在时域中过滤和处理数据样本的广泛使用的方法,同时仔细查看 PowerQuad 单元的 Dual Biquad IIR 引擎在 LPC55S69 MCU 中。
在处理随时间或在时域中收集的数据样本时,最基本的操作之一是“过滤”数据。重要的是要了解可以对数据进行数字过滤以获得最佳结果并释放 CPU 以执行其他任务的常用方法,尤其是在涉及嵌入式微控制器时。
在本文中,了解在时域中过滤和处理数据样本的广泛使用的方法。此外,请仔细查看 LPC55S69 MCU 中 PowerQuad 单元的 Dual Biquad IIR 引擎 — 一种可用于许多过滤用例的多功能 DSP 构建块。
连续采样数据的常用过滤器
在时域中采样数据时,会以已知的固定速率连续收集数据。时域滤波器接受此数据作为输入并输出以某种方式修改的新信号。滤波器的输出只是另一个时域信号,可以进一步处理或传输到数模转换器 (DAC)。
我们通常根据滤波器对正弦波的响应来处理滤波器。如果我们将输入信号视为简单的正弦波,则滤波器可以调整输入的幅度并调整其相位。将复数信号应用于滤波器时,它将调整信号正弦分量的幅度和相位。滤波器在一定频率范围内的表现称为频率响应。
时域中的标准操作由所谓的有限脉冲响应 (FIR) 滤波器执行,该滤波器将最近的数据样本与先前收集的元素混合以获得下一个输出样本。
图 1。 使用输入的历史记录逐个采样过滤处理。
实现这种过滤器的一种方法是将先前的样本存储在一个数组中,并使用一个简单的等式将它们组合起来:
x[n] // 最近的输入
x[n-1], x[n-2] // 前两个输入样本
y[n] // 下一个输出样本
y[n] =b0 * x[n] + b1 * x[n-1] + b2 * x[n-2]
这个特殊的伪代码片段结合了最近的样本和前两个数据样本。它将每个数据样本与单独的常数系数相乘,然后对结果求和以获得下一个输出样本。总之,这代表了一个简单的乘法和累加运算,其中常数系数和历史的长度控制了滤波器的频率响应。
通过为系数选择合适的值,可以构建各种类型的滤波器。如果滤波器衰减高频,则它充当低通滤波器。通过衰减低频,产生的滤波器将起到高通滤波器的作用。也可以将这两种方法结合起来,形成带通滤波器。
FIR 滤波器在概念上很简单,但可能需要相当多的先前数据样本才能实现对其频率响应的精确控制。虽然这个过滤器很容易理解和实现,但在传统的 CPU 上执行它可能很麻烦,尤其是对于中等大小的历史记录。这是因为每个样本都需要许多乘法和加法运算来确定输出。
减少所需历史量的一种方法是在计算下一个输出样本时使用先前确定的过滤器输出。这是另一类称为无限脉冲响应滤波器 (IIR) 的数字滤波器的根源:
// 这个例子使用之前建立的命名约定
y[n] =b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y [n-1] + a1 * y[n-2]
上面的示例是称为双二阶滤波器的 IIR 滤波器的特殊情况——一种常见的构建块,可以级联以构建更大的滤波器。与 FIR 滤波器相比,这种方法需要更少的系数来实现所需的频率响应。使用这种方法时需要考虑一些特殊的权衡。如果未正确选择系数,则使用反馈会导致滤波器振荡。
此外,还有许多工具可以为所有常见用例自动生成系数。找到“食谱”来计算滤波器系数是很常见的。
图 2。 自动生成系数的众多工具之一。
使用 PowerQuad IIR 双二阶引擎
LPC55S69 PowerQuad 单元包含用于计算 IIR 双二阶滤波器的专用硬件。使用 PowerQuad 过滤收集的数据样本将使 CPU 可以自由执行其他任务。
如上所述,过滤器算法的实现并不复杂,但它们会占用大量 CPU 时间。 LPC55S69 MCU 的 PowerQuad 单元包含针对许多滤波和复杂数学运算进行了优化的专用硬件。它通过 AHB 总线和 Arm® Cortex®-M33 协处理器接口连接。
LPC55S69 的标准开发环境是基于 Eclipse 的免费 IDE MCUXpresso。 LPC55S69 SDK 包含许多有用的示例,其中一些是 PowerQuad 示例应用程序。
图 3。 选择 PowerQuad 数字滤波器示例。
“powerquad_filter”示例项目包含几个不同过滤器配置的示例。 “powerquad_filter.c”文件有几个函数来演示基本的过滤器设置。
早些时候,文章讨论了使用“直接表单 I”的过滤器,这是最直接的实现。然而,PowerQuad 在不改变结果的情况下重新安排乘法和加法运算的流程,导致“直接形式 II”,它不需要存储输入和输出的历史记录。相反,存储了一个中间历史 v[n],也称为过滤器状态。
AHB 总线上的少数寄存器用于存储状态和系数,以便为 IIR 滤波器操作设置 PowerQuad。在 SDK 示例中,过滤器的状态在 PQ_BiquadRestoreInternalState 函数中初始化。
一旦完成,过滤器就准备好处理数据样本。这是在 fsl_powerquad_filter.c 中的 PQ_VectorBiquadDf2F32 函数中完成的:
图 4。 矢量化 IIR 滤波器实现
此函数旨在以八的倍数处理输入样本块。在 MCR 指令的帮助下,数据可以从 LPC55S69 的主处理内核的寄存器传输到附加的协处理器,在这种情况下是 PowerQuad。
然后 PowerQuad 将执行过滤工作——这是一种比在 LPC55S69 的 Cortex-M33 内核上执行许多乘法和加法运算更有效的方法。 PowerQuad 完成后,可以使用 MCR 指令访问结果,该指令将数据从协处理器移回内部 CPU 寄存器。
用于数字滤波的双双二阶 IIR 引擎
LPC55S69 MCU 带有一个 PowerQuad 单元(包含两个独立的双二阶引擎),可以帮助加速滤波和复杂的数学运算。 AHB 总线寄存器用于配置 PowerQuad IIR 功能,数据通过协处理器接口在 PowerQuad 和 Cortex-M33 内核之间交换。
MCUXpresso 中的 LPC55S69 SDK 是一个很好的起点。但是,代码并未优化,因为它旨在易于理解。请记住,虽然 PowerQuad 可以显着加快过滤应用程序的速度,但 CPU 仍然必须在 PowerQuad 协处理器之间传输数据。
NXP 有一个有用的 IIR 双二阶滤波器设计和可视化工具来协助配置软件。 NXP 的社区页面还提供了对 LPC55S69 MCU 的 PowerQuad 单元及其功能的深入了解。
行业文章是一种内容形式,允许行业合作伙伴以编辑内容不太适合的方式与 All About Circuits 读者分享有用的新闻、消息和技术。所有行业文章都遵循严格的编辑指南,旨在为读者提供有用的新闻、技术专长或故事。行业文章中表达的观点和意见是合作伙伴的观点和意见,不一定是All About Circuits或其作者的观点和意见。
嵌入式