LPC55S69 + PowerQuad第2部分:数字IIR滤波
翻译自:Eli Hughes
在上一篇文章中,我们开始讨论LPC55S69中的PowerQuad引擎以及“时域”中的数据概念。使用Mini-Monkey板,我们展示了随时间推移收集数据桶的功能。我选择使用麦克风作为数据源,因为它易于可视化和理解。现在,您可以轻松想象用随时间变化的任何东西替换麦克风。在本文中,我们将研究在时域中处理数据的一些通用算法。特别是,我们将研究LPC55S69 PowerQuad中的“ Dual Biquad IIR”引擎。 IIR biquad是常用的构建块,因为可以针对许多常见的过滤用例配置过滤器。本文无意回顾IIR滤波器实现背后的所有DSP理论,但我想强调一些关键点和PowerQuad实现。
嵌入式微控制器的数字滤波
当对数据进行“实时”采样时,可以想象以已知速率连续记录数据。时域滤波器将接受此输入数据并输出以某种方式修改的新信号。
图1.时域过滤
这里的概念是滤波器的输出只是另一个时域信号。您可以选择对该新信号进行进一步处理,或输出到数字模拟转换器(DAC)。如果考虑“正弦波”,则数字滤波器会调整输入信号的幅度和相位。当我们应用不同的频率输入(或不同频率的总和)时,滤波器会衰减或增加正弦波分量。那么,如何计算数字滤波器呢?这很简单。让我们从一个简单的案例开始。 :
图2.使用输入的历史记录进行逐样本过滤处理
我们执行的一项操作是将最新输入的样本与我们先前记录的样本“混合”。此操作的结果是我们的下一个* output *示例。该滤波器配置的名称是FIR或有限冲激响应滤波器。编写此算法的一种方法是使用“ c数组样式”符号和差分方程。
x [n]当前输入
x [n-1]我们之前的输入
y [n-2]来自2个示例之前的输入
y [n]我们的下一个输出
图2可以写成
y [n] = b0 * x [n] + b1 * x [n-1] + b2 * x [n-2]
我们要做的就是将输入样本及其历史乘以常数系数,然后将其相加。我们先乘后积!常数b0,b1和b2控制滤波器的频率响应。通过正确选择这些数字,我们可以衰减“高频”(低通滤波器),衰减低频(高通滤波器)或将两者进行某种组合(带通滤波器)。我们还可以使用输入历史记录中的更多样本。例如,不仅可以使用前三个样本,还可以使用128个样本。这种类型的滤波器(FIR)可能需要相当长的时间历史才能对其频率响应进行精确控制。实现此结构的代码很简单,但是可能会占用大量CPU,因为您需要进行乘法运算,并以信号采样率对每个采样进行加法运算。
我们可以对图2进行调整,从而可以在不使用较长时间的情况下更严格地控制我们的频率响应。
图3.使用输入和输出历史记录的逐样本过滤器处理
图2和图3之间的主要区别在于,我们还可以混入先前的滤波器* outputs *以生成输出信号。添加这种“反馈”可以产生一些有趣的特性,并且是另一类称为IIR(无限脉冲响应滤波器)的数字滤波器的基础。
y [n] = b0 * x [n] + b1 * x [n-1] + b2 * x [n-2] + a1 * y [n-1] + a2 * y [n-2]
这种方法的主要优点之一是,与FIR滤波器结构相比,所需的系数更少,以获得所需的频率响应。在使用IIR滤波器还是FIR滤波器时,总是需要权衡取舍,因此请务必仔细阅读它们之间的区别。我在图3中显示的示例称为“ biquad”。双二阶滤波器是常见的滤波器构建块,可以很容易地级联以构建更大的滤波器。使用二元结构的原因有很多,其中之一是有许多设计工具可以生成所有常见用例的系数。几年前,我围绕一组对音频过滤有用的设计方程式构建了一个工具。
http://community.nxp.com/docs/DOC-100240
http://shepazu.github.io/Audio-EQ-Cookbook/audio-eq-cookbook.html
图4. IIR Biquad滤波器设计工具。
在制作图4所示的工具时,我正在使用biquad滤波器结构对吉他效果处理器上的音调进行控制。频率和相位响应图用于显示电吉他拾音器的感兴趣频率。有很多选择系数的选项,并且有许多库可以提供帮助。例如,您可以使用Python:
http://docs.scipy.org/doc/scipy/reference/generation/scipy.signal.iirfilter.html
在我的吉他效果项目中,我将滤波器设计方程式嵌入了我的C代码中,因此可以动态地重新计算系数!
使用PowerQuad IIR Biquad引擎
LPC55S69中的PowerQuad具有专用的硬件来计算IIR双二阶滤波器。像FIR滤波器一样,实现双二阶滤波器的实际代码也很简单。 IIR滤波器的编码可能很简单,但是会花费大量的CPU时间来处理所有的乘法和累加运算。 PowerQuad可用于释放CPU来执行biquad计算的核心计算组件。使用PowerQuad IIR双二元引擎的一个很好的起点是使用MCUXpresso SDK。请务必注意,SDK将是一个起点。编写SDK代码以涵盖尽可能多的用例,并演示PowerQuad的不同功能。通读源代码并决定需要为自己的应用程序提取哪些片段可能会有所帮助。 DSP代码通常需要针对特定用例进行一些手动调整和优化。 PowerQuad通过AHB总线和Cortex-M33协处理器接口连接。让我们看一下SDK源代码,以了解IIR引擎的工作方式。
使用MCUXpresso中的“导入SDK示例”向导,您将在driver_examples> PowerQuad下找到PowerQuad示例。
图5.选择PowerQuad数字滤波器示例
PowerQuad_filter项目有许多不同过滤器配置的示例。我们将以浮点双二阶示例为起点。在文件powerquad_filter.c中,有几个测试函数将演示基本的过滤器设置。我正在使用LPC55S69 SDK 2.7.1,第455行周围有函数(请注意拼写错误PQ_VectorBiqaudFloatExample)。
图6.矢量化浮点IIR滤波器功能
要注意的第一点是PowerQuad使用“ Direct Form II”计算IIR滤波器。在前面的图中,我显示了使用“直接表格I”的过滤器。当第一次将其引入IIR滤波器时,“直接格式I”是自然的起点,因为它是最清晰,最直接的实现。但是,可以重新安排乘法和加法的流程并获得相同的算术结果。
图7. IIR直接表格II
http://ccrma.stanford.edu/~jos/filters/Direct_Form_II.html
使用“直接表格II”时,我们不需要存储输入和输出的历史记录。相反,我们存储标记为v [n]的中间计算。在过滤器的计算过程中,必须保存中间历史记录v [n]。我们将这些中间值称为过滤器“状态”。为了将PowerQuad设置为IIR滤波器操作,AHB总线上有一些寄存器,用于存储状态和系数。在SDK示例中,使用PQ_BiquadRestoreInternalState()初始化过滤器的状态。
图8.恢复/初始化过滤器状态
一旦PowerQuad IIR引擎初始化,就可以通过过滤器处理数据样本。让我们看一下fsl_powerquad_filter.c中的函数PQ_VectorBiqaudDf2F32()
图9.矢量化IIR滤波器实现。
此功能旨在处理更长的输入样本块,理想情况下是8的倍数。请注意,许多SDK示例的设计使其易于入门,但可以轻松进行调整以删除可能不适用于您的应用程序代码的操作。例如,确定输入块是否为8的倍数的模运算可以很容易地删除以节省CPU时间。在您的应用程序中,您可以完全控制缓冲区大小,并且可以轻松地优化和删除不必要的操作。可以在处理第一个样本块的代码块中观察到滤波器的实际计算。
图10.使用ARM MCR协处理器指令将数据传输到IIR引擎
数据通过MCR指令传输到PowerQuad。该指令将数据从CPU寄存器传输到连接的协处理器(在这种情况下为PowerQuad)。 PowerQuad完成了Direct Form II IIR结构的工作。虽然需要一些CPU干预才能将数据移入PowerQuad,但PowerQuad的乘法和加法过滤器实现效率更高。
为了获得结果,使用了MRC指令。 MRC将数据从协处理器移至CPU寄存器。
图11.使用MRC指令检索IIR过滤器结果。
在PQ_VectorBiquadDf2F32()中,进一步调整了汇编代码,以将数据注入8个样本的块中。查看PQ_Vector8BiquadDf2F32():
图12.将矢量化数据插入PowerQuad中。
请注意,所有MCR / MRC功能都可以将数据传入和导出出Biquad引擎。所有其他指令都是“标准” ARM指令,用于将数据获取到馈入协处理器的寄存器中。花一些时间在SDK中运行示例。它们的结构是注入已知序列以验证正确的过滤器操作。既然您已经了解了一些内部原理,则可以使用SDK中所需的部分来实现信号处理链。
Some take-aways
PowerQuad可以帮助加速双二阶滤波器。 PowerQuad内置有2个独立的二元发动机。
PowerQuad IIR功能通过AHB总线上的寄存器和通过Cortex M33协处理器接口传输的实际输入/输出样本进行配置。
SDK示例是了解如何配置数据并将数据传输到PowerQuad的一个很好的起点。您的特定应用程序有优化的机会,因此请确保检查所有代码。
如果您需要两个以上的二元滤波器,则需要保留滤波器的“状态”。如果您一直在保存/恢复状态,这可能是一个潜在的昂贵操作。在这种情况下,您将要考虑处理更长的数据块。
您可能不需要保存过滤器的整个“状态”。例如,如果所有滤波器的滤波器系数都相同,则所有要保存和恢复的就是v [n]。
尽管PowerQuad可以加速(6倍)核心IIR滤波器处理,但是您仍然需要CPU来设置PowerQuad并输入样本。考虑在LPC55S69中使用一个额外的Cortex M33内核来进行数据混排。
现在,您可以在使用LPC55S69 PowerQuad进行时域滤波方面领先。我们研究了IIR滤波器,该IIR滤波器在音频和传感器信号处理中有许多应用,但是PowerQuad也可以加速FIR滤波器。下次,我们将使用PowerQuad转换引擎通过一些频域处理来深入研究。嵌入式变换引擎可以*显着*加速快速傅立叶变换的处理。请继续关注更多嵌入式信号处理优势!
翻译有问题的地方还请小伙伴们指出,谢谢!
|