所有关于电路
行业的文章

在LPC55S69单片机上计算快速傅里叶变换

2020年12月17日,通过Eli Hughes, NXP Semiconductors

本文研究了转换引擎,PowerQuad的另一部分,它使LPC55S69单片机能够计算快速傅里叶变换(FFT)。

NXP的LPC55S69微控制器包含许多特性,使其适用于各种应用。LPC55S69单片机和它的PowerQuad单元包括独特的组件- Biquad和Transform引擎-用于完成各种任务,让主CPU核心空闲用于其他事情。

一篇文章,了解嵌入式微控制器的数字滤波,探beplay体育下载不了索了在时域内对数据样本进行滤波和处理的各种广泛使用的方法。为此,它利用了LPC55S69的PowerQuad单元的Biquad发动机。

本文研究了转换引擎,PowerQuad的另一部分,它使LPC55S69单片机能够计算快速傅里叶变换(FFT)。

理解离散傅里叶变换

在处理诸如长度和温度等日常测量时,存在一套工具来确定被测量物体的大小和温度。对于时域信号,测量工具的选择可能不那么明显。考虑图1中给出的信号示例。

按固定间隔采样的输入信号。

图1所示。按固定间隔采样的输入信号。

如何测量、理解和描述这种信号?可能的选择可以是振幅,频率,或一些数值计算的方法从统计。一种开始的方法是测量感兴趣的信号与已知的余弦波,如图2所示。

输入信号旁边有一个余弦规范信号。两者的样本数相同。

图2。输入信号旁边有一个余弦规范信号。两者的样本数相同。

因为余弦波的振幅和频率很容易固定,因此可以识别,它可以比较余弦波与输入信号。如果做得正确,输入信号和余弦波之间的点积的结果值量化了输入信号与量规的相关程度。因此,可以将输入信号和规范信号看作是相同长度的离散输入数组,这样就很容易计算点积。

结果是一个标量,其大小与输入信号与余弦规范信号的相关程度成正比。点积运算可归结为许多乘和加运算-与文中讨论的相同的运算了解嵌入式微控制器的数字滤波

这种方法很快就能产生良好的效果。然而,在应用这种方法时,有一种特殊的情况是行不通的。如果输入信号是与压力表频率相同的余弦波,但其相位相对于压力表移了90度,上述方法的输出将为零。通过目测,似乎仍然存在仪表和输入信号之间的相关性,但有一些细节我们需要考虑。

与旧的测量信号相比,新的测量信号相移了90度。

图3。与旧的测量信号相比,新的测量信号相移了90度。

这种行为可以与测量一张薄纸的“长度”相比较。当用尺子来确定纸条一面的长度时,纸张可能是10英寸长,1英寸宽。这两个数字都是正确的,但这把尺子必须转动90度才能得到这两个尺寸。这两个数字在技术上都是正确的,我们可以把它们一起使用来得到我们这张纸的真正“尺寸”(长度和宽度)。为了克服输入信号的这一问题,可以使用第二个计量器,如图4所示。

两种测量信号都可以用来更好地量化输入信号。

图4。两种测量信号都可以用来更好地量化输入信号。

两个压力表(紫色和绿色显示)之间的唯一区别是90度相移。在前面的类比中,这相当于转动尺子。在输入信号和每个仪表之间的点积计算得到最终的输出。这产生了两个值A和B,每个值都包含了输入与其中一个仪表的关联程度。通常,它们被认为是单个复数:

输出= B + i * A

下一步是将输入信号与不同频率的量规进行比较(图5)。

多量规也可以应用。绿色的比紫色的移动了90度。

图5。多量规也可以应用。绿色的比紫色的移动了90度。

如图所示,最终的结果包含了一些不同的仪表。虚数部分(紫色部分)与绿色信号(实数部分)相移了90度,就像上面的两个量程例子一样。不同量规的数量没有限制。

使用这种技术-称为离散傅里叶变换(DFT) -产生一个频谱的输出在所有感兴趣的频率的问题。可以用数学方法描述该技术如下:

方程1。DFT的数学描述。

其中N是输入信号中的样本数,k是(co)正弦参考量规的频率。

快速傅里叶变换(FFT)的局限性

FFT是一种计算DFT的数值有效方法,与上面讨论的方法相比,它需要更少的乘法和加法运算。然而,对输入有一些限制:

  1. 输入的长度必须是2的幂。
  2. 不允许在输出中任意输入长度和频率间隔。输出箱的间隔是输入信号的采样率除以输入中的采样数。例如,如果输入是一个以48khz采样的256点信号,则输出阵列对应以187hz(48.000除以256)为间隔的频率。
  3. 当输入由实数组成时(例如,从ADC中获得的样本),输出是对称的。例如,如果输入包含64个样本,那么FFT结果也将包含64个复数。然而,输出数组的后半部分包含前半部分的复共轭。

使用PowerQuad FFT引擎

DFT/FFT运算背后的数学运算可以通过简单的乘法和加法运算来执行,这是将数学运算外包给专用协处理器的理想选择,例如LPC55S69 MCU上的PowerQuad。因此,主CPU内核可以自由地处理其他任务。

使用PowerQuad FFT引擎是一个简单的过程,官方SDK附带了演示协同处理特性的示例项目。一个特别的例子,叫做powerquad_transform,演示了FFT计算过程。

c文件包含几个测试不同FFT引擎模式的函数。其中之一是PQ_RFFTFixed16Example函数。这个示例初始化PowerQuad以接受16位整数数据。浮点数据必须预先转换为定点值,因为PowerQuad转换引擎只支持整数。

FILTER_INPUT_LEN定义输入样本的数量。输出数组的长度是两倍,因为它需要存储结果值的实部和虚部。

这部分代码定义了测试数据和预期结果。

图6。这部分代码定义了测试数据和预期结果。

最后一个数组包含用于验证结果的测试数据。注意数组的后半部分是如何包含上述复杂共轭的。此外,共轭物是不相等的(例如76、-50和77、49)。无论如何,一旦数据初始化,下面的数据结构将用于配置PowerQuad:

示例程序的这一部分配置和初始化PowerQuad单元。

图7。示例程序的这一部分配置和初始化PowerQuad单元。

有必要降低输入以防止算法溢出。这个过程发生在上图的第二行。FILTER_INPUTA_PRESCALER被设置为5,因为有32个样本(2的5次方)。预缩放是PowerQuad的另一个硬件特性,这可能是在预期测试结果中观察到的不精度的原因。

一旦一切都设置好了,输入和输出区域的位置就会传递给PowerQuad单元,这在PQ_transformRFFT函数中发生。此方法设置一些配置寄存器,并通过写入控制寄存器来启动PowerQuad。在本例中,CPU等待PowerQuad完成。等待并不总是必要的,而且当CPU执行其他任务时,PowerQuad可以异步执行计算。

利用PowerQuad进行数学运算

PowerQuad是一个协处理器适用于LPC5500系列MCU的各种设备上的复杂数学运算。它包括一个用于高效计算fft的特殊引擎,它可以独立于主CPU核完成。LPC55S69单片机的SDK包含了如何设置和使用PowerQuad的示例。

NXP的社区页面包含以LPC55S69单片机为中心的广泛信息、讨论和文章。

行业文章是一种允许行业合作伙伴与All About Circuits读者分享有用的新闻、信息和技术的内容形式,而编辑性内容并不适合这种形式。所有行业文章都受到严格的编辑指导方针,目的是为读者提供有用的新闻,技术专长,或故事。Industry Articles中所表达的观点和观点是合作伙伴的观点和观点,不一定是All About Circuits或其作者的观点和观点。