低功率微处理器的存储空间相对较小,用它们实现FFT转换一直是一个重要问题,难以解决。细介绍了FFT实现的具体算法,包括低功耗微处理器的固有弱点,样本采集和程序实现过程中需要解决的问题,窗口程序和问题在实施过程中解决。FFT变换在低功耗微处理器中实现,结果表明该设计方法在低功耗微处理器中具有良好的性能。功率;微处理器;傅立叶变换;窗口程序中图分类号:TP368.1代码:BA商品编号:1004-373X(2010)12-0169-04Applications FFT的小型微控制器puissanceZHANG香港-yun(理工技工学校花都广州510800)摘要:微控制器难以实现FFT,因为低功耗微控制器的RAM非常小。功耗微控制器此外,还介绍了实现FFT的算法和低功耗微控制器的缺点:需要特别注意采集样本的问题,程序的实现以及与之相关的问题。论了原始信号的寡居问题。description.FT在低功耗微控制器中进行FFT。率设计了一种在低功耗微控制器中执行FFT的有效方法。果表明这种方法是可行的。键词:低消费;傅里叶变换和窗口化在过去,外围设备是更大的微处理器,例如专用集成电路和DSP的存储器[1]。今,低功耗微处理器包括外设,允许它们以低功耗执行复杂的操作[2-3]。文描述了在低功率微处理器中实现快速傅里叶变换(FFT),其中后者包括一个周期硬件乘法器。应用可以实时计算输入电压的频谱。此,模数转换器对输入信号进行采样并将其发送到微处理器[4]。后,微处理器对采样信号执行256点FFT分析,以获得输入电压的频谱。
了测试其效率,微处理器计算频谱的幅度并将其实时传输到示波器。景技术为了确定输入样本的信号的频谱信息,必须计算输入样本的离散傅立叶变换(DFT)。散傅立叶变换的定义如下:X(K)= N-1n0= X(N)e-j2πkN,0≤k≤N-1(1)其中:是N采样点的数量,X(k)是光谱,x(n)代表输入样本。用相干欧拉方程,输入采样和求和方程的光谱分离成它们的实部和虚部,并且能够获得XRe(k)的下一个节目=Σ的N-1N =0[xRe(n)的COS(2πknN)xIm (n)的SIN(2πknN)] =Σn = N的-10xRe COS(2πknN(2)XIm(K)=-Σn = N的-10[xRe(n)的SIN(2πknN)-xIm(n)的余弦(2πknN )] – – N-1n=0xResin(2πknN)(3)因为输入样本只考虑实部而且方程的第二项和式(2) )和(3)消失假设存在γN样本方程(2)和(3)的直接计算需要乘法2N2和2N(N-1)子加法。256点的入口样本的TFD将需要131,072次乘法和大约130,560次加法。经有很多算法FFT普通基本算法2连续地将DFT分解为两个较小的DFT [5],为了使这成为可能,N必须被分解为2的整数幂。图1的节流阀的计算中示出了转换为基于2的FFT的步骤。据图1的节流阀[6]的计算,FFT算法与基座2的解决方案是(N / 2)log2 N乘法和Nlog2 N加法。1中的WH值通常被认为是一个扭转因子,可以在执行FFT之前计算[7]。图1中,FFT中的条目具有特殊形式。是带有倒排索引的初始顺序。此,当计算N = 8且基数为2的FFT时,输入数据的记录顺序必须为0(000b),1(001b),…,0( 000b),4(100b),. FFT以正确的顺序出现。1还显示蝶形计算的结果仅是进入FFT下一步的结果。于计算在适当的位置进行,旧值可以代替新获得的值和FFT计算N个样本仅需要2N个变量(2N变量必需的,因为每个变量具有实部和虚部)的点。)。1使用蝶形计算FFT(其中N = 8)FFT完成后,结果为复数。

