基于DSP的任意信号发生器设计汇总.docx

上传人:b****6 文档编号:8744105 上传时间:2023-02-01 格式:DOCX 页数:24 大小:474.28KB
下载 相关 举报
基于DSP的任意信号发生器设计汇总.docx_第1页
第1页 / 共24页
基于DSP的任意信号发生器设计汇总.docx_第2页
第2页 / 共24页
基于DSP的任意信号发生器设计汇总.docx_第3页
第3页 / 共24页
基于DSP的任意信号发生器设计汇总.docx_第4页
第4页 / 共24页
基于DSP的任意信号发生器设计汇总.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

基于DSP的任意信号发生器设计汇总.docx

《基于DSP的任意信号发生器设计汇总.docx》由会员分享,可在线阅读,更多相关《基于DSP的任意信号发生器设计汇总.docx(24页珍藏版)》请在冰豆网上搜索。

基于DSP的任意信号发生器设计汇总.docx

基于DSP的任意信号发生器设计汇总

 

数字信号处理(DSP)

综合设计性实验报告

 

学院:

电子信息工程学院

班级:

通信0708

 

***********

学生:

原凌云07211253

张丽康07211256

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

2004年12月28日

 

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

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

三、设计内容…………………………………………………3

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

五、程序设计…………………………………………………6

1、程序源代码

2、实验截图和结果

六、实验总结…………………………………………22

七、参考资料…………………………………………23

 

一、设计任务书

信号发生器又称信号源或振荡器,在生产实践和科技领域中有着广泛的应用。

各种波形曲线均可以用三角函数方程式来表示。

能够产生多种波形,如三角波、锯齿波、矩形波(含方波)、正弦波的电路被称为函数信号发生器。

函数信号发生器在电路实验和设备检测中具有十分广泛的用途。

信号发生器在现代工程中应用非常广泛。

在实际中常需要产生一些特殊波形,用于仿真实际信号的波形,以检测和调试测量装置。

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

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

二、实验目的

(1)了解产生信号的两种方法及各自的优缺点。

(2)掌握使用DSP产生正弦波的原理和算法,进而掌握一般信号产生的原理和方法。

(3)掌握5402DSKCODECC(A/D、D/A)的工作原理和初始化过程。

(4)掌握使用指针访问片上ROM中正弦查找表的方法。

三、设计内容

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

用软件CCS5000编程实现,并硬件(DSK板或示波器)连接进行功能演示。

使用计算法产生余弦波分量。

发挥部分:

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

(2)使用现有程序,实现不改变源程序,频率和幅度自动可调。

四、实验原理

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

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

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

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

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

.

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

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

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的计算时间,使得执行程序的开销大

在实验中我们将采用查表法来实现正弦波,计算法产生余弦波。

余弦法的递推公式:

cos(nx)=2cosxcos[(n-1)x]-cos[(n-2)x]

其中,cosx=cos(2*pi/N)=cos(2*pi*Fs/F),n=0时cos(nx)=1,n=1时cos(nx)=cosx,令N=256,Fs=16000,F=1000

调幅调频:

我们将使用下面的一个界面

来实现频率和幅度的连续可调,但因为此界面和CCS运行界面不能同时存在,所以我们需要脱离CCS,而将程序烧至板子,然后在虚拟示波器上面观察波形的变化。

频率、幅度及直流分量可调也可以通过改变源程序来实现。

五、程序设计

基本部分:

【1】查表法实现正弦波的程序:

/**********正弦信号产生程序[1]**********************/

#include

#include

#include

#include

#include

voiddelay(s16period);

HANDLEhHandset;

s16data;

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

/*片上ROM中的正弦函数查表法*/

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

s16SINE_TABLE[]=

