对信号进行频谱分析是一种常用的获取信号频域信息的方法。本设计采用EP7312嵌入式处理器和UDA1341 模数转换芯片对音频信号进行采集,采用512点的时间抽取基2 FFT算法,对所采集的数据进行处理,在LCD上同时显示时域波形和频谱曲线。本系统具有体积小、成本低、采集速度快等特点,可应用于钢琴调率和环境监测、故障诊断等便携式语音采集、显示和频谱分析的场合。
1 数据采集电路设计
系统由模数转换模块、系统控制与数据处理模块、显示模块和键盘控制模块组成,示意图如图1所示。

图1 基于IIS总线的嵌入式频谱分析系统体系结构
1.1 系统控制模块
本部分的核心是嵌入式处理器EP7312,这是一款属于ARM7系列,适用于对价位和功耗敏感的消费类应用场合的处理器。Ep7312中的DAI接口是一种高速串行的数字音频接口,可以连接与DAI接口兼容的音频设备。接口通过位时钟和帧同步时钟产生64bit帧数据。数字音频数据的接收和发送均采用全双工方式,对应于12个采样深度的接收FIFO和8个采样深度的发送FIFO,FIFO的数据宽度是16bit。系统的外部存储器由4M的NOR Flash(29LV160TE)和16M的SDRAM(hy57v641620hg)组成。
1.2 模数转换模块
模数转换芯片采用的是Philip公司推出的UDA1341,芯片的模数转换(ADCs)部分采用了先进的Sigma-delta过采样技术。芯片的工作电压范围为:2.4~3.6V,由于其功耗特别低,非常适合于MP3、MD播放器等低功耗场合的应用。UDAl341芯片除了提供模数转换功能外,还具有数模转换部件(DACs)、L3接口、IIS(Inter-IC Sound bus)接口和麦克风扬声器接口。
在音频信号采集系统中,L3接口分别连到Ep7312的3个通用数据输出引脚上。Ep7312通过向这个通用端口发送数据来对Uda1341进行初始化。
1.3 IIS总线
IIS又称I2S,是Philip公司提出的串行数字音频总线协议。目前很多音频芯片和MCU都提供了对IIS的支持。Ep7312和UDA1341都支持IIS总线协议。但是由于Ep7312只能接收16bit数据,所以在数据采集中只取了UDA134120bit输出数据中的高16位。图2是UDA1341 IIS总线的时序图,由图中可知数据的最高位总是出现在WS(也就是一帧开始)变化后的第2个BCK脉冲处。这就使得接收端与发送端的有效位数可以不同。如果接收端所能处理的有效位数少于发送端,则可以放弃数据帧中的低位数据;如果接收端能处理的有效位数多于发送端,可以自行补足剩余的位。这种同步机制使得数字音频设备的互连更加方便,而且不会造成数据错位。

图2 UDA1341 中的IIS总线格式
Ep7312的DAI接口中的主时钟(SUB)、位时钟(SSICLK)、左右通道时钟(SSITXFR)、音频数据(SSIRXDA)分别接UDA1341 中的SCLK、BCK、WS、DO。为了保证EP7312的SSIRXDA能正确接收到UDA1341 发送的数据,需要使两者之间的左右通道时钟一致,即把SSITXFR同时作为SSITXFR和UDA1341中的WS输入。
2 系统的软件设计
系统的软件设计包括三部分:启动代码boot loader、驱动程序设计和应用程序设计,其中重点是驱动程序和应用程序的设计。
2.1 启动代码boot loader
boot loader是系统加电后运行的一段代码。虽然对于具体的嵌入式系统而言,不同的系统完成的功能不同,但是boot loader的功能基本相同,完成如下操作:对硬件设备初始化,把代码从Flash加载到Sdram,跳转到Sdram中的代码执行。图3是bootloader的流程图。