程(4)和(5)转化在极坐标复数表示:XMAGN(K)=X2Re(K) X2Im(K)(4) XPHASE(K)=反正切(XIm(k)的XRe(K))(5)大量的优化方法,以DFT / FFT被馈送到DSP部分。
加速了计算并且需要较少的计算,这是最重要的优化方法之一(并且可能是最容易实现的)。可以从观察的DFT来获得,这是因为实数N点的信号的DFT是对称X(N / 2),以便有:X(K)=X*( Nk)(6)执行点编写代码实现DFT并不是一件容易的事,因为使用低功耗微处理器实现DFT算法非常复杂。如,恒温阀芯这些微处理器通常如下:(1)有限的存储器。选的微处理器只有2 KB的RAM。据以上描述,已知实现FFT需要至少2N×16B变量。处理器无法执行采样点N大于512的FFT。是不现实的,因为其他固件也需要几个字节的RAM。此,在实际实施过程中,采样点通常限制在256个点。量16B用于表示每个值的实部和虚部。这种情况下,FFT数据需要1024 B RAM。(2)速度有限。然低功耗微处理器每秒可达到一百万条指令,但还需要一些优化方法来减少运行FFT时使用的指令数量。
运的是,C编译器在应用程序过程中包含许多优化的级别参数。细使用硬件芯片倍增还可以将代码优化到可接受的水平。(3)没有浮点函数。定的微处理器,尤其是低功耗的微处理器,没有浮点功能。此,所有计算都需要定点算法。了表示分数,固件将使用签名的Q8.7标记。
此,微程序假设0~6 B代表每个数字的小数部分,7~14 B代表每个数字的整数部分;第十五个字节是这个数字的符号位。种形式对加法和减法没有影响,但是对于乘法,应该注意所有数据都被组织为Q8.7。如,Q8.7的乘法是:0.5×1.375 = -64×176 =(1111 1111 1100 0000)B×(0000 0000 1011 0000)B =(1101 0100 0)B = – 88 = -0,687 5(7)为了获得更精确的FFT结果,Q8.7排列的一致性也适用于采样点相对较大的FFT。如,模数转换器以实部和虚部的互补形式提供8位符号数。果输入是一个DC电压(127是一个数字样本的签名8比特),它的光谱将完全从X获得的(0),具有Q8.7标记等于32 512这个值非常适合16位符号的数量。件下面介绍计算Base 2 FFT所需的固件。从模数转换器读取样本数时,将其存储在矩阵x_n_re中。表代表x(n)的实部。执行FFT之前,将虚部的值初始化为零并存储在x_n_im数组中。行FFT时,频域的幅度将替换原始样本的值,并将存储在x_n_re和x_n_im中。

集样本的FFT算法假设采样是以固定的采样率进行的。然这不是本文的一部分,但是如果您认真采用收集样本的代码,则会出现问题。如,不稳定的采样率将产生错误的FFT结果。此,您必须尽量减少这种情况。A / D转换器采样的原始代码可能在每个周期的采样率和输出结果命令中表现出不稳定性。如,系统从模数转换器读取8位有符号数,并将它们存储在16位矩阵变量中。面列出了两个伪代码算法,用于读取和存储来自模数转换器的数据。
一种称为算法1,将导致采样率不稳定。为阴性样本比正样本需要更多时间来读取和存储。断也不保证示例代码的有效性。数字转换器采样伪码(ADC):算法1:采样率不一致。//样品[]为i = 0到(N-1)begindoADCSampleConversion()//告诉ADC以开始采样[I] = read8BitSampleFromADC()//读取的样品的16位变量的阵列来自CAN的8位if(例如[i] 0x0080)//如果8位样本为负,则sample [i] = sample [i] 0xFF00 //否定16位字。束算法2:固定采样率。//样品[]是16比特变量的对于i = 0〜(N-1)begindoADCSampleConversion()//用于时通知它CAN开始取样的样品[I] = read8BitSampleFromADC()//床的阵列8位端对端文件i。CAN = 0〜(N-1)beginif(例如[I] 0x0080)具有//如果样品8位样品是阴性[I] =例如[I] 0xFF00 //为三角法提供16位字的负方位表FFT使用对应表(LUT)方法,而不是直接计算正弦和余弦值。弦和余弦转换表的声明在以下描述中给出。件中的声明包括在程序中自动生成这些表的原始代码。LUT表中的正弦和余弦具有N / 2个样本,因为扭转因子的指数在0~(N / 2)-1之间变化。正弦和余弦函数LUT:const int的cosLUT [N / 2] = {128,127,127,…,-127,-127,-127}; const int sinLUT [N / 2] = { 0, 3, 6,…, 9, 6, 3};具有这些LUT的语句是常量,迫使编译器将此数据存储在代码区域而不是数据区域中。很重要,因为微处理器中RAM的性质有限。
于转换表的值必须在Q8.7中分类,因此对应于正弦和余弦的值必须乘以27.反向位反转(N已知)可以在运行中计算。用搜索表标记1或直接使用开环。种方法都有自己的大小和执行速度的平衡。文使用开环直接写入方法执行位反转。前固件从原始代码自动生成此开环。环用于获得位反转(其中N = 256):i = x_n_re [1]; x_n_re [1] = x_n_re [128]; x_n_re [128] = i; i = x_n_re [2]; x_n_re [2] = X_n_re [64]; x_n_re [64] = i; i = x_n_re [3]; x_n_re [3] = x_n_re [192]; x_n_re [192] = i; i = x_n_re [4]; x_n_re [4] = x_n_re [32]; x_n_re [32] = i; … i = x_n_re [207]; x_n_re [207] = x_n_re [243]; x_n_re [243] = i; i = x_n_re [215]; x_n_re [215] = x_n_re [235]; x_n_re [235] = i; i = x_n_re [223]; x_n_re [223] = x_n_re [251]; x_n_re [251] = i; i = x_n_re [239]; x_n_re [239] = x_n_re [247]; X_n_re [247] = i;基本FFT算法2可以在对样本执行比特反转之后计算FFT。用蝶形方法计算基数2的FFT的固件(见图1)包括3个主循环。loglog2N的FFT计算阶段包含在循环外部。循环的每个阶段内执行单独的蝶形运算。FFT算法的核心是执行每个蝶形运算的块代码。

