DSP实验报告.docx
- 文档编号:3274899
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:28
- 大小:1.52MB
DSP实验报告.docx
《DSP实验报告.docx》由会员分享,可在线阅读,更多相关《DSP实验报告.docx(28页珍藏版)》请在冰豆网上搜索。
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 } } 实验成果截图: 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 } } 实验截图: 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 ; } } 结果截图: 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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DSP 实验 报告