{

0x00000,0x00324,0x00647,0x0096A,0x00C8B,0x00FAB,0x012C7,0x015E1,0x018F8,0x01C0B,0x01F19,0x02223,0x02527,0x02826,0x02B1E,0x02E10,0x030FB,0x033DE,0x036B9,

0x0398C,0x03C56,0x03F16,0x041CD,0x0447A,0x0471C,0x049B3,0x04C3F,0x04EBF,0x05133,0x0539A,0x055F4,0x05842,0x05A81,0x05CB3,0x05ED6,0x060EB,0x062F1,

0x064E7,0x066CE,0x068A5,0x06A6C,0x06C23,0x06DC9,0x06F5E,0x070E1,0x07254,0x073B5,0x07503,0x07640,0x0776B,0x07883,0x07989,0x07A7C,0x07B5C,0x07C29,

0x07CE2,0x07D89,0x07E1C,0x07E9C,0x07F08,0x07F61,0x07FA6,0x07FD7,0x07FF5,0x07FFE,0x07FF5,0x07FD7,0x07FA6,0x07F61,0x07F08,0x07E9C,0x07E1C,0x07D89,

0x07CE2,0x07C29,0x07B5C,0x07A7C,0x07989,0x07883,0x0776B,0x07640,0x07503,0x073B5,0x07254,0x070E1,0x06F5E,0x06DC9,0x06C23,0x06A6C,0x068A5,0x066CE,

0x064E7,0x062F1,0x060EB,0x05ED6,0x05CB3,0x05A81,0x05842,0x055F5,0x0539A,0x05133,0x04EBF,0x04C3F,0x049B3,0x0471C,0x0447A,0x041CD,0x03F16,0x03C56,

0x0398C,0x036B9,0x033DE,0x030FB,0x02E10,0x02B1E,0x02826,0x02527,0x02223,0x01F19,0x01C0B,0x018F8,0x015E1,0x012C7,0x00FAB,0x00C8B,0x0096A,0x00647,

0x00324,0x00000,0x0FCDC,0x0F9B9,0x0F696,0x0F375,0x0F056,0x0ED39,0x0EA1F,0x0E708,0x0E3F5,0x0E0E7,0x0DDDD,0x0DAD9,0x0D7DA,0x0D4E2,0x0D1F0,0x0CF05,

0x0CC22,0x0C947,0x0C647,0x0C3AA,0x0C0EA,0x0BE33,0x0BB86,0x0B8E4,0x0B64D,0x0B3C1,0x0B141,0x0AECD,0x0AC66,0x0AA0C,0x0A7BE,0x0A57F,0x0A34D,0x0A12A,

0x09F15,0x09D0F,0x09B19,0x09932,0x0975B,0x09594,0x093DD,0x09237,0x090A2,0x08F1F,0x08DAC,0x08C4C,0x08AFD,0x089C0,0x08895,0x0877D,0x08677,0x08584,

0x084A4,0x083D8,0x0831E,0x08277,0x081E4,0x08164,0x080F8,0x0809F,0x0805A,0x08029,0x0800B,0x08002,0x0800B,0x08029,0x0805A,0x0809F,0x080F8,0x08164,

0x081E4,0x08277,0x0831E,0x083D8,0x084A4,0x08584,0x08677,0x0877D,0x08895,0x089C0,0x08AFD,0x08C4B,0x08DAC,0x08F1F,0x090A2,0x09237,0x093DD,0x09594,

0x0975B,0x09932,0x09B19,0x09D0F,0x09F15,0x0A12A,0x0A34D,0x0A57F,0x0A7BE,0x0AA0B,0x0AC66,0x0AECD,0x0B141,0x0B3C1,0x0B64D,0x0B8E4,0x0BB86,0x0BE33,

0x0C0EA,0x0C3AA,0x0C674,0x0C947,0x0CC22,0x0CF05,0x0D1F0,0x0D4E1,0x0D7DA,0x0DAD9,0x0DDDD,0x0E0E7,0x0E3F5,0x0E708,0x0EA1E,0x0ED38,0x0F055,0x0F375,

0x0F696,0x0F9B9,0x0FCDC,0x00000

};

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

/*主程序*/

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

voidmain()