幸的是,这个块代码的计算是不可移植的。MUL_1和MUL_2使用微处理器的硬件乘法来执行乘法。数转换为极坐标要计算输入信号的幅度,必须将复数X(k)转换为极坐标。度将取代固件中不再需要的FFT中的原始值。维转换表的大小在等式(4)中确定,而不是在其计算中确定。一个值对应于频谱实部的四个最高有效位,而第二个值对应于频谱虚部的四个最高有效位。获得这些最重要的位,带符号的16位数字正确移位11次。
频谱的实部和虚部可以用作索引时,它们被它们的绝对值代替(符号位因此为零)。等式(6)可以看出,光谱与X(N / 2)对称,并且只有前N / 2 1幅度被转换为极坐标。似地,输入样本为真的频谱的虚部中的X(0)和X(N / 2)通常为零。此,这两个振幅通常是分开计算的。于自动计算固件中X(k)的原始代码。任务的汉明窗口或汉宁窗口的固件包括用于将汉明窗口或汉宁窗口应用于输入样本的转换表(形式Q8.7)。
口化有助于防止泄漏。口化可以截断时域中的输入样本。明窗口的等式在路径(8)中示出,而汉宁窗口如等式(9)[8-10]所示。H(N)= 0,54-0,46cos2πnN-1(8)H(N)= 0,5-0,5cos2πnN-1(9)同样,注释这些微程序包括原始代码自动为这些窗口函数生成LUT。试结果为了测试FFT的结果,使用微处理器的通用异步收发器端口。件将幅度X(k)下载到PC。程序包括一个FFT图表,该图表使用Windows应用程序从PC的串行端口读取这些幅度,并使用图形实时绘制计算的幅度。处理器用于采样200kb / s的四个不同的输入电压信号,并且其FFT图像在图2中提供。2使用低功耗微处理器计算频谱结论您当然可以使用无限时间来优化和计算FFT。是,本文档采用基2 FFT,可以显着减少计算FFT所需的加法和乘法。于空间问题,本文不介绍许多提高FFT执行速度的优化方法。如,对于实际输入样本信号,输入样本的虚部通常为零,并且只有频谱的前半部分很大。了这些信息,FFT的第一阶段和最后阶段可以更快地执行(但可能需要编写更多代码)。于低功耗微处理器,本文中提到的FFT算法是一个良好的开端。
本文转载自
恒温阀芯 https://www.wisdom-thermostats.com
