DSP多波形任意信号发生器实验报告.docx
《DSP多波形任意信号发生器实验报告.docx》由会员分享,可在线阅读,更多相关《DSP多波形任意信号发生器实验报告.docx(34页珍藏版)》请在冰豆网上搜索。
DSP多波形任意信号发生器实验报告
北京交通大学
数字信号处理(DSP)
综合设计性实验报告
题目:
任意信号发生器的设计
学院:
电子信息工程学院
班级:
***********
学生:
北京交通大学电工电子教学基地
2013年7月15日
一、设计任务…………………………………………………
二、实验目的…………………………………………………
三、实验要求及目标…………………………………………………
四、实验原理…………………………………………………
五、程序代码及仿真结果…………………………………………………
1.泰勒级数产生正弦波
2.泰勒级数产生余弦波
3.三角波
4.方波
5.锯齿波
六、实验总结…………………………………………
七、参考资料…………………………………………
一.设计任务
信号发生器又称信号源或振荡器,在生产实践和科技领域中有着广泛的应用。
各种波形曲线均可以用三角函数方程式来表示。
能够产生多种波形,如三角波、锯齿波、矩形波(含方波)、正弦波的电路被称为函数信号发生器。
函数信号发生器在电路实验和设备检测中具有十分广泛的用途。
信号发生器在现代工程中应用非常广泛。
在实际中常需要产生一些特殊波形,用于仿真实际信号的波形,以检测和调试测量装置。
使用DSP可以产生连续的正弦波信号,同样也能产生方波、锯齿波、三角波等其它各种信号波形。
本设计要求采用DSP及其CODEC产生上述各种信号波形。
二.实验目的
(1)了解产生信号的两种方法及各自的优缺点。
(2)掌握使用DSP产生正弦波的原理和算法,进而掌握一般信号产生的原理和方法。
(3)掌握5502DSKCODECC的工作原理和初始化过程。
三.设计要求及目标
基本部分:
使用DSP产生300—4000HZ的正弦信号,要求使用计算法,并且频率可变、幅度可变、直流分量可变。
发挥部分:
使用DSP产生300—4000HZ的方波、锯齿波和三角波。
四.设计思路
产生连续信号的方法通常有两种:
查表法和计算法,查表法不如计算法使用灵活。
计算法可以使用泰勒级数展开法进行计算,也可以使用差分方程进行迭代计算或者直接使用三角函数进行计算。
计算结果可以边计算边输出,也可以先计算后输出。
正弦函数和余弦函数的泰勒级数数学表达式为:
.
如果要计算一个角度ⅹ的正弦和余弦值,可以取其前五项进行近似计算。
或使用下面递归的差分方程进行计算。
y[n]=A*y[n-1]-y[n-2]其中:
A=2cos(x),x=2πF/FS。
F—信号频率,FS—D/A转换频率。
利用递推公式计算正弦和余弦值需要已知cos(x)和正弦、余弦的前两个值。
计算时所需的计算量小,但如果用来产生连续的正弦和余弦信号,则累积误差太大。
要得到精确的计算结果,可以使用泰勒级数展开法进行计算,当然计算时所需的计算量很大。
在实际应用时可以根据需要选择相应的算法。
要产生一个正弦信号,首先要算出一个周期内各样点的值,因为sin(x)的值总是小于1的小数,而5402DSP是16位的定点处理器,所以要将其乘以215,变为Q15的数据格式,才能够在DSP中送到D/A转换器进行处理。
查表法与计算法的优缺点比较:
查表法:
事先将要输出的数据计算好,存储在DSP的内部RAM中,然后依次循环输出,从而才生波形。
这种方法的优点在于其速度快,可以产生频率很高的波形,而且不占用DSP的计算时间,它的缺点是需要占用DSP的内存空间,尤其是对采样频率比较大的输出波形,所需要的内部空间很大,所以这种方法用于对精度和频率要求不高的场合。
计算法:
采用计算的方法依次计算数据然后输出。
计算法的优缺点正好和查表法相反。
其优点是不占用DSP的存储空间,可以根据信息随时间改变或调整输出波形的周期波形;其缺点是占用DSP的计算时间,使得执行程序的开销大
在本次实验中我们采用计算法来产生正弦波,并且同时使用了泰勒级数、递归差分方程和三角函数计算三种方法来进行计算,以对这三种算法进行横向比较。
五.程序代码及仿真结果
1.泰勒级数法实现正弦波
程序代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//#include"E2PROM_Function.h"
#include"CODEC.h"
#defineNx720//每周期抽取点数
#pragmaDATA_SECTION(output1,"data_out1");//存放sin数据,浮点型
floatoutput1[Nx];
#pragmaDATA_SECTION(output,"data_out");//存放sin数据,定点型
intoutput[Nx];
#definepi3.1415927
#definepi22*pi
#defineF01000//Signalfrequency
#defineFs16000//Samplingfrequency//
#undefCODEC_ADDR
#defineCODEC_ADDR0x1A
#define_COSX0.999390827
/*Globaldeclarations*/
//intinp_buffer[BUFSIZE];/*processingdatabuffers*/
//intout_buffer[BUFSIZE];
intgain=MINGAIN;/*volumecontrolvariable*/
intfrequency=MINGAIN;
intabc=MINGAIN;
unsignedintprocessingLoad=BASELOAD;/*processingroutineloadvalue*/
/*****************余弦函数*****************/
into=2;
intdacdata[Nx];
float_cosx[Nx];
/*****************方波函数*********/
doublesqu[Nx];
intdacdata2[Nx];
intoutbuffer[Nx];
intamp=100;
unsignedintt=0;
/*****************锯齿波*****************/
doublez=0;
doubledt;
unsignedintp=0;
doublesaw[Nx];
intdacdata4[Nx],outbuffer3[Nx];
/*****************三角波函数*****************/
doubletri[Nx];
intdacdata3[Nx],outbuffer2[Nx];
intamp2=2;
doubleT=0,DT;
unsignedintI=0;
//定义McBSP的句柄
MCBSP_HandlehMcbsp;
/*------------------------------------------------------------------------------------*/
//
//FUNCTION:
MAIN
//
/*------------------------------------------------------------------------------------*/
voidmain(void)
{
Uint16i=0,k=0;
floatinput0=0,x1;
floata,b,c,d,e,f,g,h,ii,step;//step为角度步长
step=360.0/Nx;//Nx为360度内取样点数
/*****************正弦函数*****************/
for(i=0;i<=Nx-1;i++)
{
floatangle,xx;
angle=input0+step*i;
x1=3.1415926*angle/180;//将角度转为弧度
xx=x1*x1;
a=1-xx/16/17;b=1-xx/14/15*a;c=1-xx/12/13*b;d=1-xx/10/11*c;e=1-xx/8/9*d;f=1-xx/6/7*e;g=1-xx/4/5*f;h=1-xx/2/3*g;ii=x1*h;
//ii=x1*(1-xx/2/3*(1-xx/4/5*(1-xx/6/7*(1-xx/8/9*(1-xx/10/11*(1-xx/12/13*(1-xx/14/15*(1-xx/16/17))))))));//数学总公式
//fprintf(stdout,"COMPUTE%f",ii);fprintf(stdout,"\n");//输出计算的正弦波的数值,x2=e
output1[i]=32767*ii;//利用泰勒级数计算出正弦波的数值,存放到output1中
output[i]=output1[i]/32;
//InitializeCSLlibrary-ThisisREQUIRED
CSL_init();
//Themainfrequencyofsystemis240MHz
//该频率是为了设置IIC模块的需要设置的,为了使用I2C_setup函数
PLL_setFreq(1,0xC,0,1,3,3,0);
//EMIF初始化
Emif_Config();
//OpenMcBSPport1andgetaMcBSPtypehandle
hMcbsp=MCBSP_open(MCBSP_PORT1,MCBSP_OPEN_RESET);
//ConfigMcBSPport1byusepreviouslydefinedstructure
Mcbsp_Config(hMcbsp);
//I2C初始化
I2C_cofig();
//CODEC寄存器初始化
inti_AIC();
/*------------------------------------------------------------------------------------*/
//ReceivetheADCoutputdataofCODEC
//ThenoutputthereceiveddatatoDACofCODEC
/*------------------------------------------------------------------------------------*/
while
(1)
{
while(!
MCBSP_xrdy(hMcbsp)){};
MCBSP_write16(hMcbsp,dacdata4[k]*gain+abc);//左声道输出
while(!
MCBSP_xrdy(hMcbsp)){};
MCBSP_write16(hMcbsp,dacdata4[k]*gain+abc);//右声道输出
k=k+1+frequency;//正弦波每周期的样点为360个,输出信号的频率为Fs/N=32000/360=88.89Hz
//k=k+10;//正弦波每周期的样点为36个,输出信号的频率为Fs/N=32000/36=888.9Hz
if(k>=Nx)k=k%Nx;
}
}
}
GEL文件:
Amp.gel:
menuitem"SignalGain"
slidergain(0,1000,1,1,gainparameter)
{
Amp=gainparameter;
}
Fre.gel:
menuitem"SignalFrequency"
sliderfre(40,1000,1,1,freparameter)
{
Fre=freparameter;
}
硬件仿真结果:
添加GEL程序进行变量的滑块控制
此时设定输出幅度为572V,示波器测得电压为570V,输出频率为129Hz。
经测试仪测试为516Hz,基本正确。
设计程序输出频率范围为40—1000Hz。
设计程序输出幅度范围为0-1000V。
2.泰勒级数法实现余弦波
程序代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//#include"E2PROM_Function.h"
#include"CODEC.h"
#defineK0//直流分量
#pragmaDATA_SECTION(output1,"data_out1");//存放cos数据,浮点型
floatoutput1[1000];
#pragmaDATA_SECTION(output,"data_out");//存放cos数据,定点型
intoutput[1000];
volatileintFre;//余弦波每周期的样点为Nx个,输出信号的频率为Fs/Nx=32000/Nx
volatileintgain;//余弦波幅度范围定义为0-1000V
#undefCODEC_ADDR
#defineCODEC_ADDR0x1A
//定义McBSP的句柄
MCBSP_HandlehMcbsp;
/*------------------------------------------------------------------------------------*/
//
//FUNCTION:
MAIN
//
/*------------------------------------------------------------------------------------*/
voidmain(void)
{
Uint16i=0,k=0;
intNx=(int)32000/Fre;//将输入的频率值转变为Nx值
intamp=(int)gain/3.14;
floatinput0=0,x1,x2;
floata,b,c,d,e,f,g,h,ii,step;//step为角度步长
step=360.0/Nx;//Nx为360度内取样点数
/*****************余弦函数*****************/
_cosx[0]=1.000;
dacdata[0]=200;
_cosx[1]=_COSX;
dacdata[1]=_COSX*100+100;
while
(1)
{
if(o++>Nx-1)
break;
_cosx[o]=2*_COSX*_cosx[o-1]-_cosx[o-2];
dacdata[o]=_cosx[o]*100+100;
}
}
//InitializeCSLlibrary-ThisisREQUIRED
CSL_init();
//Themainfrequencyofsystemis240MHz
//该频率是为了设置IIC模块的需要设置的,为了使用I2C_setup函数
PLL_setFreq(1,0xC,0,1,3,3,0);
//EMIF初始化
Emif_Config();
//OpenMcBSPport1andgetaMcBSPtypehandle
hMcbsp=MCBSP_open(MCBSP_PORT1,MCBSP_OPEN_RESET);
//ConfigMcBSPport1byusepreviouslydefinedstructure
Mcbsp_Config(hMcbsp);
//I2C初始化
I2C_cofig();
//CODEC寄存器初始化
inti_AIC();
while
(1)
{
while(!
MCBSP_xrdy(hMcbsp)){};
MCBSP_write16(hMcbsp,dacdata[k]*gain+abc);//左声道输出
while(!
MCBSP_xrdy(hMcbsp)){};
MCBSP_write16(hMcbsp,dacdata[k]*gain+abc);//右声道输出
k=k+1+frequency;
if(k>=Nx)k=k%Nx;
}
}
GEL文件:
ampcos.gel:
menuitem"SignalGain"
slidergain4(0,1000,1,1,gainparameter)
{
gain=gainparameter;
}
Frecos.gel:
menuitem"SignalFrequency"
sliderfre4(40,1000,1,1,freparameter)
{
Fre=freparameter;
}
硬件仿真结果:
添加GEL程序进行变量的滑块控制
此时设定输出幅度为355V,示波器测得电压为355V,输出频率为458Hz。
经测试仪测试为473Hz,基本正确。
设计程序输出频率范围为40—1000Hz。
设计程序输出幅度范围为0-1000V。
3.三角波
程序代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include"CODEC.h"
#definepi3.1415927
#definepi22*pi
#undefCODEC_ADDR
#defineCODEC_ADDR0x1A
volatileintFre;//三角波每周期的样点为Nx个,输出信号的频率为Fs/Nx=32000*2/Nx
volatileintAmp;//三角波幅度范围定义为0-1000V
doubletri[2000];//存放三角波数据
intoutbuffer[2000];//存放输出数据
doubleT=0,DT;//中间控制变量
unsignedintI=0;
//定义McBSP的句柄
MCBSP_HandlehMcbsp;
/*------------------------------------------------------------------------------------*/
//
//FUNCTION:
MAIN
//
/*------------------------------------------------------------------------------------*/
voidmain(void)
{
Uint16i=0,k=0;
intNx=(int)(64000/Fre);//将输入的频率值转变为Nx值
intamp3=(int)(Amp/8.09);
/*****************三角波函数*****************/
DT=8*pi*F0/Fs;
for(T=0,I=0;I<=Nx/4;I++,T+=DT)
{tri[Nx/2-I]=tri[I]=T;
}
for(T=0,I=Nx/2;I<=3*Nx/4;I++,T+=DT)
{
tri[I]=T;
tri[Nx-I+Nx/2]=tri[I];
}
for(I=0;I<=Nx;I++)
{dacdata3[I]=tri[I]*10;
outbuffer2[I]=amp2*dacdata3[I];
}
//InitializeCSLlibrary-ThisisREQUIRED
CSL_init();
//Themainfrequencyofsystemis240MHz
PLL_setFreq(1,0xC,0,1,3,3,0);
//EMIF初始化
Emif_Config();
//OpenMcBSPport1andgetaMcBSPtypehandle
hMcbsp=MCBSP_open(MCBSP_PORT1,MCBSP_OPEN_RESET);
//ConfigMcBSPport1byusepreviouslydefinedstructure
Mcbsp_Config(hMcbsp);
//I2C初始化
I2C_cofig();
//CODEC寄存器初始化
inti_AIC();
while
(1)
{
while(!
MCBSP_xrdy(hMcbsp)){};
MCBSP_write16(hMcbsp,outbuffer2[k]);//左声道输出
while(!
MCBSP_xrdy(hMcbsp)){};
MCBSP_write16(hMcbsp,outbuffer2[k]);//右声道输出
k=k+1+frequency;
if(k>=Nx)k=k%Nx;
}
}
GEL文件:
amptri.gel:
menuitem"SignalGain"
slideramp3(0