关 闭

新闻中心

EEPW首页 > 工控自动化 > 设计应用 > FFT在低功率微程序控制器中的应用

FFT在低功率微程序控制器中的应用

作者:时间:2010-08-17来源:网络收藏

2 执行要点
写代码实现DFT不是一件容易的事,因为用低的微处理器实现DFT算法的实际情况是相当复杂的。例如,这些微处理器通常:
(1)有限的内存。选择的微处理器只有2 KB的RAM。从上面叙述可知实现至少需要2N×16 B变量。微处理器不能执行样本点数N大于512的。这是不现实的,因为别的固件同样需要一些字节的RAM。因此在实际执行的过程中,通常将样本点数局限在256点。使用16 B的变量表示每一个值的实部与虚部,这种情况下对于的数据需要1024B的RAM。
(2)有限的速度。尽管低的微处理器具有高达每秒百万条指令的速度,仍然需要一些优化方法来减少在执行FFT过程中所用到的指令。所幸的是在过程中。C编译器包括很多优化的级别设置。小心使用芯片的硬件乘法同样可以使得代码优化到一个可以接受的水平。
(3)没有浮点数功能。所选择的微处理器特别是那些低的微处理器没有浮点数功能。因此所有的计算都需要定点算法。为了表示分数,固件将使用有符号的Q8.7标记。因此固件将假设:O~6 B表示每一数字的分数部分;7~14 B表示每一数字的整数部分;第15字节是这个数字的符号位。
这种形式对于加法和减法是没有影响的,但是对于乘法则必须注意,使所有数据排成Q8.7的形式。例如对于Q8.7的乘法如下:

为了获得比较精确的FFT结果,Q8.7排列形式的一致性同样适用于具有比较大样本点数的FFT。例如,模/数转换器以实部和虚部互补的形式提供8位的符号数。如果输入的是直流电压(+127为有符号的8位样本数),从X(0)中将会完全获得其频谱,以Q8.7标记等于32512。这个值很适合于用16位的符号数表示。

3 固件
下面介绍计算基为2的FFT所需的固件。当从模/数转换器中读取样本数后,存储在数组x_n_re中。这个数组表示x(n)的实部。在执行FFT前,虚部的值初始化为零,存储在数组x_n_im中。当执行完FFT时,频域的幅值将代替原来的样本值,且存储在x_n_re和x_n_im中。
3.1 采集样本
FFT算法假设以固定采样率来采集样本的。尽管这是在本文考虑范围之外,但是如果认真对待采集样本的代码同样会产生问题。例如,不稳定的采样率将会产生错误的FFT结果,所以应该尽量使该情况最小化。对模/数转换器采样的原码每一次循环以及输出结果命令都有可能对采样率产生不稳定性。例如,系统从摸/数转换器中读取8位的有符号数,然后存储在16位的数组变量中。
下面列出了关于从模/数转换器中读取及存储数据的2个伪码算法。第1个记为算法l,将会引起采样率的不稳定。因为负数样本比正的样本需要更多的时间来读取及存储。中断同样不能保证采样代码的健全。
模/数转换器采样(ADC)的伪码:
算法1:不一致的采样率。

3.2 三角法来查寻表格
FFT利用查寻表的方法(LUTs)来代替直接计算正弦与余弦的值。下面叙述中给出了对正弦与余弦的LUTs的声明。固件中的声明包括在中自动产生这些表格的原始代码。LUTs中的正弦与余弦都具有N/2样本,因为旋转因子的下标从0~(N/2)-1变化。
正弦与余弦函数的LUTs:

包括这些LUTs的声明为常量,强迫编译器将这些数据存储在码区而不是数据区。由于微处理器中的RAM的有限性这样做是很重要的。由于LUTs的值必须以Q8.7方式排列,因此与正弦和余弦对应的值应该乘以27。
3.3 位倒置
位倒置(N是已知的)可以在运行中计算,利用1个查寻表格标记或者直接用一个打开的环来写。每1种方法有其各自的大小与执行速度的平衡。本文利用开环直接写的方法来执行位倒置。实际的固件由原码来自动产生这个开环。


评论


相关推荐

技术专区

关闭