音频信号的FFT分析.docx
《音频信号的FFT分析.docx》由会员分享,可在线阅读,更多相关《音频信号的FFT分析.docx(20页珍藏版)》请在冰豆网上搜索。
音频信号的FFT分析
音频信号的FFT分析
一、实验目的:
ﻩ2
二、实验内容:
2
三、实验程序功能与结构说明:
3
四、实验流程图:
3
五、实验步骤:
ﻩ4
1、实验演示:
ﻩ4
六、实验主要程序:
5
1、主函数:
ﻩ5
2、中断程序:
ﻩ12
3、异步串口初始化程序:
13
4、AD初始化:
ﻩ14
七、实验结果:
ﻩ15
1、SEEDDEC2812单元的D3灯由闪烁变成常暗。
ﻩ15
2、可以看到失真比较大的FFT波形,如下图所示:
15
1)、失真信号及频域图:
15
2)、期信号时域和频域曲线图:
16
八、实验心得:
ﻩ16
一、实验目的:
1、熟悉CCS集成开发环
2、熟悉SEED-DTK实验环境
3、加深对DFT算法原理和基本性质的理解
4、学习用FFT对连续信号和时域信号地频谱分析的方法
5、熟悉FFT的算法原理和FFT子程序的算法流程和应用
6、了解DSP处理FFT算法的特殊寻址方式
二、实验内容:
1、DSP的初始化
2、A/D采样
3、FFT的位倒序程序
4、FFT的蝶形运算程序
5、求功率谱的程序
6、串口发送与接收
三、实验程序功能与结构说明:
在数字滤波器实验中,主要包含以下文件:
1、DTK_BPD_FFT.c:
这是实验的主程序,包含了包含定时器中断程序、AD中断程序、FFT参数的初始化,完成与SEED-MMI5402的系统的异步通讯、信号采集与FFT计算。
2、DSP28_Sci.c:
包含量了异步串口初始化程序。
3、DSP28_Adc.c:
包含了AD初始化。
4、DSP28_Defaultlsr.c:
包含了异步串口接收中断服务程序。
5、Cfft32c.asm、cfft32i.asm、rfft32br.asm、rfft32m.asm、rfft32s.asm、rfft32w.asm:
TI源代码。
6、SRAM.cmd:
声明了系统的存贮器配置与程序各段的链接关系。
7、DTK_BPD_FFT.out:
DSP上可执行的程序,即实验程序。
四、实验流程图:
五、实验步骤:
1、实验演示:
在脱机(不接CCS)的情况下,可以首先进行实验的演示。
在实验选项的菜单下,选择FFT实验一项。
先择不使用CCS,确定后,LCD显示屏将显示“程序装载中,请稍侯”,并且用状态条显示程序装载进度,等待装载程序后,SEEDDEC2812单元的D3灯由闪烁变暗。
LCD显示屏将显示“FFT实验装载成功”。
一段时间后,可以看到在LCD上显示FFT前的原始信号与实验后的功率谱图,如下图(a与b)所示:
2、实验的调试:
1)、将DSP仿真器与计算机连接好:
2)、将DSP仿真器的JTAG插关与SEED-DEC2812单元的J1相连接
3)、启动计算机,当计算机启动后,打开SEED-DTKBPD的电源。
观察SEEK-DTK_IO单元的+5V、+3.3V、+15V、-15V的电源指示灯是否均亮,若有不亮的,请断开电源,检查电源。
4)、在实验选项的菜单下,选择定时器实验一项,选择使用CCS。
5)、打开CCS,进入CCS的操作环境。
6)、装入DTK_BPD_FFT.wks调试环境。
7)、进行调度,通过ProbePoints来观察FFT的结果。
六、实验主要程序:
1、主函数:
void main(void)
{
/*初始化系统*/
ﻩInitSysCtrl();
ﻩ/*关中断*/
DINT;
IER=0x0000;
IFR=0x0000;
/*初始化PIE中断*/
InitPieCtrl();
ﻩ/*初始化PIE中断矢量表*/
ﻩInitPieVectTable();
ﻩ
ﻩ/*初始化SCIA寄存器*/
InitSci();
//初始化cputimer
InitCpuTimers();
for(i= 0;i<0x104;i++)
{
ﻩuart[i]=0x5555;
ﻩuarts[i] = 0x5555;
ﻩ}
ﻩfor(i=0;i<32;i++)
{
ﻩﻩsys_statbuff[i]=0;//系统标志buff清0
}
CommandSave=0;
/*设置中断服务程序入口地址*/
EALLOW;//Thisisneeded to writeto EALLOWprotectedregisters
PieVectTable.TXAINT= &SCITXINTA_ISR;
PieVectTable.RXAINT =&SCIRXINTA_ISR;
ﻩPieVectTable.TINT2=&ISRTimer2;
ﻩPieVectTable.ADCINT=&ad;
ﻩEDIS; //Thisisneededtodisable writetoEALLOWprotectedregisters
//
/*开中断*/
ﻩIER|=M_INT9;//SCI中断
IER|= M_INT1;//ADC中断
ﻩ
EINT;//EnableGlobalinterruptINTM
ﻩERTM;ﻩ//EnableGlobalrealtimeinterrupt DBGM
ﻩLED1_ON;
*LED3=0;
ﻩ
ﻩ/*实验主控程序*/
psend = (PuartForDec5416)(&uarts[0]);
precieve = (PuartForDec5416)(&uart[0]);
ﻩpadset=(PAdConfig)(&adset[0]);
/*通知主机,系统准备好*/
ﻩpsend->Length =FRAMLONGTH;
psend->Type=UARTCOMMAND;
ﻩpsend->Data[0]=INITOVER;
ﻩpsend->Mutul=UARTCONT;
uart_send();
ﻩ
for(;;)
ﻩ{ﻩ
if(CommandSave==FFTDATASEND)
ﻩ{
ﻩCommandSave=0;
/*不满buffer的数据*/
ﻩﻩif(datasendlength<= 256)
ﻩ{
ﻩfor(i=0;i<datasendlength;i++)
ﻩﻩ{
ﻩﻩpsend->Data[i] =Ad_data[i+sendcount*256];ﻩﻩ
ﻩﻩ}
ﻩpsend->Length=datasendlength;
ﻩﻩpsend->Type=UARTDATA;
ﻩﻩpsend->Mutul=UARTCONT;
ﻩuart_send();ﻩﻩ
ﻩ}
ﻩelse
ﻩﻩ{
ﻩﻩ/*满buffer数据*/
ﻩfor(k=0; k<256;k++)
ﻩ {
ﻩﻩ ﻩpsend->Data[k] = Ad_data[k+sendcount*256];ﻩ
}
ﻩﻩ psend->Length = 256;
ﻩﻩﻩpsend->Type=UARTDATA;
ﻩﻩﻩﻩpsend->Mutul= UARTMUTL;
uart_send();
datasendlength=datasendlength-256;
ﻩﻩﻩ sendcount++;
ﻩ}
ﻩ}
ﻩuart_s=uart_recive();
ﻩ/*返回值 0:
接受完成 ﻩﻩ */
ﻩ/* 1:
数据未准备好 */
ﻩ/* 3:
较验出错 */
if(uart_s==1)
ﻩﻩ{
ﻩﻩcontinue;
ﻩ}ﻩﻩ
ﻩ/*数据较验出错*/
ﻩﻩif(uart_s==3)
ﻩ{
ﻩfor(i=0;i<0x104;i++)
ﻩﻩ{
ﻩﻩuart[i] = 0x5555;ﻩﻩﻩ
ﻩ}
ﻩﻩ/*通知主机程序通讯出错,准备重发*/
ﻩﻩpsend->Length = FRAMLONGTH;
ﻩpsend->Type=UARTCOMMAND;
ﻩpsend->Data[0]=RECIEVEERROR;
ﻩﻩpsend->Mutul = UARTCONT;
ﻩuart_send();
ﻩﻩ
ﻩﻩcontinue;ﻩ
}
ﻩ/*接收完成*/
ﻩﻩif(uart_s==0)
ﻩ{
ﻩ/*不是命令帧*/
ﻩif(precieve->Type!
=UARTCOMMAND)
ﻩﻩ{
ﻩﻩ/*无效命令*/
ﻩﻩpsend->Length=FRAMLONGTH;
ﻩpsend->Type =UARTCOMMAND;
ﻩﻩﻩpsend->Data[0]= COMMANDNODO;
ﻩpsend->Mutul=UARTCONT;
ﻩﻩuart_send();
ﻩﻩﻩprecieve->Type =UARTCOMMAND;ﻩ
ﻩﻩcontinue;
ﻩ}
}
ﻩﻩ
ﻩﻩﻩ
ﻩ
/*接收从主机的数据*/
ﻩﻩprecieve =(PuartForDec5416)(&uart[0]);
switch(precieve->Data[0])
ﻩ{
ﻩﻩ/*FFT设置*/
ﻩﻩcaseFFTSET:
ﻩﻩﻩfor(i=0;i<3;i++)
ﻩ{
ﻩadset[i]=precieve->Data[i+1];
ﻩﻩ}
ﻩﻩﻩﻩ/*设置数据发送长度*/
ﻩdatasendlong = padset->SampleLong;
ﻩﻩdatasendlength=3*datasendlong/2;ﻩﻩﻩ
ﻩﻩprecieve->Data[0]= 0;
ﻩﻩbreak;
/*启动AD采样和fft计算*/
ﻩﻩﻩcaseFFTSTART:
ﻩﻩﻩconvcount=0;
ﻩadconvover=0;
ﻩsendcount=0;
ﻩconvfirstN=1000;ﻩﻩﻩ
ﻩ/*AD采样率*/
ﻩﻩswitch(padset->SampleRate)
ﻩﻩ{
ﻩcaseADSAMPL8K:
//0xdﻩ//采样率为8k
ﻩDINT;
ﻩﻩﻩﻩ/*设置CPU*/
ﻩﻩﻩﻩConfigCpuTimer(&CpuTimer2, 150, 125);ﻩ
ﻩﻩﻩﻩﻩStartCpuTimer2();
ﻩﻩ/*开中断*/
ﻩIER|= M_INT14;
ﻩﻩﻩEINT;
ﻩﻩInitAdc();
ﻩﻩﻩﻩbreak;
ﻩcaseADSAMPL44K:
// 0x23ﻩﻩ//采样率为44k
ﻩDINT;
ﻩﻩﻩ/*设置CPU*/
ﻩﻩﻩConfigCpuTimer(&CpuTimer2,150,22);ﻩ
ﻩﻩﻩStartCpuTimer2();
ﻩﻩ