dsp实习报告Word文档下载推荐.docx
《dsp实习报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《dsp实习报告Word文档下载推荐.docx(28页珍藏版)》请在冰豆网上搜索。
5.3实验中的部分程序讲解12
6.在CCS3.3环境下调试。
编译,下载源程序17
7.实习心得21
8.参考文献22
基于DSP的实时FFT的实现
1.设计目的
1.加深对DFT算法原理和基本性质的理解;
2.熟悉FFT的算法原理和FFT子程序的算法流程和应用;
3.学习用FFT对连续信号和时域信号进行频谱分析的方法;
4.学习DSP中FFT的设计和编程思想;
5.学习使用CCS的波形观察窗口观察信号波形和频谱情况。
2.设计要求及方案
在DSP中用C语言进行编程,实现FFT运算,对输入输出信号进行频谱分析。
方案一:
基于DSPLIB库函数的FFT实现,DSPLIB库函数提供的FFT运算程序全部由汇编语言编写,充分发挥DSP的硬件特性。
运算速度很快。
DSPLIB函数库提供FFT运算为基2时间抽取算法。
码位倒序的作用是使在时域采样的按自然序列排列的N点输人数据的排列顺序发生变化,然后作为
FFT运算的输入数据,以使FFT运算结果按自然序列排列。
方案二:
基于C语言的FFT实现,上面讲了使用CCS中的库函数实现FFT运算,我们还可以可以使用C语言实现FFT预算。
由于C语言不支持复数预算,所以所编写的C程序是将复数的转换为实数运算。
其程序也可以实现基—2时间抽取运算。
综合考虑,我们选择方案一,因为方案一的实现较简单且同样可以达到比较好的实验效果,DSPLIB库中FFT的算法经典,所消耗的时间最少。
3.硬件设计过程
3.1设计原理
快速傅里叶变换
傅里叶变换是一种将信号从时域变换到频域的变换形式,是信号处理的重要分析工具。
离散傅里叶变换(DFT)是傅里叶变换在离散系统中的表示形式。
但是DFT的计算量非常大,FFT就是DFT的一种快速算法,FFT将DFT的N2步运算减少至(N/2)log2N步。
离散信号x(n)的傅里叶变换可以表示为
,
式中的WN称为蝶形因子,利用它的对称性和周期性可以减少运算量。
一般而言,FFT算法分为时间抽取(DIT)和频率抽取(DIF)两大类。
两者的区别是蝶形因子出现的位置不同,前者中蝶形因子出现在输入端,后者中出现在输出端。
本实验以时间抽取方法为例。
时间抽取FFT是将N点输入序列x(n)按照偶数项和奇数项分解为偶序列和奇序列。
偶序列为:
x(0),x
(2),x(4),…,x(N-2);
奇序列为:
x
(1),x(3),x(5),…,x(N-1)。
这样x(n)的N点DFT可写成:
考虑到WN的性质,即
因此有:
或者写成:
由于Y(k)与Z(k)的周期为N/2,并且利用WN的对称性和周期性,即:
可得:
对Y(k)与Z(k)继续以同样的方式分解下去,就可以使一个N点的DFT最终用一组2点的DFT来计算。
在基数为2的FFT中,总共有log2(N)级运算,每级中有N/2个2点FFT蝶形运算。
单个蝶形运算示意图如下:
以N=8为例,时间抽取FFT的信号流图如下:
从上图可以看出,输出序列是按自然顺序排列的,而输入序列的顺序则是“比特反转”方式排列的。
也就是说,将序号用二进制表示,然后将二进制数以相反方向排列,再以这个数作为序号。
如011变成110,那么第3个输入值和第六个输入值就要交换位置了。
本实验中采用了一种比较常用有效的方法完成这一步工作__雷德算法。
3.2硬件设计步骤
3.2.1McBSP多通道缓冲串行口的设置
3.21McBSP的功能结构图
图一
MCBSP是DSP芯片的标准内部外设,可以提供收发双向串行通信,接收双缓冲,改善三缓冲寄存器,有独立的收发时钟,帧同步信号,可直接与多种格式装置连接,如AC97,I2S和SPI等。
最多可发送/接收128个通道数据。
数字字长从8、12、16、20、24、32位可变。
可提供A律或u律压缩,其时钟、帧同步极性、频率可编程。
本设计中是使用它进行串口通讯,把AIC23的处理的语音数据发送到电脑和DSP控制器。
VC5402具有两个McBSPS,每个都有如图一所示的结构。
VC5510具有三个McBSPS,结构大致一样。
VC5402的McBSP又以下特殊性能
①全双工通信模式
②双缓冲数据寄存器,允许连续的数据流传输
③独立的帧信号和时钟信号来驱动接收和发送模块
④可以直接与以下接口连接:
⑤T1/E1帧发生器
⑥MVIP开关兼容设备以及ST-BUS总线设备
⑦IOM-2设备
⑧AC97设备
⑨串行外设接口(SPI)
⑩最多128通道的发送和接收,多数据位宽选择:
8位、12位、16位、20位、24位和32位
其相关寄存器的简要说明
RSR、RBR和DRR为三组接收缓冲寄存器,XSR和DXR是两组发送缓冲寄存器,compand为语音的A律、u律压缩扩展器,其它的为MCBSP控制寄存器。
DR和DX分别为MCBSP的数据接收、发送端,CLKX,CLKR分别是MCBSP的发送时钟与接收时钟,FSX,FSR分别是MCBSP的发送、接收帧同步,CLKS是系统时钟,XINT,RINT是CPU的发送、接收完毕中断。
3.2.2McBSP的设置步骤
McBSP在使用过程中,正确配置McBSP接口可以分为以下几个步骤:
①复位McBSP接口的接收和发送单元
②配置McBSP接口的工作模式
③配置McBSP接口相关控制信号的频率、相对延迟、时钟源等
④设定McBSP接收和发送数据的位宽
⑤清空McBSP接口的接收和发送相关寄存器
⑥根据实际需要编写McBSP接收、发送或其它中断处理函数
⑦在中断向量表中添加相应的跳转指令
⑧清零相应的中断标志寄存器
⑨使能相应的中断位和全局中断
⑩启动McBSP
3.2.3AIC23的设置
3.2.3.1音频模块AIC23结构
AIC23是德州仪器公司(TI)生产的高性能音频A/D、D/A放大电路。
外围接口工作电压为3.3V,内核工作电压是1.5V,在48kHz采样率条件下,A/D变换信噪比可达100dB,其控制口可由硬件设置为同步置口(SP2)模式或两线制(2-wire),音频数据接口可采用I2S格式、DSP格式、USB格式及最高位或最低位数据调整格式。
音频数据字长可设置为16、24、20、32位,输出可直接驱动耳机,在32Ω条件下输出可达30mW。
内置前置放大器及偏置电路可直接连接麦克风。
该芯片功耗很低,在休眠(power-down)状态下,功耗小于15uW。
AIC23的内部结构框图如图二所示
图二
AIC23有两个数字接口,其一是由CS(控制信号)、SDIN(信号数据输入)、SCLK(信号时钟)和MODE(模式)构成的数字控制接口,通过它将芯片的控制字写入AIC23,从而控制AIC23功能;
另一组是由LRCIN(左右声控制输入)、DIN(数据输入)、LROUT(左右声输出)、DOUT(数据输出)和BLCK(时钟)组成的数字音频接口,AIC23的数字音频信号从这个接口接收或发出。
在模拟信号接口方面,AIC23有四组,一是由RLINEIN(右声线入)和LLINEIN(左声线入)组成的线路输入接口,其内部带可控增益放大器及静音电路,其最大输入模拟信号为1VRMS;
第二组是由MICIN(麦克输入)构成的MIC接口,内部包含1个5倍固定增益放大器及0~20dB可变增益放大器,该信号与线路输入信号(LINEIN)通过内部模拟开关选择送往A/D变换电路;
第三组是由RHPOUT(右声话音输出)和LHPOUT(左声话音输出)组成的耳机驱动电路,在电源电压3.3V、负载32Ω的条件下输出功率为30mW,音量从+6dB~-73dB可控,其输入信号来自内部的D/A变换电路同时混合MIC信号,也可放大线路输入信号(即Bypass功能);
第四组是模拟接口ROUT(右声输出)和LOUT(左声输出),其信号来源于AIC23内部D/A变换电路,标称输出信号为1V有效值(1Vrms)。
AIC23内部还包含两个A/D、D/A变换器,其字长可以是16、20、24、32,同时AIC23内部的时钟可以通过XTI(晶振时钟输入)、XTO(时钟输出)和外接晶振构成时钟,也可以由外部直接输入时钟信号。
AIC23内部还包含有MIC偏置电路,使用外接MIC无需外置偏置电路。
由上面可见AIC23是一种高性能的音频录放接口芯片。
AIC23与DSP的接口
图三是AIC23与VC5402的接口连接
图三
AIC23的通讯方式
AIC23的外部硬件接口分为模拟口和数字口。
设计人员需要一种办法来详细说明功率意图,模拟口是用来输入输出音频信号的,最后将2个放大后的信号通过SAR(逐次逼近模数转换器)式的ADC采样算出ISENSOR的值。
支持线路输入和麦克风输入;
它能够支持几乎所有的工作平台和目标处理器,有两组数字接口,然后进行编译和调试。
其一是由/CS、SDIN、SCLK和MODE构成的数字控制接口。
如与U盘直接通信等设备是完全有必要在原来设备的基础上扩展USB主机端口。
AIC23是一块可编程的音频芯片,在彩色LCD上,通过数字控制口将芯片的控制字写入AIC23内部的寄存器,而45nm器件模板成本会超过3百万美元。
如采样率设置,大大提高了系统的可靠性和安全性。
工作方式设置等,这些工具需要对信号进行适当缓冲,共有12个寄存器。
AIC23通过数字音频口与DSP的McBSP0完成数据的通信,在本设计中,DSP做主机,I/O和时钟电路占全部活动功耗的1/3,AIC23做从机。
1系统结构框图及视频数据采集原理视频数据采集系统结构如图1所示。
主机提供发送时钟信号BCLKX0和发送帧同步信号BFSX0。
USB设备端口作为与PC机通信的接口。
在这种工作方式下,把多媒体资料在各式各样的家庭网络媒体终端上展示出来,接收时种信号BCLKR0和接收帧同步信号BFSR0实际上都是由主机提供的。
以下称由BF537的MAC控制器与物理层接口芯片LAN8187构成的以太网通道为主网络通道。
AIC23软件实现部分
将McBSP配置为SPI总线接口,其中McBSP0以SPI接口方式与AIC23的控制接口相连,设定为主动模式,负责对AIC23内部寄存器进行配置,产生位同步信号,帧同步信号,发送16bit单帧,不接受数据,McBSP1负责将DSP产生的数字序列传送给AIC23McBSP1设定为从动模式,为同步,帧同步信号由AIC23产生。
其流程图如图四所示。
图四
4.FFT软件设计的实现
4.1FFT算法基本原理
有限长序列x(n)及其频域表示X(k)可由以下离散傅立叶变换得出
(2.1)称为离散傅立叶正变换,式(2.2)称为离散傅立叶反变换,x(n)与
x(k)构成了离散傅立叶变换对。
根据上述公式,计算一个X(k),需要N次复数乘法和N-1次复数加法,而计算全部x(k)(0≤k≤N一1),共需要N2次复数乘法和N(N-1)次复数加法。
实现一次复数乘法需要四次实数乘法和两次实数加法,一次复数加法需要两次实数加法,因此直接计算全部x(k)共需要4N2次实数乘法和2N(2N-1)次实数加法。
当N较大时,对实时信号处理来说,对处理器计算速度有十分苛刻的要求,于是如何减少计算离散傅里叶变换运算量的问题变得至关重要。
为减少运算量,提高运算速度,就必须改进算法。
计算DFT过程中需要完成的运算的系数里,存在相当多的对称性。
通过研究这种对称性,可以简化计算过程中的运算,从而减少计算DFT所需的时间。
具有以下固有特性:
利用
带的上述特性,将x(n)或x(k)序列按一定规律分解成短序列进行运算,这样可以避免大量的重复运算,提高计算DFr的运算速度。
算法形式有很多种,但基本上可以分为两大类,即按时间抽取(DecimationInTime,DIT)FFT算法和按频率抽取(DecimationInFrequency,DIF)FFT算法。
4.2FFT程序设计
本程序FFT的实现首先是使用雷德算法对输入信号序列进行倒序重排,然后再进行L级递推计算。
雷德算法流程图如图五:
图五FFT数据倒位流程图
雷德算法是实现倒序位的一种方法。
我们假设A(I)表示存放自然顺序输入数据的内存单元,A(J)表示存放倒序位的内存单元,I,J=0,1……,N-1.按倒序位的规律,当I=J时,不用变址,当I≠J时,需要变址。
但是当I<
J时,进行变址在先,故在I>
J时,就不需要再变址了,否则变址两次等于不变址。
L级递推流程图如图六:
图六L级递推流程图
L级递推算法的原理是根据FFT每级有N/2个蝶形结,第M级有2M-1种蝶形运算;
由最后一级向前每推进一级,则系数就取后一级系数中偶数序号那一半;
蝶形结两个节点间的间距为2M-1。
其中共有三个循环:
外层循环控制L级的顺序运算:
内层的两个循环控制同一级(M相同)各蝶形结的运算,其中最内层的一层循环控制同一种蝶形结的运算,二中间一层的循环则控制不同种蝶形结的运算。
I和IP是一个蝶形结的两个节点。
基-2按时间抽取流程图:
图七基-2按时间抽取流程图
上图表示的基-2按时间抽取流程图,其流程是先进行倒序,在进行L级的运算,倒序位的实现是用雷德算法,再进行L级的运算。
4.3信号发生模块的FFT处理
数字滤波实验都需要设置实验箱信号源。
通过液晶和按键,设置信号源。
菜单路径为:
“系统设置”-“信号发生器设置”。
在“信号发生器设置”这一菜单下:
“通道”设为“0”;
“信号类型”可根据需要任意选择;
“信号频率”和“信号振幅”可在屏幕下方“有效输入”限定的范围内任意输入,建议“信号振幅”设为1000左右,“信号频率”设为300左右;
电压偏移”设为0;
“信号发生器开关”设为“开启”。
此时便有正弦信号输入音频芯片AIC23的输入端(利用此芯片同样可以进行AD采集)。
5.功能程序:
5.1实时FFT程序流程图
5.3实验中的部分程序讲解
5.3.1数字音频模块
#include<
csl.h>
#include"
CODEC.h"
#undefCODEC_ADDR
#defineCODEC_ADDR0x1A
//ConfigCODECcontrolregisters
//数字音频接口格式设置//AIC23为主模式,数据为DSP模式,数据长度16位
Uint16Digital_Audio_Inteface_Format[2]={
Codec_DAIF_REV,
DAIF_MS
(1)+DAIF_LRSWAP(0)+DAIF_LRP
(1)+DAIF_IWL(0)+DAIF_FOR(3)};
//AIC23的波特率设置,采样率为48k,CLKIN=CLKOUT=MCLK=?
?
12.288MHz
//时钟模式设为普通模式,基过采样率为250Fs?
256fs
Uint16Sample_Rate_Control[2]={
Codec_SRC_REV,
SRC_CLKIN(0)+SRC_CLKOUT(0)+SRC_SR(0)+SRC_BOSR(0)+SRC_USB(0)};
//AIC23寄存器复位
Uint16Reset[2]={
Codec_RST_REV,
RST_RES};
//AIC23节电方式设置,所有部分均处于工作状态
Uint16Power_Down_Control[2]={
Codec_PDC_REV,
PDC_DEFAULT};
//AIC23模拟音频的控制:
关掉侧音
//DAC使能,ADC输入选择为音频输入
//将AAPC_INSEL(x)设为0,选择Line输入,注意实验跳线的选择
//将AAPC_INSEL(x)设为1,选择Microphone输入,注意实验跳线的选择
Uint16Analog_Aduio_Path_Control[2]={
Codec_AAPC_STA2(0),AAPC_STA10(0)+AAPC_STE(0)+AAPC_DAC
(1)+AAPC_BYP(0)+AAPC_INSEL(0)+AAPC_MICM(0)+AAPC_MICB(0)};
//AIC23数字音频通路的控制//使能ADC高通滤波
Uint16Digital_Audio_Path_Control[2]={
Codec_DAPC_REV,
DAPC_DACM(0)+DAPC_DEEMP(0)+DAPC_ADCHP
(1)};
//AIC23数字接口的使能
Uint16Digital_Interface_Activation[2]={
Codec_DIA_REV,
DIA_ACT
(1)};
//AIC23左通路音频调节
Uint16Left_Line_Input_Volume_Control[2]={
Codec_LLIVC_LPS
(1),
LLIVC_LIM(0)+LLIVC_LIV(23)};
//AIC23右通路音频调节
Uint16Right_Line_Input_Volume_Control[2]={
Codec_RLIVC_RLS
(1),
RLIVC_RIM(0)+RLIVC_RIV(23)};
//AIC23耳机左通路音频调节
Uint16Left_Headphone_Volume_Control[2]={
Codec_LHPVC_LRS
(1),
LHPVC_LZC
(1)+LHPVC_LHV(127)};
//AIC23耳机右通路音频调节
Uint16Right_Headphone_Volume_Control[2]={
Codec_RHPVC_RLS
(1),
LHPVC_RZC
(1)+LHPVC_RHV(127)};
voidinti_AIC()
{
//unitdb;
/*设置AIC23各部分均工作*/
MyI2C_Write(Power_Down_Control,//pointertodataarray
2,//lengthofdatatobetransmitted
1,//masterorslaver
CODEC_ADDR,//slaveaddresstotransmitto从属地址发送到
1,//transfermodeofoperation
30000//timeoutforbusbusy
);
/*设置AIC23的数字接口*/
MyI2C_Write(Digital_Audio_Inteface_Format,//pointertodataarray数据数组的指针
CODEC_ADDR,//slaveaddresstotransmitto
/*设置AIC23模拟通路*/
MyI2C_Write(Analog_Aduio_Path_Control,//pointertodataarray
/*设置数字通路*/
MyI2C_Write(Digital_Audio_Path_Control,//pointertodataarray
/*设置AIC23的采样率*/
MyI2C_Write(Sample_Rate_Control,//pointertodataarray
/*设置耳机音量*/
MyI2C_Write(Left_Headphone_Volume_Control,//pointertodataarray
/*设置Line输入的音量*/
MyI2C_Write(Left_Line_Input_Volume_Control,//pointertodataarray
30000//timeoutforbusbus