{

s16amp=1;//输出的正弦信号的幅度系数,可变

s16cnt=2;

u16i=0;

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

return;

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

while(cnt--)

{

brd_led_toggle(BRD_LED0);

delay(1000);

brd_led_toggle(BRD_LED1);

delay(1000);

brd_led_toggle(BRD_LED2);

delay(1000);

}

/*获得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)=amp*SINE_TABLE[i];

i=i+100;//此时产生的正弦信号频率为6250Hz,每个周期的样点N=256/100=2.56

i+=0x00ff;//修正样点指针

}

}

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

voiddelay(s16period)

{

inti,j;

for(i=0;i

{

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

}

}

实验成果截图:

/**********正弦信号产生程序[2]**********************/

#include

#include

#include

#include

#include

#defineN256

#definepi3.1415927

#definepi22*pi

#defineF01000

#defineFs16000//Samplingfrequency

#pragmaDATA_SECTION(_sinx,"data_buf1")

double_sinx[256];

#pragmaDATA_SECTION(dacdata,"data_buf2")

intdacdata[256],outbuffer[256];

intamp=1;

voiddelay(int);

voidmain(void)

{

doublet=0,dt;

unsignedinti=0;

HANDLEhHandset;

intcnt=2;

if(brd_init(100))

return;//初始化5402DSK板

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);

}

dt=pi2*F0/Fs;

for(i=0;i

{

_sinx[i]=(sin(t));----------查表法实现正弦波

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

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

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)=outbuffer[i++];//将数据写入D/A转换器

}

}

voiddelay(s16period)

{

inti,j;

for(i=0;i

{

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

}

}

实验成果截图:

【2】计算法实现余弦波的程序:

/**********余弦信号产生程序**********************/

#include

#include

#include

#include

voiddelay(s16period);

HANDLEhHandset;

s16data;

#define_COSX0.999390827

#pragmaDATA_SECTION(_cosx,"data_buf1")

float_cosx[200];

#pragmaDATA_SECTION(dacdata,"data_buf2")

intdacdata[180];

voidmain(void)

{

s16cnt=2;

u16i=0;

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

_cosx[0]=1.000;

dacdata[0]=4095;

_cosx[1]=_COSX;

dacdata[1]=_COSX*2047+2048;

i=2;

while

(1)

{

if(i++>179)

break;

_cosx[i]=2*_COSX*_cosx[i-1]-_cosx[i-2];

dacdata[i]=_cosx[i]*2047+2048;

}

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

return;

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

while(cnt--)

{

brd_led_toggle(BRD_LED0);

delay(1000);

brd_led_toggle(BRD_LED1);

delay(1000);

brd_led_toggle(BRD_LED2);

delay(1000);

}

/*获得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_6dB);//设置模拟输出增益为-6dB

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

i=0;

while

(1)

{

if(i>179)i=0;

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

while(!

MCBSP_XRDY(HANDSET_CODEC)){};

/*将dacdata[i]输出到D/A*/

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

}

}

voiddelay(s16period)

{

inti,j;

for(i=0;i

{

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

}

}

实验成果截图:

 

发挥部分

(1):

【1】锯齿波:

/**********锯齿波信号产生程序**********************/

#include

#include

#include

#include

#include

#defineN256

#definepi3.1415927

#definepi22*pi

#defineF01000//Signalfrequency

#defineFs16000//Samplingfrequency

#pragmaDATA_SECTION(saw,"data_buf1")

doublesaw[N];

#pragmaDATA_SECTION(dacdata,"data_buf2")

intdacdata[N],outbuffer[N];

intamp=1;

unsignedintL=0;

voiddelay(int);

voidmain(void)

{

doublet=0,dt;

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);

}

dt=8*pi*F0/Fs;

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

{

saw[i]=t;

saw[i+N/4]=0;

}

for(t=0,i=N/2;i<3*N/4;i++,t+=dt)

{

saw[i]=t;

saw[N-i+N/2]=0;

}

for(i=0;i

{dacdata[i]=saw[i]*10;

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未准

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

当前位置:首页 > 高等教育 > 农学

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

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