引 言
基于FFT的频谱分析方法可以从含有噪声的信号中提取有用的信息,在仪器仪表的数据处理中具有重要的应用价值。为了保证频谱分析的精度,往往进行多点的FFT运算,例如,1024点、2048点等,这样运算量大、所占内存也大,只有采用DSP(数字信号处理器)才能实现实时的处理。目前,在工业现场普遍使用的两线制、低功耗自动化仪表,由于仪表本身消耗电流必须控制在4 mA之内,所以无法采用DSP等运算能力强的芯片,只能采用低功耗单片机;而低功耗单片机的运算速度和内存容量都很有限,所以,至今未见用其进行多点数FFT运算的报道。为了能够用低功耗单片机实时做FFT运算,以提高自动化仪表信息处理的能力,我们用汇编语言编制FFT程序,在程序中用定点数运算(以下简称定点FFT),采取措施防止数据溢出,保证计算精度,合理分配内存。测试结果表明,我们编制的程序在MSP430F、1611单片机上,完成一次2048点的基于FFT的频谱分析和校正只需要500 ms,精度也达到要求,可以用于以低功耗单片机为核心的仪表中,实时完成信号处理任务。
1 定点运算
1.1 数据表示
在MSP430中使用C语言实现FFT运算,其乘法和加法运算都是默认使用浮点实现的。于MSP430属于定点单片机,因此浮点运算必须由大量的定点指令模拟,这将耗费大量的时间。因此我们针对MSP430的特点,使用汇编语言编制FFT程序,在程序中用定点数运算,并将数据统一使用16位定点数表示。16位定点数中最高位(左边的第1位)作为符号位,剩下的15位用于存放数值。数据格式如图1所示。
设浮点乘法运算的表达式为:float x,y,z;z=xy。假设经过统计(这里“统计”的意思是所有计算中数据范围都在定标范围内)后x的定标值为Qx,y的定标值为Qy,乘积z的定标值为Qz,则z=xy;zq×2-Qz=xq×yq×2-(Qx+Qy);zq=(xqyq)2Qz-(Qx+Qy)。所以,定点表示的乘法为:
为了在以MSP43F1611为处理器的仪表系统上进行基于FFT的功率谱估计,必须先由MSP430F1611的ADC进行采样,而ADC采样得到的数据需要经过定标后才能进行定点计算。定标过程为:ADC的采样电压范围为0~2.5 V,因此,采样过程实际上就是将信号电压除以2.5进行归一化,使得采样得到的数据范围为O~1 V,此时数据就可用Q15表示,即将ADC的12位采样结果寄存器中的数据右移4位保存起来,维持12位精度,转换为Q15定点数表示。由于FFT运算过程中,蝶形输出相对蝶形输入数据被放大了3倍,因此蝶形输出数据范围为一3~+3 V。此时数据如果仍然使用Q15表示,就会发生溢出,故改用Q13表示数据,即将12位ADC数据右移1位。实际上经过处理后,ADC数据精度没有变化,但使用Q13表示数据比用Q12表示数据,其蝶形输出的数据精度高。这是由于定点计算时需要对蝶形输出右移以防止溢出,而使用Q13表示数据比使用Q12表示数据少右移了1位,因此多了1位有效数据。FFT运算过程中使用Q13表示数据,就使得加法乘法运算都可以直接使用定点指令实现,减少了很多判断处理,提高了运算速度。使用Q13表示数据,即最高位(左边的第1位)是符号位,剩下的15位表示数据的大小。表示数据大小的15位中,高2位(左边的第2位和第3位)用来表示数据中的整数部分,在计算中作为保护位;最低的13位(右边的13位)表示数据中的小数部分,如果经过某次蝶形单元运算后,最大值正好被放大3倍,此时数据就由13位扩大到15位,保证数据不会增大到16位,冲走符号位,发生溢出。运算完成后将FFT计算过程中的这一级所有结果都右移2位,就能够使得这一级计算结果的最大值仍然可用13位表示,同时也可将这一级所有蝶形运算输出的数据同时缩小,保证下级计算。表示数值大小的15位数据的数据格式如图2所示。
FFT运算过程使用定点计算,且使用有符号乘法,必须始终保留1位作为符号位;而旋转因子范围为-1~1,因此可定标为Q14,转换为16位定点数。其转换过程为:根据参与FFT运算的数据点数计算出旋转因子的正余弦表,然后将正余弦表乘以16384,即左移14位,最后四舍五人取整。如果使用Q15表示数据,即需要左移15位,那么正余弦表中最大值1,经过上述处理后成为-1,发生溢出。
2 防止溢出,保证精度
FFT中的蝶形运算如图3所示。设蝶形输入为:X1(k),实部为X1(k)r,虚部为X1(k)i;X2(k),实部为X2(k)r,虚部为X2(k)i。设蝶形输出为:X(k),实部为X(k),,虚部为X(k)i;X(k+N/2),实部为X(k+N/2)r,虚部为X(k+N/2)i。则有:
一周热门 更多>