音频信号的FFT分析.docx
《音频信号的FFT分析.docx》由会员分享,可在线阅读,更多相关《音频信号的FFT分析.docx(18页珍藏版)》请在冰豆网上搜索。
![音频信号的FFT分析.docx](https://file1.bdocx.com/fileroot1/2022-10/11/20ae14e2-7db3-4807-910c-f7b8e6c0c268/20ae14e2-7db3-4807-910c-f7b8e6c0c2681.gif)
音频信号的FFT分析
音频信号的FFT分析
一、实验目的:
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、主函数:
voidmain(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;//ThisisneededtowritetoEALLOWprotectedregisters
PieVectTable.TXAINT=&SCITXINTA_ISR;
PieVectTable.RXAINT=&SCIRXINTA_ISR;
PieVectTable.TINT2=&ISRTimer2;
PieVectTable.ADCINT=&ad;
EDIS;//ThisisneededtodisablewritetoEALLOWprotectedregisters
//
/*开中断*/
IER|=M_INT9;//SCI中断
IER|=M_INT1;//ADC中断
EINT;//EnableGlobalinterruptINTM
ERTM;//EnableGlobalrealtimeinterruptDBGM
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{
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();
/*开中断*/
IER|=M_INT14;
EINT;
InitAdc();
break;
caseADSAMPL96K:
//0x1d//采样率为96k
DINT;
/*设置CPU*/
ConfigCpuTimer(&CpuTimer2,150,10);
StartCpuTimer2();
/*开中断*/
IER|=M_INT14;
EINT;
InitAdc96k();
break;
default:
break;
}