DSP多波形任意信号发生器实验报告要点.docx

上传人:b****9 文档编号:26161526 上传时间:2023-06-17 格式:DOCX 页数:37 大小:1.21MB
下载 相关 举报
DSP多波形任意信号发生器实验报告要点.docx_第1页
第1页 / 共37页
DSP多波形任意信号发生器实验报告要点.docx_第2页
第2页 / 共37页
DSP多波形任意信号发生器实验报告要点.docx_第3页
第3页 / 共37页
DSP多波形任意信号发生器实验报告要点.docx_第4页
第4页 / 共37页
DSP多波形任意信号发生器实验报告要点.docx_第5页
第5页 / 共37页
点击查看更多>>
下载资源
资源描述

DSP多波形任意信号发生器实验报告要点.docx

《DSP多波形任意信号发生器实验报告要点.docx》由会员分享,可在线阅读,更多相关《DSP多波形任意信号发生器实验报告要点.docx(37页珍藏版)》请在冰豆网上搜索。

DSP多波形任意信号发生器实验报告要点.docx

DSP多波形任意信号发生器实验报告要点

北京交通大学

数字信号处理(DSP)

综合设计性实验报告

题目:

任意信号发生器的设计

 

学院:

电子信息工程学院

班级:

指导教师:

钱满义

学生:

北京交通大学电工电子教学基地

2013年7月15日

 

一、设计任务…………………………………………………

二、实验目的…………………………………………………

3、实验要求及目标…………………………………………………

4、实验原理…………………………………………………

五、程序代码及仿真结果…………………………………………………

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"

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 公务员考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1