图3 bootloader流程图
2.2 Lcd和UDA1341驱动程序的设计
在嵌入式系统中,设备驱动程序隐藏了各种设备的具体细节,维护着设备的正常工作,在用户与设备之间起到了桥梁作用。开发设备驱动程序是开发嵌入式系统的重要工作之一。在该系统中,有两个重要设备的驱动:UDA1341驱动和LCD驱动。
(1) LCD驱动
本设计采用的LCD为320(W)×240(H)像素的彩色STN液晶屏。
在LCD上显示的曲线是通过对采集的离散的数据点用直线连接,以提高显示效果。因此驱动中的一个重要函数是连线函数lcd_vline(); int lcd_vline(unsigned char *fbuf, int x, int y, int y1, int color, int xorm) { //fbuf为缓冲区的初始地址,p是点(x,y)在LCD上对应的地址 p = fbuf + x * 12 / 8 + y * (320 * 3 * 4 / 8); //经过变换使y<=y1 for (; y <= y1; y++){ //根据x的奇偶性设置点的颜色来决定是否要显示该点 ….…………………………….. p += (320 * 3 * 4 / 8); } return 0; }
(2) UDA1341驱动
由于UDA1341实现的是高速数据流的采集,其数据采集速度非常快,为了与其相匹配,采用了快速中断fiq。在申请快速中断的时候需要用到它的首地址和未地址,为了得到这两个地址,中断处理函数必须用汇编来编写。因此,该驱动有两个文件构成:主文件UDA1341.c和中断文件fiq.s。在此着重说明主文件中的设备初始化函数UDA1341 init()和中断函数。
Ep7312按一定的时序向L3接口写数据实现对UDA1341的初始化。L3接口包括L3MODE、L3CLOCK、L3DATA三个脚,分别连接ep7312的port d 端口的第3、4、5位,Ep7312通过向port d端口这三位输出数据实现UDA1341的初始化。UDA1341的L3控制模式按照传送信息的不同分为地址传送模式和数据传送模式,图4是地址传送模式时序图,图5 是数据传送模式的时序图。

图4 地址传送模式时序图

图5 数据传送模式的时序图
UDA1341的驱动中还要包括ep7312中DAI接口的初始化。由于在ep7312中DAI、SSI2、CODEC共用一组硬件资源,需要在程序中通过设置来选择DAI接口。同时,驱动程序还需要设置IIS总线中采样时钟频率、左右通道时钟频率、主时钟频率。
int UDA1341 init (void) { INTMR3 = 0x0; //禁止中断 SYSCON3|=0x0e; // 选择DAI接口 SYSCON3&=0xffffdff; //设置BCLK为WS的64倍 DAI64FSCR=0x240b;//采样频率的选取,这里设置是8kHz PORTDDIR=PORTDDIR&0xc7; //设置D端口为输出 PORTDDAT=PORTDDAT|0x10; //初始化D端口的3、4、5位 (pd3=0;pd4=1;pd5=0) sendadd(0x16);//地址传送,地址为0x16 senddat(0x40);//数据传送,reset所有设置 sendadd(0x16); senddat(0x21);// 设置SCLK为256Fs,数据格式为IIS。 ..…………………………… //注册设备 rc = register_chrdev(UDA1341 _major, "UDA1341 ", &UDA1341 _fops); //申请fiq fiqhandler_start = &dai_fiq_handler_start; fiqhandler_length = &dai_fiq_handler_end - &dai_fiq_handler_start; if (claim_fiq(&UDA1341 _fh)) { printk("UDA1341 _fh: couldn't claim FIQ.\n"); return; } set_fiq_hander(fiqhander_start,fiqhander_length); set_fiq_regs(regs); ……………………………. }
中断处理程序:保存被中断寄存器环境,清中断位,读取FIFO中的数据放入公共数组中,恢复被中断寄存器环境,然后返回被中断程序。 .text .align 2 .global dai_fiq_handler_start .global dai_fiq_handler_end dai_fiq_handler_start: //程序首地址 …………………………………. dai_fiq_handler_end: //程序未地址
2.3 应用程序设计
应用程序设计主要包括数据的采集和存储、数据的处理(FFT)、波形的显示和刷新。
(1) 数据的采集和存储
在该模块中,由于UDA1341对输入信号的交流分量进行采样,在采集到的16位数据中,最高位是符号位,当输入电压为正时,该位为0,当输入信号电压为负时,该位为1。Ep7312 接收UDA1341采集的数据放到FIFO中,当12个字节的FIFO半满时,即FIFO中有6个或者多于6个数据时产生中断,调用快速中断处理程序读取数据放入共用数组中。
对于ep7312可产生8k~48kHz的采样频率,而在对低频段信号进行采样时,如果不采取一定的措施记录这些低频信号的时域特征需要很大的内存空间。例如,在采样频率为8kHz时,被采集的信号频率为15Hz,一个周期的数据量为600个,而在系统的LCD上用256个点是无法把这600个数据表述清楚的。要想更好地显示时域波形,需要提高LCD每行显示的个数或者缩小采样频率。对于要想改变LCD每行的显示个数似乎不太现实;EP731的采样频率最小是8kHz,不能满足需要;在设计中,使用了通过软件算法来实现减小采样频率的方法。具体原理如下:在采样频率一定时,两个采样数据的时间间隔是一定的,时间间隔的大小为采样频率的倒数。可以按一定规律丢弃一些数据来实现采样频率的减小。例如当采样频率为8kHz时,进行连续采样5120个点放到数组data[5120],然后按每16个数据取一个,即取data[512]中的0、15、31……、5103,此时实现的采样频率为500Hz,对于25Hz的信号在500Hz的采样频率下,时域波形能够很好地显示出来。
(2) 数据处理模块
在该模块,采用FFT算法对所采集的数据进行处理,把得到的频谱曲线和时域图同时显示在LCD上。FFT变换的具体实现如下:
首先进行码位倒置,得到FFT运算所需要的输入序列。然后采用3层循环完成全部运算(N点FFT)。
第一层循环:算法讨论中的“级”作为第一层循环,N点FFT运算共有M级,这里 ,用m作循环变量,0 ≤ m < M。
第二层循环:算法讨论中的“组”作为第二层循环,第m级的组数为 ,用j作循环变量, 。
第三层循环:每组里的蝶形单元作为第三层循环,每一组里共有蝶形单元2m个,用i作循环变量,0 ≤ i < 2m。
分析上面循环嵌套可以得出:第三层循环完成个2m个蝶形单元计算;第二层循环使第三层循环进行 次,因此,当第二层循环完成时,共进行 次蝶形单元计算。第一层循环又使第二层循环进行了M次,因此,当第一层循环完成时,共进行了 次蝶形单元计算。
(3) 波形显示和刷新模块
由于要采样的信号频率的未知性,对采样频率的选择设置了两种方式:手动方式和自动模式。对于手动模式,通过键盘人为地设定采样频率,然后进行采样,处理和时域图、频谱图的显示。对于自动模式,首先通过设定采样频率为48kHz,然后采样,通过FFT计算相应的频率大小,根据计算出的频率来重新设定相应的采样频率,在进行采样,显示时域和频域图。例如,当采样信号频率为25Hz时,在采样频率为48kHz时,进行FFT处理后能够得到频率大小为50Hz,然后选择采样频率为8kHz,软件实现采样频率为500Hz,则此时能很好的显示时域波形,并且此时FFT计算的频率为25Hz,精度更高。
下面介绍当选择采样频率为8kHz时,LCD的显示情况。EP7312为LCD的控制提供了良好的支持,显示主要通过LCD控制器完成的。因为要把时域数据和经过FFT处理后的数据同时显示在LCD上,所以把LCD的上半屏分配用于显示时域图,下半屏用于显示频谱图。由于LCD的坐标与显示波形所用坐标的X轴方向相反,并且要把波形显示在特定的区域,所以要对数据进行处理。在LCD右下角的坐标为(0,0),时域和频域的坐标轴原点分别对应(300,27)、(300,137)。采集的音频数据范围为0~0X1FFFF,FFT变换过的数据范围是0~0xFF。显示时域图的数据VAL与其在LCD上Y坐标的关系式为:
Y=(data[2*(256-i)])*25/0xffff+180;
由采样频率可以知道每两个采样点的时间间隔是1/8000 s。LCD上时域图中显示的是512个中的256个采样数据点,每两个数据点取其中一个,在时域图的坐标轴上每十个点显示一个刻度,即每个格代表的时间是1.25ms。
用于显示频谱图的数据NUM与其在LCD上Y坐标的关系式为:
Y=137+NUM*90/0XFF
在频域图上可以显示当前测得的主频率。当前主频率具体计算公式如下:设FFT处理后得到的数组为frequency[512],tempint对应frequency数组中后256个数据中最大值出现的位置,则此时主要频率大小为(512-tempint)*4000/256。当采样频率为8kHz时,可测得的频率范围为16~4000Hz,即256个点等分4000Hz。
图6是当信号发生器产生140Hz的被测信号,系统采样频率为8kHz时,该信号的时域波形及经过变换得到的频谱曲线。从图中可以看到,通过FFT变换可较准确地掌握输入信号的频率特性。
3 结语
本文以嵌入式处理器EP7312和模数转换芯片UDA1341 为核心设计了音频数据采集和FFT处理系统。采用了fiq技术对音频数据流进行实时性的采集,具有速度快,采样频率可灵活设置等特点,可应用于环境监测、故障诊断等便携式语音采集、显示和频谱分析的场合。

图6 在LCD上显示的时域和频域图
|