您的位置 首页 电源

MSP430F1611周期图谱校对FFT

引 言基于FFT的频谱分析方法可以从含有噪声的信号中提取有用的信息,在仪器仪表的数据处理中具有重要的应用价值。为了保证频谱分析的精度,往往进行多

引 言

依据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所示。

1.2 数据定标

定点单片机参加数值运算的数都是16位的整型数,可是运算进程中的数不一定都是整数。那么,定点核算进程中怎么处理小数呢?这其间的要害便是由程序员来确认一个数的小数点处于16位中的哪一位。这便是数的定标。

通过设定小数点在16位数中的不同方位,就可以表明不同巨细和不同精度的小数了。数的定标有Q表明法和S表明法两种。表1列出了一个16位数的16种Q表明、S表明及它们所能表明的十进制数值规模。

从表1中可以看出,相同一个16位数,若小数点设定的方位不同,它所表明的数也就不同。例如,十六进制数2000H=8192,用Q0表明;十六进制数2000H=O.25,用Q15表明;但关于定点运算来说,处理办法是完全相同的。下面扼要介绍怎么运用定点数乘法运算模仿浮点数乘法。

设浮点乘法运算的表达式为: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)。所以,定点表明的乘法为:

1.3 FFT核算进程中的数据定标

为了在以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所示。

1.4 旋转因子数据定标

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。则有:

由式(1)和式(2)可以看出,蝶形输出的实部和虚部是由3个数相加得到的,因而数据或许会扩展3倍。假如核算进程中的数据一直运用定点数表明,跟着级数的添加,就会发生溢出。例如,运用16位定点数表明,其最高位(从左数第1位)为符号位,其表明的数据规模为-32 768~32 767。假如采样得到的数据最大值为4 096,通过两级核算后蝶形最大输出就或许为4096×3×3=36 864,超出了16位定点数的表明规模。

下面介绍确保数据核算精度的办法。

为了进步核算速度,体系中运用定点数法运算FFT,且运用Q13表明数据。蝶形运算中,其蝶形输出的数据的实部和虚部都运用3次加法运算,即每级蝶形运算都或许使数据扩展3倍,因而,蝶形输出的实部和虚部成果都需求右移2位(缩小4倍)以避免溢出。但跟着核算级数的添加,移位将会使数据变得越来越小。例如,128点FFT,一共需求7级运算,数据最终将移位2×7=14位(缩小47=16 384倍),因而当信号幅值不够大时,通过多级运算或许会无法分辩出主信号频率。

设FFT运算成果的主信号频率点的对应实部为r,虚部为i,其幅值为A(ADC的量化值),参加运算的数据点数为N,由FFT功率谱核算的性质可得:

设通过定点FFT运算,也便是运算进程中有移位,则该主信号频率点的模为K,即:

联立式(3)和式(4),得

由于功率谱估量是找出功率谱中的最大值,确认主信号的频率,依据经历,运用定点数运算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时,就分辩不出主信号频率。

为了避免核算成果通过屡次移位后,数据太小无法分辩主信号,体系针对定点FFT运算采纳如下处理:由于FFT定点运算中,一般状况下,为了处理便利,每级蝶形运算中乘法成果都约束在-1~1规模内,即乘法运算的成果一直为小数(只要通过加法运算,数据才有或许超出-1~1规模),因而,通过判别蝶形输出的成果,决议是否移位。当发现超出-1~1规模,就将本级的一切蝶形运算的输出成果右移2位,没有超出就不进行移位。

3 内存分配

由式(3)可知,功率谱预算时需求别的拓荒一段内存空间存储功率谱成果。例如,当进行2048点依据FFT的功率谱剖析时,需用1024个浮点数寄存功率谱核算成果,这将占有很大一段内存。但实践运算中,每个频率点功率,只与其FFT运算成果中的对应频率点的实部、虚部有关,而与其他频率点无关。因而功率谱运算中,可采纳以下进程将寄存实部的空间寄存功率谱:

