1、题目名称:音频信号分析仪(A 题)华南理工大学电子与信息学院 参赛队员:陈旭 张洋 林士明摘要: 本音频信号分析仪由 32 位 MCU 为主控制器,通过 AD 转换,对音频信号进行采样,把连续信号离散化,然后通过 FFT 快速傅氏变换运算,在时域和频域对音频信号各个频率分量以及功率等指标进行分析和处理,然后通过高分辨率的 LCD 对信号的频谱进行显示。该系统能够精确测量的音频信号频率范围为 20Hz-10KHz,其幅度范围为5mVpp-5Vpp,分辨力分为 20Hz 和 100Hz 两档。测量功率精确度高达 1%,并且能够准确的测量周期信号的周期,是理想的音频信号分析仪的解决方案。关键词: F
2、FT MCU 频谱 功率Abstract: The audio signal analyzer is based on a 32-bit MCU controller, through the AD converter for audio signal sampling, the continuous signal discrete, and then through the FFT fast Fourier transform computing, in the time domain and frequency domain of the various audio frequency s
3、ignal weight and power, and other indicators for analysis and processing, and then through the high-resolution LCD display signals in the spectrum. The system can accurately measure the audio signal frequency range of 20 Hz-10KHz, the range of 5-5Vpp mVpp, resolution of 20 Hz and 100 Hz corresponden
4、t. Power measurement accuracy up to 1%, and be able to accurately measuring the periodic signal cycle is the ideal audio signal analyzer solution.Keyword: FFT MCU Spectrum Power1 方案论证与比较 .31.1 采样方法方案论证 31.2 处理器的选择方案论证 31.3 周期性判别与测量方法方案论证 32 系统设计 .42.1 总体设 计 42.2 单元电路设计 52.2.1 前级阻抗匹配和放大电路设计 .52.2.2 A
5、D 转换及控制模块电路设计 .62.2.3 功率谱测量单元电路设计 .63 软件设计 .74 系统 测试 .85 结论 .9参考文献: .9附录: .9附 1:元器件明细表: 9附 2:仪器设备清单 9附 3:电路图图纸 10附 4:程序清单 111 方案论证与比较1.1 采样方法比较与选择方案一、用 DDS 芯片配合 FIFO 对信号进行采集,通过 DDS 集成芯片产生一个频率稳定度和精度相当高的信号作为 FIFO 的时钟,然后由 FIFO 对 A/D 转换的结果进行采集和存储,最后送 MCU 处理。方案二、直接由 32 位 MCU 的定时中断进行信号的采集,然后对信号分析。由于 32 位
6、MCU -LPC2148 是 60M 的单指令周期处理器,所以其定时精确度为 16.7ns,已经远远可以实现我们的 40.96KHz 的采样率,而且控制方便成本便宜,所以我们选择由MCU 直接采样。1.2 处理器的比较与选择系统方案一:基于 ARMST710 的专用芯片的体统方案。基于 ARM ST710 音频频谱分析仪系统原理图如下信号输入该方案采用 DSP 专用芯片 ARM ST710 进行控制和 FFT 计算,速度快,且具有波形存储和处理后的波形可以重放功能。还配有输出接口与示波器销量。可以从时域和频域观察波形,非常直观、实用。系统方案四:基于单片机 C8051F060+FPGA 构成信
7、号分析仪,该系统原理方框图如图所示。单片机 C8051F060 独立完成 4096 点 FFT 运算和信号的失真度分析。虽然这种方案在速度上不及采用专用 DPS 芯片快,但采用优化的 FFT,并将优化后的 FFT 再单片机内做实验,利用外扩的 128KB RAM 运算 4096 点 FFT 计算幅度谱,利用 FPGA 进行测频和控制。其运算时间也不超过 4S。能够达到设计要求。LCD接口LCDSRAMFLASHSDCardSDCard接口USB接口ADC DACMCU ARMSTTIO信号输入整形信号最终方案选择:由于快速傅立叶变换 FFT 算法设计大量的浮点运算,由于一个浮点占用四个字节,所
8、以要占用大量的内存,同时浮点运算时间很慢,所以采用普通的 8 位 MCU 一般难以在一定的时间内完成运算,所以综合内存的大小以及运算速度,我们采用 Philips 的 32 位的单片机 LPC2148,它拥有 32K 的 RAM,并且时钟频率高达 60M,所以对于浮点运算不论是在速度上还是在内存上都能够很快的处理。1.3 周期性判别与测量方法比较与选择对于普通的音频信号,频率分量一般较多,它不具有周期性。测量周期可以在时域测量也可以在频域测量,但是由于频域测量周期性要求某些频率点具有由规律的零点或接近零点出现,所以对于较为复杂的,频率分量较多且功率分布较均匀且低信号就无法正确的分析其周期性。而
9、在时域分析信号,我们可以先对信号进行处理,然后假定具有周期性,然后测出频率,把采样的信号进行周期均值法和定点分析法的分析后即可以判别出其周期性。综上,我们选择信号在时域进行周期性分析和周期性测量。对于一般的音频信号,其时域变化是不规则的,所以没有周期性。而对于单频信号或者由多个具有最小公倍数的频率组合的多频信号具有周期性。这样我们可以在频域对信号的频谱进行定量分析,从而得出其周期性。而我们通过先假设信号是周期的,然后算出频率值,然后在用此频率对信号进行采样,采取连续两个周期的信号,对其值进行逐次比较和平均比较,若相差太远,则认为不是周期信号,若相差不远(约 5%) ,则可以认为是周期信号。FP
10、GA点阵液晶字符液晶测频电路信号预处理128KB RAMC8051F060PC 键盘DMAADC02 系统设计2.1 总体设计音频信号经过一个由运放和电阻组成的 50 Ohm 阻抗匹配网络后,经由量程控制模块进行处理,若是一般的 100mV-5V 的电压,我们选择直通,也就是说信号没有衰减或者放大,但是若信号太小,12 位的 A/D 转换器在 2.5V 参考电压的条件下的最小分辨力为 1mV左右,所以如果选择直通的话其离散化处理的误差将会很大,所以若是采集到信号后发现其值太小,在 20mV-250mV 之间的话,我们可以将其认定为小信号,从而选择信号经过20 倍增益的放大器后再进行 A/D 采
11、样。经过 12 位 A/D 转换器 ADS7819 转换后的数字信号经由 32 位 MCU 进行 FFT 变换和处理,分析其频谱特性和各个频率点的功率值,然后将这些值送由 Atmega16 进行显示。信号由 32 位 MCU 分析后判断其周期性,然后由 Atmegal6 进行测量,然后进行显示。总体设计框架图2.2 单元电路设计2.2.1 前级阻抗匹配和放大电路设计信号输入后通过 R5,R6 两个 100Ohm 的电阻和一个高精度仪表运放 AD620 实现跟随作用,由于理想运放的输入阻抗为无穷大,所以输入阻抗即为:R5/R6=50Ohm,阻抗匹配后的通过继电器控制是对信号直接送给 AD 转换还
12、是放大 20 倍后再进行 AD 转换。在这道题目里,需要检测各频率分量及其功率,并且要测量正弦信号的失真度,这就要求在对小信号进行放大时,要尽可能少的引入信号的放大失真。正弦信号的理论计算失真度为零,对引入的信号失真非常灵敏,所以对信号的放大,运放的选择是个重点。我们选择的运放是 TI 公司的低噪声、低失真的仪表放大器 INA217,其失真度在频率为 1KHz,增益为 20dB(100 倍放大)时仅为 0.004%,其内部原理图如下图所示。其中放大器 A1 的输出电压计算公式为OUT1=1+(R1/RG)*VIN+同理, OUT2=1+(R2/RG)*VIN-R3、R4、R5、R6 及 A3
13、构成减法器,最后得到输出公式VOUT=(VIN2-VIN1)*1+(R1+R2)/RGR1=R2=5K,取 RG=526,从而放大倍数为 20。2.2.2 AD 转换及控制模块电路设计采用 12 位 AD 转换器 ADS7819 进行转换,将转换的数据送 32 位控制器进行处理。2.2.3 功率谱测量功率谱测量主要通过对音频信号进行离散化处理,通过 FFT 运算,求出信号各个离散频率点的功率值,然后得到离散化的功率谱。由于题目要求频率分辨力为 100Hz 和 20Hz 两个档,这说明在进行 FFT 运算前必须通过调整采样频率(fK)和采样的点数(N),使其基波频率 f 为 100Hz 和 20
14、Hz。根据频率分辨率与采样频率和采样点数的关系:f=fk/N;可以得知, fk=N*f;又根据采样定理,采样频率 fk 必须不小于信号频率 fm 的 2 倍,即:fk=2fm;题目要求的最大频率为 10KHz,所以采样频率必须大于 20KHz,考虑到 FFT 运算在 2的次数的点数时的效率较高,所以我们在 20Hz 档时选择 40.96KHz 采样率,采集 2048 个点,而在 100 档时我们选择 51.2KHz 采样率,采集 512 个点。通过 FFT 分析出不同的频率点对应的功率后,就可以画出其功率谱,并可以在频域计算其总功率。3 软件设计主控制芯片为 LPC2148,测量周期为 Atm
15、ega16 实现,由于处理器速度较快,所以采用 c 语言编程方便简单.软件流程图如下:主流程图 周期性分析和测量流程图4 系统测试4.1 总功率测量(室温条件下)输入信号频率 幅度 测量时域总功率(w)测量频域总功率(w)理论值 估算误差100Hz 1 Vpp 0.127 0.129 0.125 1.2% 正弦波 1KH 1 Vpp 0.126 0.129 0.125 1.3%0.783 0.761 X 5%音频信号20Hz-10KHz20mVpp-5Vpp1.803 1.777 X 5%结果分析: 由于实验室提供的能够模仿音频信号的且能方便测量的信号只有正弦信号,所以我们用一款比较差点的信号
16、发生器产生信号,然后进行测量,发现误差不达,在+-5%以内。我们以音频信号进行测量,由于其实际值无法测量,所以我们只能根据时域和频域以及估计其误差,都在 5%以内。4.2 单个频率分量测量(室温条件下)输入信号 频率 幅度 最大功率频点最大功率频点功率次大功率频点次大功率频点功率正弦波 500Hz 100mVpp 500Hz 1.20mw 520Hz 0.04mW正弦波 5KHz 1Vpp 5KHz 120mw 5.02KHz 3.56mw音频信号 20Hz-10K X 880Hz 23mw 600Hz 4.3mw结果分析:我们首先以理论上单一频率的正弦波为输入信号,在理想状况下,其频谱只在正
17、弦波频率上有值,而由于有干扰,所以在其他频点也有很小的功率。音频信号由于有多个频点,所以没有一定的规律性。由于音频信号波动较大,没有一定的规律,且实验室没有专门配置测量仪器,所以我们只好以正弦波和三角波作为信号进行定量分析测量,以及对音频信号进行定性的分析和测量。我们发现其数字和用电脑模拟的结果符合得很近。5 结论由于系统架构设计合理,功能电路实现较好,系统性能优良、稳定,较好地达到了题目要求的各项指标。参考文献:信号与系统 ,ALAN V.OPPENHEIM 著,西安:西安交通大学出版社,1997 年;数字图像处理学 ,元秋奇著,北京:电子工业出版社,2000 年;模拟电子线路基础 ,吴运昌
18、著,广州:华南理工大学出版社,2004 年;数字电子技术基础 ,阎石著,北京:高等教育出版社,1997 年;数据结构与算法 ,张晓丽等著,北京:机械工业出版社,2002 年;ARMint x11=0;float TR,TI,temp;float QQ;/位倒置/for(i=0;i0) b=b*2;i-; for(j=0;j0) p=p*2; i-;p=p*j;for(k=j;k0) page-;delay_nms(8000000); /上翻页if(key=1) LCD_ClearScreen(); LCD_WriteChineseString(font3,2,10,0);LCD_WriteCh
19、ineseString(font4,2,60,0);i=page*4+1;p3510(Rei,0,15); print3510(Imi*mode,50,15);p3510(Rei+1,0,26); print3510(Imi+1*mode,50,25);p3510(Rei+2,0,38); print3510(Imi+2*mode,50,35);p3510(Rei+3,0,50); print3510(Imi+3*mode,50,50); page+;if(page=SampleNum/4) page=0;delay_nms(8000000); /下翻页 /失真度计算/void distort
20、ion(void)LCD_ClearScreen(); LCD_WriteChineseString(font6,3,10,20);unsigned int key;int fr;while(1)/获取频率/log_2_N=11;SampleNum=SampleTablog_2_N;reset_timer(0);init_timer0(40960);New_Flag=0;enable_timer(0);/等待采样完成/while(!FFT_Flag); disable_timer(0); /关定时器 0/FFT 运算/FFT(Re,Im,log_2_N);/频域功率 /for(i=1;iSam
21、pleNum/2;i+) Rei=Rei*Rei;Rei=Rei/2;/总功率/Fp=0;for(i=1;iSampleNum/2;i+) Fp+=Rei;sort(fr=1000000/fre;if(Tflag) LCD_WriteChineseString(font7,1,50,20);LCD_WriteEnglishString(“ “,0,38);print3510(fr,10,38);LCD_WriteEnglishString(“US“,58,38);else LCD_WriteEnglishString(“ “,0,38);LCD_WriteChineseString(font8
22、,1,50,20);/按键扫描/key=getkey();if(key!=0xFF)if(key=1) SystemState=fft_mode;mode=20;break; /返回if(key=2) SystemState=fft_mode;mode=100;break; /返回/按键扫描/unsigned char getkey(void)if(IO1PIN_bit.P1_21=0) delay_nms(200000);if(IO1PIN_bit.P1_21=0) return 1;if(IO1PIN_bit.P1_22=0) delay_nms(2000000);if(IO1PIN_bi
23、t.P1_22=0) return 2;if(IO1PIN_bit.P1_23=0) delay_nms(2000000);if(IO1PIN_bit.P1_23=0) return 3;if(IO1PIN_bit.P1_24=0) delay_nms(2000000);if(IO1PIN_bit.P1_24=0) return 4;return 0xFF;/排序处理 /void sort(float *a,float *b,int n) /a 为待排序的量,b 为起位置int i,j,temp;for(i=0;in;i+) bi=i+1;for(j=0;j=n-1;j+) for (i=0;in-j;i+) if (aiai+1) temp=ai; ai=ai+1; ai+1=temp;temp=bi; bi=bi+1; bi+1=temp; /显示/void p3510(int v,int x,int y)int x0;x0=v*157;x0=x0/100000000;LCD_WriteEnglishChar(x0+0,x,y);x0=v*157;x0=x0/100;x0+=1000000;print3510(x0,x+6,y);LCD_WriteEnglishChar(.,x+6,y);