引 言
基于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所示。
为了提高计算速度,系统中使用定点数法运算FFT,且使用Q13表示数据。蝶形运算中,其蝶形输出的数据的实部和虚部都使用3次加法运算,即每级蝶形运算都可能使数据扩大3倍,因此,蝶形输出的实部和虚部结果都需要右移2位(缩小4倍)以防止溢出。但随着计算级数的增加,移位将会使数据变得越来越小。例如,128点FFT,总共需要7级运算,数据最终将移位2×7=14位(缩小47=16 384倍),因此当信号幅值不够大时,经过多级运算可能会无法分辨出主信号频率。
设FFT运算结果的主信号频率点的对应实部为r,虚部为i,其幅值为A(ADC的量化值),参与运算的数据点数为N,由FFT功率谱计算的性质可得:
设经过定点FFT运算,也就是运算过程中有移位,则该主信号频率点的模为K,即:
由于功率谱估计是找出功率谱中的最大值,确定主信号的频率,根据经验,使用定点数运算FFT,当实部和虚部的模的平方K2为2时,就无法由功率谱分辨出主信号频率。由式(5)可得:
因此,当K2为2,N为128时,A=128×1.414=180.992=181,即当信号的幅值为18l/4 096×2.538=112 mV,就分辨不出主信号频率。考虑K2为2的极限情况,当A为724,N为512时,即给定信号幅值为724/4 096×2.538=449 mV时,就分辨不出主信号频率。
3 内存分配
由式(3)可知,功率谱估算时需要另外开辟一段内存空间存储功率谱结果。例如,当进行2048点基于FFT的功率谱分析时,需用1024个浮点数存放功率谱计算结果,这将占有很大一段内存。但实际运算中,每个频率点功率,只与其FFT运算结果中的对应频率点的实部、虚部有关,而与其他频率点无关。因此功率谱运算中,可采取以下步骤将存放实部的空间存放功率谱:
①实部、虚部数据平方计算。由于MSP430F1611内部集成了硬件乘法器,因此可将乘法器的第一操作数寄存器(OP1)、第二操作数寄存器(OP2)写入相同的数据实现平方运算。
③功率谱计算结果保存。实部平方结果、虚部平方结果相加后再存人原来的实部单元。
经过上述步骤后,就可将原来存放实部、虚部数据的内存单元再次利用。
定点FFT运算过程中,还可将用来存放采集数据的内存空间,再次用作存放FFT运算过程中的实部数据,另外再开辟同等大小的内存空间,存放虚部数据。例如,对于RAM空间为10 KB的MSP430F16ll来说,使用16位定点数运算FFT,最多能够运算2 048点。因为实部、虚部结果都需4 096 KB,故共需8.192 KB,正好小于10KB;而运算4 096点FFT时,共需16.384 KB,超出10 KB。
一周热门 更多>