DSP多波形任意信号发生器实验报告Word文档下载推荐.docx
- 文档编号:21120458
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:34
- 大小:1.21MB
DSP多波形任意信号发生器实验报告Word文档下载推荐.docx
《DSP多波形任意信号发生器实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《DSP多波形任意信号发生器实验报告Word文档下载推荐.docx(34页珍藏版)》请在冰豆网上搜索。
各种波形曲线均可以用三角函数方程式来表示。
能够产生多种波形,如三角波、锯齿波、矩形波(含方波)、正弦波的电路被称为函数信号发生器。
函数信号发生器在电路实验和设备检测中具有十分广泛的用途。
信号发生器在现代工程中应用非常广泛。
在实际中常需要产生一些特殊波形,用于仿真实际信号的波形,以检测和调试测量装置。
使用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<
math.h>
stdio.h>
csl.h>
csl_chip.h>
csl_i2c.h>
csl_pll.h>
csl_mcbsp.h>
csl_emif.h>
csl_emifBhal.h>
//#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);
//左声道输出
//右声道输出
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:
SignalFrequency"
sliderfre(40,1000,1,1,freparameter)
Fre=freparameter;
硬件仿真结果:
添加GEL程序进行变量的滑块控制
此时设定输出幅度为572V,示波器测得电压为570V,输出频率为129Hz。
经测试仪测试为516Hz,基本正确。
设计程序输出频率范围为40—1000Hz。
设计程序输出幅度范围为0-1000V。
2.泰勒级数法实现余弦波
#defineK0//直流分量
//存放cos数据,浮点型
floatoutput1[1000];
//存放cos数据,定点型
intoutput[1000];
volatileintFre;
//余弦波每周期的样点为Nx个,输出信号的频率为Fs/Nx=32000/Nx
volatileintgain;
//余弦波幅度范围定义为0-1000V
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;
/*****************余弦函数*****************/
_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;
while(!
MCBSP_write16(hMcbsp,dacdata[k]*gain+abc);
ampcos.gel:
slidergain4(0,1000,1,1,gainparameter)
gain=gainparameter;
Frecos.gel:
sliderfre4(40,1000,1,1,freparameter)
硬件仿真结果:
此时设定输出幅度为355V,示波器测得电压为355V,输出频率为458Hz。
经测试仪测试为473Hz,基本正确。
3.三角波
//三角波每周期的样点为Nx个,输出信号的频率为Fs/Nx=32000*2/Nx
volatileintAmp;
//三角波幅度范围定义为0-1000V
doubletri[2000];
//存放三角波数据
intoutbuffer[2000];
//存放输出数据
//中间控制变量
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;
=3*Nx/4;
tri[I]=T;
tri[Nx-I+Nx/2]=tri[I];
for(I=0;
=Nx;
I++)
{dacdata3[I]=tri[I]*10;
outbuffer2[I]=amp2*dacdata3[I];
MCBSP_write16(hMcbsp,outbuffer2[k]);
amptri.gel:
slideramp3(0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DSP 波形 任意 信号发生器 实验 报告