24小时联系电话:18217114652、13661815404
中文
公司新闻
嵌入式微控制器的数字滤波
处理随时间推移或在时域中收集的数据样本时,最基本的操作之一是“过滤”数据。重要的是要理解可以数字方式过滤数据以达到最佳结果并释放CPU来执行其他任务的通用方法,尤其是在涉及嵌入式微控制器时。
在本文中,了解时域中用于过滤和处理数据样本的广泛使用的方法。另外,请仔细研究LPC55S69 MCU中PowerQuad单元的Dual Biquad IIR引擎-一种在许多滤波用例中有用的通用DSP构建块。
连续采样数据的通用过滤器
在时域中采样数据时,将以已知的固定速率连续收集数据。时域滤波器接受此数据作为输入,并输出以某种方式修改的新信号。滤波器的输出只是另一个时域信号,可以对其进行进一步处理或传输到数模转换器(DAC)。
我们通常根据滤波器对正弦波的响应方式来对其进行处理。如果我们将输入信号视为简单的正弦波,则滤波器可以调整输入的幅度以及调整其相位。将复杂信号施加到滤波器时,它将调整信号正弦分量的幅度和相位。滤波器在频率范围内的行为方式称为频率响应。
时域中的标准操作由所谓的有限冲激响应(FIR)过滤器执行,该过滤器将最新的数据样本与以前收集的元素混合在一起以获得下一个输出样本。
图1.使用输入的历史记录进行逐样本过滤处理。
实现这种过滤器的一种方法是将先前的样本存储在数组中,并使用一个简单的方程式将它们合并:
x[n] // The most recent input <br /> x[n-1], x[n-2] // The two previous input samples <br /> y[n] // The next output sample <br /> <br /> y[n] = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2]
这个特定的伪代码段将最新的样本与之前的两个数据样本结合在一起。它将每个数据样本与单独的常量系数相乘,然后对结果求和以获得下一个输出样本。总之,这表示简单的乘法和累加运算,其中常数系数和历史记录的长度控制滤波器的频率响应。
通过为系数选择适当的值,可以构造各种类型的滤波器。如果滤波器衰减高频,则它充当低通滤波器。通过衰减低频,所得滤波器将充当高通滤波器。也可以将两种方法结合使用,这将导致带通滤波器。
FIR滤波器在概念上很简单,但是可能需要大量先前的数据样本才能对其频率响应进行精确控制。尽管此过滤器易于理解和实现,但在常规CPU上执行它可能很麻烦,尤其是在具有中等大小的历史记录的情况下。这是因为每个样本都需要许多乘法和加法运算才能确定输出。
减少所需历史量的一种方法是在计算下一个输出样本时使用先前确定的滤波器输出。这是另一类称为无限脉冲响应滤波器(IIR)的数字滤波器的基础:
// This examples uses the previously established naming conventions<br /> 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 Biquad引擎
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会执行过滤工作,这是执行LLP55S69的Cortex-M33内核所采用的多种乘法和加法运算的一种更为有效的方式。一旦完成PowerQuad,就可以使用MCR指令访问结果,该指令将数据从协处理器移回内部CPU寄存器。
用于数字滤波的双Biquad IIR引擎
LPC55S69 MCU带有PowerQuad单元(其中包含两个独立的biquad引擎),可以帮助加速过滤和复杂的数学运算。AHB总线寄存器用于配置PowerQuad IIR功能,并且通过协处理器接口在PowerQuad和Cortex-M33内核之间交换数据。
MCUXpresso中的LPC55S69 SDK是一个很好的起点。但是,该代码并未经过优化,因为它易于理解。请记住,尽管PowerQuad可以大大加快过滤应用程序的速度,但是CPU仍必须在PowerQuad协处理器之间来回传输数据。