①实部、虚部数据平方核算。由于MSP430F1611内部集成了硬件乘法器,因而可将乘法器的榜首操作数寄存器(OP1)、第二操作数寄存器(OP2)写入相同的数据完结平方运算。

②平方成果移位。平方成果需求右移13位,运用Q13表明,一同运用16位的暂时变量将平方成果保存。

③功率谱核算成果保存。实部平方成果、虚部平方成果相加后再存人本来的实部单元。

通过上述进程后,就可将本来寄存实部、虚部数据的内存单元再次运用。

定点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。

4 程序完结

算法完结时运用如下办法简化了程序运算进程:

①C程序调用汇编FFT程序,一同为了处理便利将功率谱运算进程也用C言语完结。为了使汇编程序中运用的内存空间与C程序中的内存空间地址不发生抵触,汇编程序中所需的变量都在C文件中界说。

②由于实部、虚部都运用C语音数组来存储,当核算点数许多时,数组将很大。例如,当运算2 048点FFT时,就需界说两个长度为2 048的整形数组,这两段数组不能用仓库部分空间存储,只能用大局数组,由于C言语规则大局变量默许初始化为0,MSP430的IAR编译环境,进入main函数之前的cstart函数中就用cstar_inh_zero函数对大局变量进行初始化,由于界说的数组太长,初始化需求很长时刻,导致程序还没有进入main函数,看门狗就现已复位。因而界说大局数组时,加上_no_init要害字。例如,界说一个数据长度为2 048的不需求初始化的整型数组,运用句子no_init int fft[2048]。

③为节省RAM内存空间,将旋转因子对应的正余弦表制作成表格寄存在ROM空间中,而蝶形运算时可通过查表得到旋转因子后再进行FFT运算。

④由于FFT运算进程中的旋转因子是通过左移14位取整得到的,因而蝶形运算进程中需求乘法运算成果右移14位。MSP430F1611单片机乘法器的成果寄存器,由高16位乘法成果寄存器RESFII、低16位乘法成果寄存器RESLO组成,右移14位操作便是保存高位成果寄存器一切内容和低位成果寄存器中的高两位,因而RESHI、RESLO一同向左移2位,然后保存高位成果寄存器作为乘法成果就可完结右移14位进程。

5 算法测验

为了验证算法的实时性和正确性,通过信号发生器发生规范信号送入所研发的依据MSP430f1611为中心的处理体系,对算法进行了全面的测验。

(1)测验算法运转时刻

测验对2 048点数据进行功率谱估量所需求的总时刻。预先设置MSP430F1611单片机的P5.4引脚为一般I/O,且为输出办法,接着,循环履行FFT运算和功率谱估量程序,且每次开端FFT核算和功率谱预算前,将P5.4输出电平翻转,因而P5.4输出的相邻两次翻转电平的时刻距离便是FFT运算和功率谱估量的总时刻。通过数字存储示波器观测P5.4引脚输出的信号波形,如图4所示。

每次凹凸电平翻转的时刻距离约为500 ms,即对2 048点数据进行功率谱估量一共需求500 ms。

(2)测验算法核算精度

由于FFT运算的最大差错发生在非整周期采样时,所以,挑选这些最大差错点来进行测验。由于走漏差错,信号基频表明为

f0=(k+d)fs/N (7)

式(7)中,k为整数,d为小数(界说d为走漏差错系数)。由于走漏差错不超越频率分辩率的二分之一,所以|d|≤O.5。当d=O时,即为整周期采样状况;当d=O.5时,便是最大非整周期采样的当地。由于所研发的依据FFT的频谱剖析办法将运用于数字涡街流量计,在此,针对气体40口径频率规模为69~1 380 Hz,设定采样频率为3 717.472 199 Hz,数据点数为2 048,挑选不同的k值得到不同的频率信号,由信号发生器发生幅值为60 mV的这些信号,送入两线制涡街流量计信号处理体系低通滤波器前端,然后通过预扩展电路和低通滤波电路后,送入MSP430F1611进行频率估量。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/138205.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部