DSP课程设计音频信号频谱分析.docx
《DSP课程设计音频信号频谱分析.docx》由会员分享,可在线阅读,更多相关《DSP课程设计音频信号频谱分析.docx(40页珍藏版)》请在冰豆网上搜索。
DSP课程设计音频信号频谱分析
CHANGSHAUNIVERSITYOFSCIENCE&TECHNOLOGY
DSP课程设计
题目:
DSP
——音频信号频谱分析
学生姓名:
学号:
班级
:
10-02
专业:
电子信息工程
指导教师:
肖鸿
实习起止时间:
2013年1月7日至2014年1月18日
音频信号频谱分析
摘要
在当今的数字化时代背景下,DSP已成为通信、计算机、消费类电子产品等领域的基础器件,是集成电路中发展最快的电子产品,并成为电子产品更新换代的决定因素。
DSP芯片已经被广泛地应用于当今技术革命的各个领域,而且DSP技术也正以极快的速度被应用在通信、电子系统、信号处理系统等许多领域中。
本次课程设计介绍了音频信号频谱分析的原理以及其所涉及的硬件结构和软件设计,该设计是基于TMS320C5416DSP芯片的音频信号频谱分析的设计系统的主要功能对语音信号进行采样滤波后FFT变换,并用采集的音频信号进行频谱分析,FFT算法采用TLC320AIC23编写DSP程序实现。
然后通过LCD观察其频谱分布。
关键词:
DSP;音频信号;频谱分析;FFT;LCD
1绪论
1.1选题背景
目前,在微电子技术发展的带动下,DSP芯片的发展日新月异,DSP的功能日益强大,性能价格比不断上升,开发手段不断改进。
DSP芯片已经完全走下了“贵族”的圣坛。
DSP芯片已经在通信与电子系统、信号处理系统、自动控制、雷达、军事、航空航天、医疗、家用电器、电力系统等许多领域中得到了广泛的应用,而且新的应用领域在不断地被发掘。
DSP处理速度快,功耗低,性能好,基于TMS320C5416DSP芯片的语音存储容量大,具有很好的通信音质等特点,因此被广泛应用于很多领域中。
本设计实现的语音分析系统具有如下优点:
1.音频数据占用资源少
2.音质通信级
3.开发难度低
4.语音芯片与DSP接口电路简单
5.体积小
该语音分析系统的设计能够完成语音采集,播放,存储,频谱分析,基本实现了语音分析功能。
随着技术的进步,TMS320C5416DSP与TLV320AIC23的结合的语音编码方案将会有更好的应用前景。
1.2设计要求
DSP课程设计是对《数字信号处理》、《DSP原理及应用》等课程的较全面练习和训练,是实践教学中的一个重要环节。
通过本次课程设计,综合运用数字信号处理、DSP技术课程以及其他有关先修课程的理论和生产实际知识去分析和解决具体问题,并使所学知识得到进一步巩固、深化和发展。
初步培养学生对工程设计的独立工作能力,掌握电子系统设计的一般方法。
通过课程设计完成基本技能的训练,如查阅设计资料和手册、程序的设计、调试等,提高学生分析问题、解决问题的能力。
本题目通过TLC320AIC23采集音频信号(f.max<10kHz),编写DSP的FFT处理程序(自定频谱分辨力),获得幅频特性之后,在点阵液晶中大致显示出幅频图。
并在液晶中用文字显示频率幅值前三的频率值。
DSP与TLC320AIC23接口电路的原理图绘制;
DSP控制TLC320AIC23的程序编写与调试;
TLC320AIC23进行语音模拟量到数字信号的转换,实现声音的采集,在CCS软件中分析信号的幅频特性;
编写DSP的FFT处理程序;
控制点阵液晶,实现绘图功能,将幅频图显示出来;
按要求编写课程设计报告书,正确、完整的阐述设计和实验结果;
在报告中绘制程序的流程图,并文字说明。
2系统总硬件设计方案
2.1硬件系统框图
本系统用DSP芯片TMS320C5416与音频编解码芯片TLV320AIC23实现硬件接口和软件设计,并在此硬件基础上实现语音信号的采集、频谱分析并用LCD显示语音信号的幅频特性曲线。
本系统包括音频采集、DSP对语音信号的处理、LCD显示三部分。
系统结构如图2-1所示:
图2-1
2.2TLV320AIC23芯片简介
TLV320AIC23(以下简称AIC23)是TI推出的一款高性能的立体声音频Codec芯片,内置耳机输出放大器,支持MIC和LINEIN两种输入方式(二选一),且对输入和输出都具有可编程增益调节。
AIC23的模数转换(ADCs)和数模转换(DACs)部件高度集成在芯片内部,采用了先进的Sigma-delta过采样技术,可以在8K到96K的频率范围内提供16bit、20bit、24bit和32bit的采样,ADC和DAC的输出信噪比分别可以达到90dB和100dB。
与此同时,AIC23还具有很低的能耗,回放模式下功率仅为23mW,省电模式下更是小于15uW。
由于具有上述优点,使得AIC23是一款非常理想的音频模拟I/O器件,可以很好的应用在随声听(如CD,MP3……)、录音机等数字音频领域。
2.3TMS320C5416DSP芯片
系统采用的主芯片是TI公司的一款16位定点DSP:
TMS320C5416(以下简称C5416),主要是考虑到C5416片内具有128K*16位的内部RAM,这对提高系统总体性能和集成度有很大的帮助。
另外C5416还具有3个MCBSP多通道缓冲串口,该串口与SPI器件兼容,提供多达128个发送和接收通道。
与其他C54xDSP芯片一样C5416具有功耗低、运算速率高、性价比高的优点。
另外C5416具有如下特点:
当核电压为1.6伏特时的工作频率可达到160MIPS;能访问64K数据存储空间、64KI/O空间、以及192K程序存储空间。
TMS320C5416作为主芯片实现语音信号采集、存储和各模块之间的通信等控制,其主要功能有:
上电自举,读取键盘值并初始化音频编码芯片和液晶屏,控制TLV320AIC23并通过液晶屏显示TLV320AIC23的工作状态,TMS320C5416通过以下引脚与TLV320AIC23连接。
BCLKX0/BCLKX1:
缓冲串口0和1的发送时钟,用于对来自缓冲串行口发送移位寄存器和传送至数据发送引脚的数据进行定时;BDX0/BDX1:
缓冲串行口数据发送端,来自缓冲串行口发送移位寄存器中的数据经该引脚串行发送;BFSX0/BFSX1:
用于发送输出的帧同步脉冲;BDR0:
缓冲串行口数据接收端;BFSR0:
用于接收输入的帧同步脉冲;X2/CLKIN:
由晶振接到内部振荡器的输入引脚。
2.412864LCD
带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64,内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。
可以显示8×4行16×16点阵的汉字.也可完成图形显示.低电压低功耗是其又一显著特点。
由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。
3系统模块设计
3.1语音信号采集模块
从适应语音信号频率、满足实时性、降低成本、简化设计的要求出发,本系统选择TLV320AIC23。
TLV320AIC23是一种高性能的立体声音频Codec芯片作为从设备,主要完成输入语音信号的A/D转换,语音采样编解码及滤波处理,该芯片构成简单,功能强大。
AIC23的管脚和内部结构框图如下:
从上图可以看出,AIC23主要的外围接口分为以下几个部分:
一.数字音频接口:
主要管脚为
BCLK-数字音频接口时钟信号(bit时钟),当AIC23为从模式时(通常情况),该时钟由DSP产生;AIC23为主模式时,该时钟由AIC23产生;
LRCIN-数字音频接口DAC方向的帧信号(I2S模式下word时钟)
LRCOUT-数字音频接口ADC方向的帧信号
DIN-数字音频接口DAC方向的数据输入
DOUT-数字音频接口ADC方向的数据输出
这部分可以和DSP的McBSP(Multi-channelbufferedserialport,多通道缓存串口)无缝连接,唯一要注意的地方是McBSP的接收时钟和AIC23的BCLK都由McBSP的发送时钟提供。
二.麦克风输入接口:
主要管脚为
MICBIAS-提供麦克风偏压,通常是3/4AVDD
MICIN-麦克风输入,由AIC结构框图可以看出放大器默认是5倍增益
连接示意图如下:
三.LINEIN输入接口:
主要管脚为
LLINEIN-左声道LINEIN输入
RLINEIN-右声道LINEIN输入
连接示意图如下:
四.耳机输出接口:
主要管脚为
LHPOUT-左声道耳机放大输出
RHPOUT-右声道耳机放大输出
LOUT-左声道输出
ROUT-右声道输出
从框图可以看出,LOUT和ROUT没有经过内部放大器,所以设计中常用LHPOUT和RHPOUT,连接示意图如下:
五.配置接口:
主要管脚为
SDIN-配置数据输入
SCLK-配置时钟
DSP通过该部分配置AIC23的内部寄存器,每个word的前7bit为寄存器地址,后9bit为寄存器内容。
六.其他:
主要管脚为
MCLK-芯片时钟输入(12.288M、11.2896M、18.432M、16.9344M)
VMID-半压输入,通常由一个10U和一个0.1U电容并联接地
MODE-芯片工作模式选择,Master或者Slave
CS-片选信号(配置时有效)
CLKOUT-时钟输出,可以为MCLK或者MCLK/2(详见寄存器配置)
TLV320AIC23通过以下引脚与TMS320C5416连接。
BCLK:
I2S(一种TLV320AIC23的数字音频接口支持的通用的音频格式)串行数据传输时钟,当TLV320AIC23为主模式时BCLK由TLV320AIC23产生并提供给DSP,频率为主时钟的1/4,当从模式时由DSP产生;DIN:
I2S格式串行数据输入端,送入立体声DAC;DOUT:
I2S格式串行数据输出端,由立体声ADC产生;LRCIN/LRCOUT:
I2S格式数据输入/出帧同步信号;SCLK:
控制端口移位时钟;SDIN:
控制端口串行数据输入,用来传输配置TLV320AIC23内部寄存器数据;/CS:
控制端口输入和地址锁存选择端,在SPI控制模式下,作为数据锁存控制端,在I2C模式下,定义外设的7位地址;XTI/MCLK:
晶体或外部时钟输入端,TLV320AIC23内部时钟由它产生。
TLV320AIC23的工作时钟由外接的一个11.2896M的晶振提供,TLV320AIC23从电路模块电路如图3-1所示。
图3-1TLV320AIC23从电路模块电路
3.2语音信号处理模块
有语音信号采集模块所采集的模块经过A/D转换输入TMS320C5416DSP芯片对其进行FFT运算,得其幅频特性曲线。
FFT算法的实现主要分为三个步骤:
1.实现输入数据的比特反转,输入数据的比特翻转实际上就是将输入数据进行位码倒置,以便在整个运算后的输出序列是一个自然序列。
2.实现N点复数FFT,这一过程的实现分为三个功能块,即第一级蝶形运算、第二级蝶形运算、第三级蝶形运算乃至log2N级蝶形运算。
对于任何一个2的整数幂N=2m,总可以通过M次分解到2点的DFT计算。
通过这样的M次分解,可构成M(log2N)级迭代计算,每级由N/2个蝶形运算组成。
3.功率谱计算,即计算X(k)=
X(n)WNnk,X(k)一般是由实部和虚部组成。
因此计算功率普时,只需将FFT变换好的数据,按照实部和虚部求它们的平方和即可。
设计的子程序流图如图3-2所示;
图3-2FFT运算子程序流图
3.3LCD显示模块
本设计中,采用并行8位数据接口输入方式,把LCD映射到DSP芯片的I/O空间,通过读写I/O地址来控制液晶,TMS320C5416DSP芯片对该地址输出数据,实现LCD的显示控制。
LCD显示子程序流程图如图3-3所示。
图3-3LCD显示子程序流图
4设计结果显示
运用C语言编写设计所需要的程序(见附录),把程序下载到的实验箱中,观察LCD上所显示的幅频特性曲线如图4-1,图4-2所示。
图4-1基波幅频特性曲线
图4-2混频信号幅频特性曲线
上图中所显示的分别是基波和基波三次谐波以及五次谐波所叠加而得信号的幅频特性曲线,并且所给信号是一定的,LCD的只进行一次扫描,并且是点状图。
对程序稍作修改可以实现动态显示,也可以实现用柱形图来表示频谱,如图4-3所示。
图4-3幅频特性柱状图
5设计心得
这两周的课程设计实习周终于结束了,通过两周以来同学和老师的共同努力,我们终于完成了设计要求。
但大家脸上的表情都是欣慰和欢喜的,到底工夫不负有心人。
回想过去两周,这里面的辛苦只有做是课程设计的人才明白,才能体会。
通过这种综合性训练,要学生达到以下的目的和要求:
1.结合课程中所学的理论知识,独立设计方案。
达到学有所用的目的。
2.学会查阅相关手册与资料,通过查阅手册和文献资料,并掌握合理选用的原则,培养独立分析与解决问题的能力。
这次设计我们学到了很多东西,虽然作出来的东西很基础,但是我们加深了对知识的理解和掌握。
作为一名大四的学生,我觉得能做类似的课程设计是十分有意义的。
同时这是一次团队合作开发过程,一次难得的经历。
通过此次设计试验也着重能够学到许多东西。
如果说任何机会都是需要去创造出来的话,那么那个创造者,其实就是你自己。
时间过得真快,转眼间已经有两个星期了,现在回想起来,往事还历历在目。
但是不可否认的却是这些经历将会是我人生当中不可多得的财富和经验的累积。
参考文献
[1]邹彦.DSP原理及应用[M].北京:
电子工业出版社,2005,1.
[2]戴明桢.TMS320C54xDSP结构、原理及应用[M].北京航空航天大学出版社,2001,8.
[3]胡圣尧.DSP原理及应用[M].东南大学出版社,2008.7.
[4]清源科技.TMS320C54xDSP应用程序设计教程[M].机械工业出版社,2004,1.
[5]清源科技.TMS320C54x硬件开发教程[M].机械工业出版社,2003,1.
附录设计程序
//------------------头文件--------------------------------------
//#include"MMRegs.h"
#include"DspRegDefine.h"//VC5402寄存器定义
#include
#include
//---------------------------------------------------------------
/*******************宏定义***************
************************************************************
*/
#defineUCHARunsignedchar
#defineUINT16unsignedint
#defineUINT32unsignedlong
#defineTRUE1
#defineFALSE0
#defineLEN128
//---------------------------------------------------------------
//---------------LCD指令-----------------------------
//基本指令集RE=0
#defineCLEAR0x0001//清除显示
#defineRESAC0x0002//位址歸位
#defineSETPOINT0x0006//進入點設定,游標右移,DDRAM位址計數器(AC)加1
#defineCURSOR0x000F//整體顯示,游標顯示,游標位置反白
#defineMCURSOR0x0014//游標向右移動,AC=AC+1
#defineFUCSET0x0030//功能設定,BITMPU控制界面,基本指令集,默认设置
#defineCGRAMAC0x0040//設定CGRAM位址
#defineDDRAMAC0x0080//設定DDRAM位址
//第一行AC範圍為80H..8FH
//第二行AC範圍為90H..9FH
//第三行AC範圍為A0H..AFH
//第四行AC範圍為B0H..BFH
//#defineREADBFRS=0,RW=1,DB7,DB6,DB5,DB4,DB3,DB2,DB1,DB0
//BFAC6AC5AC4AC3AC2AC1AC0
//讀取忙碌旗標(BF)和位址
//就是读取指令寄存器,PORT8006,BF=1,表示LCD忙碌
//#defineWRITERAMRS=1,RW=0,DB7,DB6,DB5,DB4,DB3,DB2,DB1,DB0
//D7D6D5D4D3D2D1D0
//寫入資料到RAM
//就是写数据寄存器:
PORT8005
//#defineREADRAMRS=1,RW=1,DB7,DB6,DB5,DB4,DB3,DB2,DB1,DB0
//D7D6D5D4D3D2D1D0
//讀取RAM的值
//就是从数据寄存器讀取資料,PORT8007
//擴充指令集RE=1
#defineIDLE0x01//待命模式
#defineCGRAMSET0x02//捲動位址或RAM位址選擇
#defineREVERSE0x04//反白選擇
#defineSLEEP0x0c//脫離睡眠模式
#defineEFUCSET0x66//擴充功能設定,8BITMPU控制界面,為擴充指令集動作,繪圖顯示ON
#defineSISA0x40//設定IRAM位址或捲動位址
#defineSETGDRAM0x80//設定繪圖RAM位址
#defineLength128//FFT的点数
//---------------------------------------------------------
//---------------------------------------------------------
/*端口定义*/
//---------------------------------------------------------
ioportUINT16port8002;
ioportUINT16port8006;//串行时钟地址
ioportUINT16port8007;//串行数据地址
//----------------------------------------------------------
/*全局变量定义*/
//---------------------------------------------------------
UINT16data_buff[LEN];
UCHARdata_buffer[128];
UCHARdata_picture[16*64];
doublepr[128],pi[128],fr[128],fi[128],result[128];
constdoublepp=3.1415926;
UINT16iii=0;
/*
**********************************************************************
***************所使用的函数原型*****************
**********************************************************************
*/
voidcpu_init(void);//初始化CPU
voidDelay(UINT16numbers);//延迟
externvoiddelay_100us(void);//100us延迟--指令之间的延迟
externvoiddelay_1us(void);//1us延迟--时钟之间的延迟
voiddelay_50ms(void);//50ms延迟--复位延迟
voiddelay_20ms(void);//20ms延迟--清屏延迟
voidSendByte(UCHARdat);//串行发送一字节数据
voidSendCMD(UCHARdat);//写指令寄存器
voidSendDat(UCHARdat);//写显示数据或单字节字符
voidDisplay(UCHARx_add,UCHARdat1,UCHARdat2);//写汉字到LCD指定的位置
voidxint2_init(void);//外部中断2初始化子程序
interruptvoidExtInt2();//中断2中断子程序
voidInitlcd(void);//初始化LCd
voiddisplay_lcd();
voidbuffer();
voiddata_switch(unsignedchar*ptr);
voidkfft(doublepr[128],doublepi[128],intn,intk,doublefr[128],doublefi[128],intl,intil);
//-------------------------------------------------------------------
/*
************************************************************************
***********************函数定义******************
************************************************************************
*/
//--------------------------------------------------------------------
//函数名称:
voidcpu_init(void)
//函数说明:
初始化CPU
//输入参数:
无
//输出参数:
无
//--------------------------------------------------------------------
voidxint2_init()//外部中断2初始化子程序
{
*(unsignedint*)IMR=0x0004;//使能int2中断
/*
bit