查看: 2543|回复: 0

[分享] LPC55S69 +功率四核第3部分:快速傅立叶变换-标尺,量规和...

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3312

    主题

    6566

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32204
    最后登录
    2024-5-11
    发表于 2020-8-14 13:04:06 | 显示全部楼层 |阅读模式
    LPC55S69 +功率四核第3部分:快速傅立叶变换-标尺,量规和量角器


    翻译自:Eli Hughes
           在我的上一篇文章中,我们研究了一种称为Biquad的通用时域滤波器,以及如何使用LPC55S69 PowerQuad引擎对其进行计算。现在,我们将注意力转向PowerQuad的另一个强大组件,即“转换引擎”。 PowerQuad转换引擎可以以省电和省时的方式计算快速傅立叶变换(FFT),而使您的主CPU内核可以处理其他任务。

    在介绍LPC55S69的实现之前,我想说明FFT对信号的确切作用。数据的含义经常被掩盖甚至更糟,以纯数学术语解释,而没有描述* context *。我经常听到诸如“将信号从时域转换到频域”之类的描述。尽管这些类型的描述是准确的,但我认为许多人对数字的“含义”并没有直观的感觉。我记得我的第一门常微分方程式课程。教授在解释拉普拉斯变换(这是傅立叶变换的更一般化的情况)时,我问了一个问题:“在实际用例中,它实际上意味着什么?”。
    1.png
    图1.拉普拉斯变换。什么是s?


    我的教授是一位出色的数学家,也是复杂分析方面的专家。他可以使用严格的数学方法从3个不同的角度解释转换。最终,我们俩都感到沮丧,他说:“在工程应用中,这将是大量的复数”。事实证明,就我们要解决的电气工程问题而言,答案很简单。多年后,在声学研究生院再次使用Laplace听起来很有意义,但在当时却是神奇的。我希望对FFT的处理方式有所不同,您会发现它比您想象的要简单。尽管我无法在本文中讨论使用FFT的所有方面,但我希望它能为您提供与“入门”观点不同的观点。


    标尺,量角器和量规

    我最喜欢的活动之一是木材加工。我不是本领域的专门技术人员,但是我喜欢使用工具,制造有用的东西以及欣赏天然产品的美感。我经常告诉人们,“精益求精”就是要学习如何测量,量度和建造固定装置以进行操作。当您有一块木头时,最基本的操作之一就是根据某个固定标准测量其长度。让我们从美丽的东方铁杉开始吧:
    2.png
    图2.一块12英寸x 3英寸x 26英寸的粗锯东部铁杉。


    我们可能要对此样品进行的第一件事是使用某种标准量规将其与以下各项进行比较:
    3.png
    图3.将我们的木材与参考进行比较。

    我们可以选择一个标准单位,然后将样本与基于该单位的比例进行比较。在我的情况下,单位长度为“英寸”,但可以帮助解决当前问题的任何方法。通常,您想选择一个可以很好解决当前问题的单位和坐标系。如果我们要测量圆形“物”,则可以使用量角器,因为它使对测量的理解更加容易。想法是在问题的“坐标系”中的系统中工作。使用直尺测量一块“矩形”木头是很有意义的。

    这与DSP和Fourier转换有什么关系?我希望向您展示傅立叶变换(及其高效的离散实现,即FFT)只是一组可用于理解时域信号的量规。然后,我们可以使用PowerQuad硬件执行“测量”。为了便于讨论,让我们考虑如下时域信号:
    4.png
    图4.时域信号示例


    该特定信号比以前文章中使用的简单正弦波稍微复杂一点。我们究竟如何“测量”这个信号?振幅?频率?计算方差等统计数据?大多数现实世界中的信号可能具有相当大的复杂性,尤其是当它们与某些物理过程联系在一起时。例如,如果我们查看某种振动测量的结果,则信号可能看起来非常复杂,因为有许多物理过程会影响形状。在振动分析中,我们根据众所周知的物理原理来研究移动和振动的物理“事物”。物理学表明,可以使用偶数阶微分方程对系统进行建模。这意味着我们永远可以将系统随时间的行为写成正弦振荡的总和。那么,什么是用来检查我们信号的良好量规?好吧,我们可以从一个感兴趣的余弦波开始:
    5.png
    图5.将信号对准余弦波。

    选择余弦信号作为参考量规可以简化问题,因为我们可以轻松识别测量单位的属性,即其频率和幅度。我们可以固定参考的幅度和频率,然后将其与信号进行比较。如果我们正确地进行数学运算,我们将得到一个数字,该数字指示输入信号与特定频率和单位幅度的余弦波的相关程度如何。那么,我们如何精确地执行这种关联?事实证明这是一个简单的操作。如果我们将输入信号和参考量规视为离散的数字数组(即矢量),则可以计算它们之间的点积:
    6.png
    图6.计算测试信号和基准仪之间的相关性。

    操作很简单。您的信号输入和“量规”都具有相同数量的样本。将每个数组的元素相乘,然后将结果相加。使用类似符号的数组,输入用“ x [n]”表示,量规用“ re [n]”表示,其中n是数组中的索引:

    输出= x [0] * re [0] + x [1] * re [1] + x [2] * re [2] +。 。 。

    我们最终得到的是一个数字(标量)。它的大小与输出信号与我们正在使用的特定仪表的相关程度成正比。作为测试,您可以编写一些代码并将余弦波用作输入信号。测试代码可以调整输入的频率,并且随着输入的频率越来越接近仪表的频率,输出的幅度将会上升。

    如您所见,这里的数学只是一堆乘法和加法,就像上一篇文章中的IIR滤波器一样。但是这种方法有一个缺陷。输入的特殊情况是输出为零。如果信号输入是频率为*精确*的余弦波作为量规,并且相对于参考量规相移了90度,则输出将为零。
    7.png
    图7.参考量规的一种特殊情况,其输出为零。


    这是不可取的,因为我们可以看到输入与参考量表相关联,只是时间上有一个偏移。有一个简单的解决方法,我们甚至可以使用铁杉木材进行说明。
    8.png
    图8.沿着木材的另一侧进行测量。

    在图3中,我显示了沿着木材最长长度的标尺。我们还可以旋转标尺并沿着较短的一侧进行测量。它是同一规格,只是使用了不同的方式。想象一下,木板只有1英寸宽,但只有24英寸长。我可以请助手用尺子测量木板。这两个数字中的哪个是“正确的”?助理可以向我报告这些数字之一,并且在技术上是正确的。我们人类通常认为长度是矩形对象的较长边,但是该约定没有什么特别之处。在图6中,我们仅沿信号的1个“侧面”进行测量。可以得到零(或非常小)的测量结果,同时其信号看上去与量规非常相似(如图7所示)。我们可以通过“旋转”类似于图8的标尺并沿信号的两个“边”进行测量来解决此问题。
    9.png
    图9.使用两个参考量规。一种是“旋转” 90度。


    在图9中,我添加了另一个用紫色标记为“ A”的“量规”。原始量规标记为“ B”。两个量规之间的唯一区别是B相移了90度。这等效于旋转图8中的标尺并测量板的“宽度”。在图9中,我显示了3个必要的乘法/加法运算,但是您将对信号中的所有点执行乘法/加法运算。写出来:

    B = x [0] * Re [0] + x [1] * Re [1] + x [2] * Re [2] +。 。 。
    A = x [0] * Im [0] + x [1] * Im [1] + x [2] * Im [2] +。 。 。

    在这个新公式中,我们得到一对数字A,B作为输出。请记住,我们正在以单振幅的参考信号的*单个*频率来衡量输入。这类似于测量我们的木头块的长度和宽度。另一种思考的方式是,我们现在有一个测量工具,它可以沿“正交”两个轴进行评估。它几乎像一个三角形正方形。
    10.png
    图10.两轴量规。


    一旦获得了值A和B,通常将它们视为一个复数

    输出= B + iA

    复杂的输出为我们提供了一种与我们的参考量规之间如何相关的相对度量。要获得相对幅度,只需计算幅度:

    ||输出|| = sqrt(A ^ 2 + B ^ 2)

    您甚至可以提取阶段:

    相位=反正切(B / A)

    通常以“极性”形式(幅度/相位)来考虑输出。在振动应用中,通常需要了解信号不同频率分量处的能量大小。在通信中有一些应用程序,例如正交频域复用(OFDM),您可以在其中直接使用实部和虚部进行处理。

    之前我曾说过,我们正在执行的相关运算本质上是矢量点积运算。点积出现在许多应用中。其中之一是处理长度为2的向量,其中我们使用以下关系:
    11.png
    有趣的是,点积是获得两个向量和b之间的角度和大小关系的简单方法。容易将a和b视为2d平面上的向量,但是这种关系扩展到任何长度的向量。对于数字数据,我们使用离散样本,因此我们根据点积来定义所有内容。我们正在有效地使用此操作来计算幅度并找到“信号”之间的角度。在连续的时间世界中,存在内积空间的概念。它是点积的“模拟”等价物,是许多物理系统的数学模型的基础。

    在这一点上,我们可以停止使用蛮力技术,将信号与单个频率参考进行比较。如果我们要确定信号是否具有特定频率的较大分量,则可以根据需要的“精确”频率调整参考量规。下一步的逻辑步骤是将我们的信号与不同频率的参考仪表的“范围”进行比较:
    12.png
    图11:使用一系列不同频率的参考量规。


    在图11中,我显示了具有整数倍关系的四个不同的参考量规。您可以使用的频率数量没有限制。通过这种技术,我们现在可以在问题的所有感兴趣的频率处生成输出的“频谱”。该操作的名称为:离散傅立叶变换(DFT)。编写操作的一种方法是:
    13.png
    图12.离散傅立叶变换(DFT)

    N是输入信号中的样本数。

    k是余弦/正弦参考量规的频率。我们可以通过计算“ k”值范围内的DFT来生成“频率”频谱。选择频率时通常使用线性间隔。例如,如果您的采样率为48KHz,而您正在使用N = 64个采样,则通常会使用64个参考标尺,它们之间的间隔为(48000/64)Hz,这是很常见的(我们将在后面看到原因)。

    “快速傅立叶变换”

    快速傅立叶变换是一种计算DFT的数字有效方法。它是由JW Cooley和John Tukey于1965年开发的,与图11中所示的直接实现相比,它具有较少的加法和乘法运算。该方法的开发意义重大,因为我们可以做很多数字运算通过对输入施加一些限制来更有效地进行操作。使用FFT实现时需要考虑一些实际限制

    1.输入的长度必须是2的幂。即32、64、128、256。
    2.输出的“箱”在频率上以信号的采样率除以输入中的采样数来隔开。例如,如果您有一个以48Khz采样的256点信号,则输出阵列对应于以187Hz间隔的频率。在这种情况下,“ bin”将与0Hz,187.5Hz,375 Hz等相关。您不能在输出中具有任意输入长度或任意频率间隔。
    3.当FFT / DFT的输入为“实数”(即来自ADC的采样)时,结果数组会表现出特殊的对称性。考虑一个包含256个样本的输入数组。 FFT结果将为256个复数。输出的后半部分是前半部分的“镜像”(复共轭)。这意味着对于256个样本的输入,您将获得128个可用的“箱”信息。每个垃圾箱都有一个实部和虚部。使用我们在#2中的示例,容器将一直对齐到0Hz,187.5Hz,375Hz,一直到我们采样率(24KHz)的一半。

    您可以阅读有关FFT工作原理的更多详细信息,并在网上找到许多教学视频。从根本上说,该算法以大小为N / 2的两个DFT递归地表示信号长度N的DFT。重复此过程,直到您无法进一步划分中间结果为止。这意味着您必须以2的幂开始。这种特殊的公式称为“基数2时间抽取(DIT)快速傅里叶变换”。该算法通过重新使用中间计算的结果来计算多个DFT输出来提高速度。 PowerQuad使用称为“ Radix-8”的表述,但适用相同的原理。

    使用PowerQuad FFT引擎

    DFT / FFT的基础数学归结为乘法和加法以及一些缓冲区管理。该实现可以是纯软件,但是对于专用协处理器,此算法是一个完美的用例。好消息是,一旦您了解了DFT / FFT的输入和输出,使用PowerQuad就会非常简单,并且您确实可以加快您的特定处理任务。开始使用PowerQuad FFT的最佳方法是查看SDK中的示例。有一个名为“ powerquad_transform”的示例项目,其中包含测试PowerQuad硬件的示例。
    14.png
    图13. LPC55S69的MCUXpresso SDK中的PowerQuad转换示例

    在文件powerquad_transform.c中,有几个函数将以不同的模式测试PowerQuad引擎。现在,我们将专注于函数PQ_RFFTFixed16Example(void)。
    15.png
    此示例将设置PowerQuad以接受16位定点格式的数据。为了测试PowerQuad,使用已知的输入和输出数据序列来验证结果。我想指出的第一件事是PowerQuad转换引擎仅用于定点/整数处理。如果需要浮点,则需要事先进行转换。使用PowerQuad中的矩阵引擎可以做到这一点。我个人只有将FFT与定点数据一起使用时,我的大多数源数据都是来自模拟到数字转换器数据。由于FFT的处理增益,除了程序员易于使用之外,我从未见过将浮点格式用于FFT的任何好处。让我们看一下示例中使用的缓冲区:
    16.png
    请注意,输入数据长度为FILTER_INPUT_LEN(32个样本)。用于存储输出的数组的长度是其两倍。请记住,FFT将在输出中产生与输入样本相同数量的* complex *样本。由于我们的输入样本是实数值(标量),而输出具有实/虚分量,因此我们将长度乘以2倍即可存储结果。在此之前,我曾说过FFT具有实值输入的含义之一是,我们具有带有复共轭对的镜像频谱。关注代码中测试FFT输出的参考:
    17.png
    第一对100,0对应于第一仓,它是“ DC”或0Hz分量。虚部应始终为零。下一个垃圾箱可以与数据另一端的垃圾箱配对:

    76,-50 <-> 77,49
    29,-62 <-> 29,61
    -1,-34 <-> -1,33

    这些是表现出镜像对称性的复杂共轭对。您会看到它们并不完全相等。我们一会儿就会明白为什么。初始化所有测试数据之后,就有一个数据结构用于初始化PowerQuad:
    18.png
    计算FFT的副作用之一是您可以在过程的每个阶段都获得收益。当使用整数时,可能会出现削波/饱和,并且需要对输入进行缩减以确保信号下降不会在FFT过程中出现数值上的溢出。宏FILTER_INPUTA_PRESCALER设置为“ 5”。这是由于输入的长度为32个样本或2 ^ 5。 Radix-2 FFT的核心功能是将输入信号分成两半,直到达到2点DFT。因此,我们需要缩小2 ^ 5,因为我们可能在FFT的每个阶段将中间结果加倍。 PowerQuad使用Radix-8算法,但缩小尺寸的需求实际上是相同的。我相信我们在复共轭对中看到的一些不准确之处是测试数据来自数值较小的输入数组值和预缩放设置的组合。请注意,预缩放是PowerQuad的内置硬件功能。

    PowerQuad需要一个中间区域来工作。从地址0xe0000000开始有一个专用于PowerQuad的特殊16KB区域。 PowerQuad具有到该区域的128位接口,因此最好将此区域用于FFT临时工作区域。您可以在AN12292和AN12383中找到有关此专用RAM的更多详细信息。

    一旦配置了PowerQuad,下一步就是告诉PowerQuad输入和结果数据将通过函数PQ_transformRFFT()存储。
    19.png
    注意,在该功能的实现中,正在发生的一切是通过AHB总线设置更多的配置寄存器,并通过写CONTROL寄存器启动PowerQuad。在示例代码中,CPU阻塞直到PowerQuad完成,然后检查结果。重要的是要指出,在您自己的应用程序中,您不必在PowerQuad完成之前就进行阻塞。您可以设置一个中断处理程序来标记完成,并使用通用M33内核进行其他工作。就像我在有关使用PowerQuad进行IIR过滤的文章中所说的那样,示例代码是一个很好的起点,但是有很多机会可以优化您的特定算法。示例代码倾向于包含其他逻辑来检查函数参数,以使初始体验更好。始终花时间浏览代码,以了解在哪里可以删除可能没有用的样板。

    Parting Thoughts

    PowerQuad包含用于计算快速傅立叶变换的特殊引擎。
    FFT是离散傅立叶变换的有效实现。此过程只是将信号与一组已知的参考量规(正弦和余弦)进行比较
    PowerQuad拥有一个私有区域来进行中间工作。使用它可获得最佳吞吐量。
    还请考虑输入和输出数据所在位置的内存布局和AHB连接。通过确保您输入的DSP数据位于与通用应用程序中的RAM不同的端口上的RAM块中,可能会获得额外的性能提升。当不同的进程正在访问数据时,这可以帮助争用。例如,SRAM0-3都位于不同的AHB端口上。您可能会考虑在SRAM3中定位输入/输出数据,并在SRAM0-2中具有通用数据。注意:对于中间工作区,仍然需要对PowerQuad TEMP配置使用0xE0000000。
    20.png
    此时,您可以开始浏览示例转换代码。另外,请确保通读AN12292和AN12383以了解更多详细信息。尽管FFT和“频域”处理还有更多细微差别和细节,但我会将其保存在以后的文章中。下次,我希望在Mini-Monkey上演示PowerQuad FFT性能的一些演示,并说明PowerQuad的其他方面。在此之前,请在下面的LPC55S69上查看一些其他资源。


    更多文章:
    LPC55S69 + PowerQuad第1部分:工业物联网和智能计量的出色解决方案
    LPC55S69 + PowerQuad第2部分:数字IIR滤波


    翻译有问题的地方还请小伙伴们指出,谢谢!
    签到签到
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-5-12 16:59 , Processed in 0.131219 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表