DSP实验报告.docx

上传人:b****5 文档编号:3274899 上传时间:2022-11-21 格式:DOCX 页数:28 大小:1.52MB
下载 相关 举报
DSP实验报告.docx_第1页
第1页 / 共28页
DSP实验报告.docx_第2页
第2页 / 共28页
DSP实验报告.docx_第3页
第3页 / 共28页
DSP实验报告.docx_第4页
第4页 / 共28页
DSP实验报告.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

DSP实验报告.docx

《DSP实验报告.docx》由会员分享,可在线阅读,更多相关《DSP实验报告.docx(28页珍藏版)》请在冰豆网上搜索。

DSP实验报告.docx

DSP实验报告

 

DSP课程设计

实验报告

 

任意信号发生器的设计

 

院(系):

电子信息工程学院

设计人员:

王睿学号:

08211074

李琦08211068

 

成绩:

工程设计50

报告20

答辩30

总分

评语:

 

指导教师签字:

日期:

 

一、设计任务书……………………………………………………………3

二、设计内容………………………………………………………………3

三、设计方案、算法原理说明……………………………………………3

四、程序设计、调试与结果分析…………………………………………4

五、设计(安装)与调试的体会…………………………………………25

六、参考文献………………………………………………………………26

 

一、设计任务书

信号发生器已广泛应用于科学实验、通讯和控制等应用领域中。

使用DSP和D/A转换器可以产生连续的正弦波信号,同样也能产生方波、锯齿波、三角波等其它各种信号波形。

本设计要求采用DSP及其D/A转换器产生上述各种信号波形。

基本部分:

使用DSP产生300—4000HZ的正弦信号,要求使用计算法,并且频率可变、幅度可变、直流分量可变。

发挥部分:

使用DSP产生300—4000HZ的方波、锯齿波和三角波。

二、设计内容

(1)编写C语言程序,并在CCS集成开发环境下调试通过。

(2)实现设计所要求的各项功能。

(3)按要求撰写设计报告。

三、设计方案、算法原理说明

产生连续信号的方法通常有两种:

查表法和计算法,查表法不如计算法使用灵活。

计算法可以使用泰勒级数展开法进行计算,也可以使用差分方程进行迭代计算或者直接使用三角函数进行计算。

计算结果可以边计算边输出,也可以先计算后输出。

正弦函数和余弦函数的泰勒级数数学表达式为:

.

如果要计算一个角度ⅹ的正弦和余弦值,可以取其前五项进行近似计算。

或使用下面递归的差分方程进行计算。

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】泰勒级数计算法

/******************************************************************************

任务:

产生300-4000HZ的正弦信号,要求使用计算法且频率、幅度、直流分量可变

设计方法:

利用泰勒展开式计算,sinx[i]=t-t^3/6+t^5/120-t^7/5040+t^9/362880

作者:

王睿李琦

设计时间:

2011/1/11

最后修改:

2010/1/12

*******************************************************************************/

#include

#include

#include

#include

#include

#defineAM1//输出幅度

#definePI3.1415927

#defineF02000//输出频率,必须是16000/4=4000的约数

#defineFS16000//抽样频率

#defineDC0//直流偏置

#pragmaDATA_SECTION(_sinx,"data_buf1")//定义两个数据段,存储数据

double_sinx[256],dacdata[256];

#pragmaDATA_SECTION(dacdata,"data_buf2")

intoutbuffer[256];

intN;//每个周期样本个数

intN1;

voiddelay(int);//延时函数声明

voidmain(void)

{

doublet=0,dt;

unsignedinti=0;

unsignedintj=0;

unsignedintk=0;

HANDLEhHandset;

intcount=2;

if(brd_init(100))

return;//初始化5402DSK板

while(count--)//LED发光二极管闪烁两次,表示程序开始正常运行

{

brd_led_toggle(BRD_LED0);//切换LED指示灯0的显示状态

delay(1000);

brd_led_toggle(BRD_LED1);//切换LED指示灯1的显示状态

delay(1000);

brd_led_toggle(BRD_LED2);//切换LED指示灯2的显示状态

delay(1000);

}

N=FS/F0;//每个周期样点数N=T0/TS=FS/F0

N1=N/4;

dt=2*PI*F0/FS;//步长dt=2*PI/N

for(i=0;i

{

_sinx[i]=t-t*t*t/6+t*t*t*t*t/120-t*t*t*t*t*t*t/5040+t*t*t*t*t*t*t*t*t/362880;

dacdata[i]=AM*_sinx[i];

t=t+dt;

}

for(i=0;i

{

j=i+N1;

k=N1-i-1;

dacdata[j]=dacdata[k];

}

for(i=0;i

{

j=i+N1*2;

dacdata[j]=-dacdata[i];

}

for(i=0;i

{

j=i+N1*3;

k=N1+i;

dacdata[j]=-dacdata[k];

}

for(i=0;i

{

outbuffer[i]=(dacdata[i]+DC)*2047+2048;//将所有幅值移到正幅度部分

}

hHandset=codec_open(HANDSET_CODEC);//获取设置codec的句柄

codec_dac_mode(hHandset,CODEC_DAC_15BIT);//15bit工作模式

codec_aout_gain(hHandset,CODEC_AOUT_MINUS_6dB);//模拟输出增益为-6dB

codec_sample_rate(hHandset,SR_16000);//转换速率为16KHz

while

(1)//将输出信号样点存入数据输出缓冲区

{

while(!

MCBSP_XRDY(HANDSET_CODEC)){};//如果D/A未准备好,则等待

*(volatileu16*)DXR1_ADDR(HANDSET_CODEC)=outbuffer[i++];//将数据写入D/A转换器

if(i==N)

i=0;

}

}

voiddelay(s16period)//延时函数

{

inti,j;

for(i=0;i

{

for(j=0;j>1;j++);

}

}

实验成果截图:

400Hz

1000Hz

 

【2】三角函数计算法

/******************************************************************************

任务:

产生300-4000HZ的正弦信号,要求使用计算法且频率、幅度、直流分量可变

设计方法:

利用调用库函数计算,sinx[i]=(sin(x))

作者:

王睿李琦

设计时间:

2011/1/11

最后修改:

2010/1/12

*******************************************************************************/

#include

#include

#include

#include

#include

#defineAM1//输出幅度

#definePI3.1415927

#defineF01000//输出频率,最小63

#defineFS16000//抽样频率

#defineDC0//直流偏置

#pragmaDATA_SECTION(_sinx,"data_buf1")//定义数据段

double_sinx[256];

#pragmaDATA_SECTION(dacdata,"data_buf2")

intdacdata[256];

intN;//每个周期样本数

voiddelay(int);

voidmain(void)

{

doublet=0,dt;

unsignedinti=0;

HANDLEhHandset;

intcount=2;

if(brd_init(100))

return;//初始化5402DSK板

while(count--)

{

brd_led_toggle(BRD_LED0);//切换LED指示灯0的显示状态

delay(1000);

brd_led_toggle(BRD_LED1);//切换LED指示灯1的显示状态

delay(1000);

brd_led_toggle(BRD_LED2);//切换LED指示灯2的显示状态

delay(1000);

}

N=FS/F0;//每个周期样点数N=T0/TS=FS/F0

dt=2*PI*F0/FS;//步长dt=2*PI/N

for(i=0;i

{

_sinx[i]=(sin(t))+DC;//调用函数法实现正弦波

dacdata[i]=AM*_sinx[i]*2047+2048;

t=t+dt;

}

hHandset=codec_open(HANDSET_CODEC);//获取设置codec的句柄

codec_dac_mode(hHandset,CODEC_DAC_15BIT);//15bit工作模式

codec_aout_gain(hHandset,CODEC_AOUT_MINUS_6dB);//模拟输出增益为-6dB

codec_sample_rate(hHandset,SR_16000);//转换速率为16KHz

while

(1)

{

while(!

MCBSP_XRDY(HANDSET_CODEC)){};//如果D/A未准备好,则等待

*(volatileu16*)DXR1_ADDR(HANDSET_CODEC)=dacdata[i++];//将数据写入D/A转换器

if(i==N)

i=0;

}

}

voiddelay(s16period)//延时函数

{

inti,j;

for(i=0;i

{

for(j=0;j>1;j++);

}

}

实验截图:

550Hz

1000Hz

 

【2】递归差分方程计算法

 

/******************************************************************************

任务:

产生300-4000HZ的正弦信号,要求使用计算法且频率、幅度、直流分量可变

设计方法:

利用递归差分方程计算,y[n]=A*y[n-1]-y[n-2]其中:

A=2cos(x),x=2πF/Fs

设计时间:

2011/1/11

作者:

王睿李琦

最后修改:

2011/1/12

修改内容:

*******************************************************************************/

#include

#include

#include

#include

#include

 

/*****************************************************************************

宏定义,只需修改相应项的值即可实现相应状态的改变

*****************************************************************************/

#defineF02000//频率

#defineFS16000//抽样速率

#defineAMP2//幅度

#defineDC0//直流分量

 

#pragmaDATA_SECTION(_sinx,"data_buf1")

float_sinx[200];

#pragmaDATA_SECTION(dacout,"data_buf2")

intdacout[200];

voiddelay(s16period);//延时函数

HANDLEhHandset;

s16data;

float_A;

/*****************************************************************************/

/*主程序*/

/*****************************************************************************/

voidmain()

{

u16i=0;

u16count=3;

u16N;

if(brd_init(100))//初始化5402DSK板

return;

_A=2*(cos(2*3.1415927*F0/FS));//?

1.847759

/*LED发光二极管闪烁两次,表示程序开始正常运行*/

while(count--)

{

brd_led_toggle(BRD_LED0);

delay(1000);

brd_led_toggle(BRD_LED1);

delay(1000);

brd_led_toggle(BRD_LED2);

delay(1000);

}

/*计算余弦信号的样点值,计算得到的样点存储在dacdata[]数组中*/

_sinx[0]=0.000;//

dacout[0]=2048;//

_sinx[1]=sin(2*3.1415926*F0/FS);//0.3826

dacout[1]=_sinx[1]*2047+2048;

i=2;

while

(1)

{

if(i>=200)

break;

_sinx[i]=_A*_sinx[i-1]-_sinx[i-2];

dacout[i]=_sinx[i]*2047+2048;

i++;

}

i=0;

N=FS/F0;

while

(1)

{

if(i>=200)break;

dacout[i]=AMP*dacout[i]+DC*2047;

i++;

}

/*获得Codec(D/A转换器)的句柄*/

hHandset=codec_open(HANDSET_CODEC);

/*初始化D/A转换器*/

codec_dac_mode(hHandset,CODEC_DAC_15BIT);//DAC设置为15比特模式

codec_aout_gain(hHandset,CODEC_AOUT_MINUS_12dB);//设置模拟输出增益为-6dB

codec_sample_rate(hHandset,SR_16000);//D/A转换速率为16kHz

/*正弦信号发生程序*/

while

(1)

{

/*D/A转换器是否准备好*/

while(!

MCBSP_XRDY(HANDSET_CODEC)){};

/*将信号样点输出到D/A转换器*/

*(volatileu16*)DXR1_ADDR(HANDSET_CODEC)=dacout[i++];

if(N==i)

i=0;

}

}

/*将输出信号样点存入数据输出缓冲区,可使用图形观察窗口观察输出信号波形*/

voiddelay(s16period)

{

inti,j;

for(i=0;i

{

for(j=0;j>1;j++)

;

}

}

 

结果截图:

1000Hz

1000Hz

 

扩展部分:

产生300—4000HZ的方波

程序代码:

/**********方波信号产生程序**********************/

#include

#include

#include

#include

#include

 

#defineN256

#definepi3.1415927

#definepi22*pi

#defineF01000//Signalfrequency

#defineFs16000//Samplingfrequency

#pragmaDATA_SECTION(squ,"data_buf1")

doublesqu[N];

#pragmaDATA_SECTION(dacdata,"data_buf2")

intdacdata[N],outbuffer[N];

intamp=1;

unsignedintL=0;

voiddelay(int);

voidmain(void)

{

unsignedinti=0;

HANDLEhHandset;

intcnt=2;

brd_init(100);

while(cnt--)

{

brd_led_toggle(BRD_LED0);//切换LED指示灯0的显示状态

delay(1000);

brd_led_toggle(BRD_LED1);//切换LED指示灯1的显示状态

delay(1000);

brd_led_toggle(BRD_LED2);//切换LED指示灯2的显示状态

delay(1000);

}

for(i=0;i<=N/4;i++)

{squ[i]=1;

squ[i+N/4]=-1;

squ[i+N/2]=1;

squ[N-i]=-1;

}

for(i=0;i

{dacdata[i]=squ[i];

outbuffer[i]=amp*dacdata[i];

}

hHandset=codec_open(HANDSET_CODEC);//获取设置codec的句柄

codec_dac_mode(hHandset,CODEC_DAC_15BIT);//15+1bit工作模式

codec_aout_gain(hHandset,CODEC_AOUT_MINUS_6dB);//模拟输出增益为-6dB

codec_sample_rate(hHandset,SR_16000);//转换速率为16KHz

while

(1)

{

while(!

MCBSP_XRDY(HANDSET_CODEC)){};//如果D/A未准备好,则等待

*(volatileu16*)DXR1_ADDR(HANDSET_CODEC)=outbuffer[i++];//将数据写入D/A转换器

}

}

voiddelay(intperiod)

{

inti,j;

for(i=0;i

{

for(j=0;j

}

}

结果截图:

1000Hz

300Hz

【1】产生300—4000HZ的三角波

程序代码:

#include

#include

#include

#include

#include

 

#defineN256

#definepi3.1415927

#definepi22*pi

#defineF01000//Signalfrequency

#defineFs16000//Samplingfrequency

#pragmaDATA_SECTION(tri,"data_buf1")

doubletri[N];

#pragmaDATA_SECTION(dacdata,"data_buf2")

intdacdata[N],outbuffer[N];

intamp=2;

unsign

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

当前位置:首页 > 成人教育 > 自考

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

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