dsp正弦函数计算程序的编写
一个简单的dspC语言例子

一个简单的dsp C语言例子开发平台: CCS集成开发环境通过这个简单的例子, 可以大致了解用C语言开发dsp程序的原理。
程序要求: 用C语言编写产生正弦调幅波信号的源程序;正弦调幅波的公式在离散域中的表示:y(n) = (1 + M*sin(2 * PI * fb / fs * n)) * sin(2 * PI * fa / fs * n);编写文件1.sin_am.c#include<stdio.h>#include<math.h>#define TRUE 1#define pi 3.1415926536int y[500],i;float M;void main(){puts("amplitude modulation sinewave example started.\n");M = 50;for(i = 0; i < 500; i++)y[i]= 0;while(TRUE){for(i = 0; i < 500; i++)y[i]=(int)((1 + M / 100 * sin(i * 2 * pi * 20 / 4000))* sin(i * 2 * pi * 200 / 4000)* 16384);puts("program end");}}2.sin_am_v.asm (reset vector file).title "sin_am_v.asm".sect ".vectors".ref _c_int00RESET:B _c_int00.end..3.sin_am.cmdsin_am.objsin_am_v.obj-m sin_am.map-o sin_am.outMEMORY{PAGE 0:EPROG: origin = 0x1400, len = 0x7c00 VECT: origin = 0xff80, len = 0x80PAGE 1:USERREGS: origin = 0x60, len = 0x1c IDATA: origin = 0x80, len = 0x3000 }SECTIONS{.vectors:>VECT PAGE 0.text:>EPROG PAGE 0.cinit:>EPROG PAGE 0.bss:>IDATA PAGE 1.const:>IDATA PAGE 1.switch:>IDATA PAGE 1.system:>IDATA PAGE 1.stack:>IDATA PAGE 1}"*.cmd"文件说明:链接命令文件是实现对段的存储空间位置的定位, C语言程序中常用已初始化和未初始化段如下:已初始化段包括:.init 存放C程序中的变量的初值和常量, 放在ROM和RAM 中均可, 一般属于PAGE 0.const 存放C程序中的字符常量、浮点常量和用const声明的常量, 放在ROM和RAM中均可, 一般属于PAGE 1.text 存放C程序代码, 放在ROM和RAM中均可, 一般属于PAGE 0.switch 存放C程序中的语句的跳针表, 放在ROM和RAM中均可, 一般属于PAGE 0未初始化段包括:.bss 为C程序中的全局和静态变量保留存储空间, 一般存放于RAM中, 属于PAGE 1.stack 为C程序系统堆栈保留存储空间, 用于保存返回地址、函数间的参数传递、存储局部变量和保存中间结果, 一般存放于RAM中, 属于PAGE 1.sysmem 用于C程序中malloc、calloc和realloc函数动态分配存储空间, 一般存放于RAM中, 属于PAGE 14.vary_M.gelmenuitem "Myfunctions"slider vary_M(0, 100, 10, 1, Amount_of_modulation){M = Amount_of_modulation;}该文件用于调试的时候可随意改变变量M的值, 该文件通过file->load GEL File添加到工程中, 调试的时候可选择GEL->My Functions->vary_M来打开vary_M滑动条组件。
基于DSP汇编语言的高精度三角函数仿真及实现

基于DSP汇编语言的高精度三角函数仿真及实现【摘要】在现今DSP软件工程设计中,广泛采用高级语言(如C语言)直接调用三角函数进行计算。
然而,汇编语言的稳定性、可读性和执行效率均优于高级语言,因缺少可供直接调用的三角函数库,其开发周期长,且计算精度难以保证,在工程中推广较少。
本文就基于DSP汇编语言,提出一种高精度三角函数算法。
【关键词】三角函数传统查表法线性查表法MATLAB 仿真一、引言随着现代科技的高速发展,带三角函数的大型DSP复杂算法被广泛应用于各个领域,高级语言(如C语言)编程实现时,其稳定性、可读性、执行效率均不及汇编语言。
然而,汇编算法没有标准的三角函数库,需软件开发人员自己编写,这就延长了软件的开发周期,同时,其计算精度难以得到保证。
本文就基于DSP汇编语言,提出一种占用资源低且精度较高的线性查表法,实现三角函数,并通过MATLAB 仿真与传统查表法进行对比分析。
二、查找表建模假设以等步长step定义了点数为N的三角函数查找表,表中地址n处的值为(x0,y0),若要计算某x处的三角函数值y,用传统查找表实现,即近似于地址n处的查表值y0。
其查找生成方式为:TAB_X(n)=Fx(n*step),n=0,1,2……N-1。
其中TAB_X为三角函数表,Fx代表相应的标准三角函数。
而用线性查找表实现,即近似于(x0,y0)点切线上x 处所对应的值y’。
设切线的斜率为C,则用公式可表示为:y≈y’=y0+C×=y0+C*(x-x0)由公式可知,线性查找表需要包含x0处的三角函数值y0和切线斜率C,因此,采取y0值与C值交替存放方式,即为:TAB_X(n)=Fx(n*step),n=0,2,4……N-2;TAB_X (n)=Fc(n*step),n=1,3,5……N-1。
其中Fc代表斜率函数,其对应关系见表1。
三、工程实现方法对正弦和余弦函数,其函数本身与切线斜率正好互补,因此可共用一张查找表。
dsp5000指导书

第3章正弦波信号产生3.1单频正弦波信号实验3.1.1 实验目的⏹进一步熟悉使用CCS集成环境,对程序进行编译、链接运行和仿真;⏹学习使用定点数表示小数的方法及其在55x DSP中的运算;⏹学习使用汇编语言编写计算一个正弦值和一个余弦值的子程序;⏹掌握子程序调用和55x DSP块重复操作;⏹学习正弦波发生器的实现。
3.1.2 实验设备⏹PC兼容机一台;操作系统为Windows2000 (或WindowsNT、Windows98、WindowsXP);⏹计算机安装CCS 5000或CCS 3.1。
3.1.3 实验要求使用CCS集成仿真环境,完成建立工程、源文件、命令文件,保存和添加文件到工程,进行编译、链接、运行和调试等操作。
使用观察窗口观察寄存器和存储器空间的内容以及输出正弦波波形等。
3.1.4 实验原理1.sin(x)值和cos(x)值的算法设x为角度的弧度值,sin(x)值和cos(x)值可以由泰勒级数展开式得到,我们取其前五项近似,如需更高精确度,可取所需项数,其表达式如下:sin(x)=x-x3/3!+x5/5!-x7/7!+x9/9!=x(1-(x2/6)(1-(x2/20)(1-(x2/42)(1-x2/72))))(3.1)cos(x)=1-x2/2!+x4/4!-x6/6!+x8/8!=1-x2/2(1-x2/12(1-x2/30(1-x2/56))) (3.2)DSP C55x是定点DSP,正弦值和余弦值在-1和1之间,在这里我们采用Q15格式来表示所有的小数。
采用Q15格式时,使用泰勒级数展开式来计算,要求x不能大于1弧度,而这样只能计算一部分值;如果要计算0到π/2正弦值,则要利用三角公式来计算。
在本计算中,x取0到π/4,使用泰勒级数展开式来计算,再用三角公式sin(2x)=2sin(x)cos(x)计算0到π/2正弦值。
在以上两个公式中,sin(x) 展开式中的系数为s1=1/72,s2=1/42,s3=1/20,s4=1/6,cos(x) 展开式中的系数为c1=1/56, c2=1/30,c3=1/12,c4=1/2,它们表示成定点数Q15格式的十六进制数为:S1=32 768/72=01c7H S2=32 768/42 =030bHS3=32 768/20=0666H S4=32 768/6 =1556HC1=32 768/56=0294H C2=32 768/30 =0444HC3=32 768/12=0aabH C4=32 768/2=4000H这里用小写字母表示小数,用大写字母表示相应小数Q15格式的定点数。
DSP28335生成正弦波的程序

IFR = 0x0000;
InitPieVectTable();
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.EPWM1_INT = &epwm1_timer_isr;
ERTM;
{
asm(" NOP");
}
}
void InitEPwm1Example()
{
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;//zhuyi
EPwm1Regs.TBPRD = PRD; //载波周期=2*1500TBCLK
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV2;
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // Load registers every ZERO_PRD
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
//float Q;
#define PWM1_INT_ENABLE 1
#define PWM2_INT_ENABLE 1
#define PWM3_INT_ENABLE 1
void InitEPwm1Example(void);
//void InitEPwm2Example(void);
// cmp2[i]=(Uint16)(EvaRegs.T1PR*0.25*(1+M*sin((2*i)*PI/N+PI*4/3)+1+M*sin((2*i+1)*PI/N+PI*4/3)));
基于dsp技术的正弦信号发生课程设计

DSP原理与应用结课作业设计课题:针对基于DSP正弦信号发生器的改进与研究学院名称:电气工程学院专业班级:自动F1203学生姓名:张帅学号: 201223910508指导教师:张世杰第一章:绪论数字信号处理(Digital Signal Processing,简称DSP)是一门涉及许多学科而又广泛应用于许多领域的新兴学科。
20世纪60年代以来,随着计算机和信息技术的飞速发展,数字信号处理技术应运而生并得到迅速的发展。
数字信号处理是一种通过使用数学技巧执行转换或提取信息,来处理现实信号的方法,这些信号由数字序列表示。
在过去的二十多年时间里,信号处理已经在通信等领域得到极为广泛的应用。
图一是数字信号处理系统的简化框图。
此系统先将模拟信号转换为数字信号,经数字信号处理后,再转换成模拟信号输出。
其中抗混叠滤波器的作用是将输入信号x(t)中高于折叠频率的分量滤除,以防止信号频谱的混叠。
随后,信号经采样和A/D转换后,变成数字信号x(n)。
数字信号处理器对x(n)进行处理,得到输出数字信号y(n),经D/A转换器变成模拟信号。
此信号经低通滤波器,滤除不需要的高频分量,最后输出平滑的模拟信号y(t)。
图一数字信号处理系统简化框图数字信号处理是以众多学科为理论基础的,它所涉及的范围极其广泛。
例如,在数学领域,微积分、概率统计、随机过程、数值分析等都是数字信号处理的基本工具,与网络理论、信号与系统、控制论、通信理论、故障诊断等也密切相关。
近来新兴的一些学科,如人工智能、模式识别、神经网络等,都与数字信号处理密不可分。
可以说,数字信号处理是把许多经典的理论体系作为自己的理论基础,同时又使自己成为一系列新兴学科的理论基础。
第二章:TMS320C54x芯片介绍1.总线结构C54x 包括8 条16 比特宽度的总线,其中:一条程序总线(PB):传送取自程序存储器的指令代码和立即操作数三条数据总线(CB、DB、EB):将内部个单元连接在一起,CB和DB传送读自数据存储器的数据,EB传送写入存储器的数据四条地址总线(PAB CAB DAB EAB):传送执行指令所需的地址2.C P UC54x 的CPU 结构包括:40 比特的ALU ,其输入来自16 比特立即数、16 比特来自数据存储器的数据、暂时存储器、T 中的16 比特数、数据存储器中两个16 比特字、数据存储器中32 比特字、累加器中40 比特字。
DSP正弦函数计算程序的编写

摘要泰勒级数展开法作为一种数学方法,在科研和平时的数据处理方面应用的很广泛。
尤其是在通信、仪器仪表和工业控制等领域应用更为广泛。
在科技高速发展的今天,对函数的计算不仅要求有很高的精度,还对计算的时间又很高的要求,必须在很短的时间内完成数据的处理,否则根本不能完成大批量数据的实时性计算和处理。
介于DSP芯片运算速度快的特点,用DSP芯片完成这些算法已越来越受到重视。
产生正弦波,分别是查表法和泰勒级数展开法。
查表法应用于精度要求不很高的场合,而泰勒级数展开法是一种比查表法更为有效的方法。
它能精确的计算出一个角度的正弦和余弦值,且占用的储存空间较小,体现了它的优越性。
关键词: DSP 泰勒级数正弦波目录摘要 (I)1、正余弦信号发生器的实现原理 (1)1.1、正弦波信号发生器 (1)2、正弦波的实现 (2)2.1、计算一个角度的正弦值 (2)2.2、计算一个角度的余弦值 (4)3、正弦波的实现 (8)4、链接文件 (10)5、调试结果 (12)总结 (13)参考文献 (14)1、正余弦信号发生器的实现原理1.1、正弦波信号发生器泰勒级数展开法是根据泰勒展开式进行计算来实现正弦信号,它能精确地计算出一个角度的正弦和余弦值,且只需要较小的存储空间。
本次主要用泰勒级数展开法来实现正弦波信号。
正弦函数和余弦函数可以展开成泰勒级数,其表达式:3579sin()3!5!7!9!x x x x x x =-+-+-2468cos()12!4!6!8!x x x x x =-+-+-取泰勒级数的前5项,得近似计算式:35792222sin()3!5!7!9!111123456789(((())))x x x x x x xx x x x =-+-+=----⨯⨯⨯⨯ 24682222cos()12!4!6!8!11112345678((()))x x x x x x xx x =-+-+=----⨯⨯⨯ 递推公式:sin(nx ) = 2cos(x )sin[(n -1)x ]-sin[(n -2)x ] cos(nx ) = 2cos(x )sin[(n -1)x ]-cos[(n -2)x ]由递推公式可以看出,在计算正弦和余弦值时,需要已知cos(x )、sin(n -1)x 、sin(n -2)x 和cos(n -2)x 。
基于DSP的正弦波.上斜波,下斜波,梯形波,方波等波形函数发生器源程序

要求可以使用拨码开关控制波形的输出,其对照如下:#include "DSP281x_Device.h" // DSP281x Headerfile Include File #include "DSP281x_Examples.h" // DSP281x Examples Include File #include "f2812a.h"#define DIPS (*(unsigned int *)0xc0001)// Prototype statements for functions found within this file.// interrupt void ISRTimer2(void);void dac_loop(void);typedef unsigned char uint8; /*开始*/typedef unsigned int uint16;typedef unsigned long uint32;uint8 const code ZXB_code[256]={0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf4,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe3,0xe1,0xde,0xdc,0xda,0xd8,0xd6,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,0x96,0x92,0x8f,0x8c,0x89,0x86,0x83,0x80,0x7d,0x79,0x76,0x73,0x70,0x6d,0x6a,0x67,0x64,0x61,0x5e,0x5b,0x58,0x55,0x52,0x4f,0x4c,0x49,0x46,0x43,0x41,0x3e,0x3b,0x39,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27,0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x14,0x12,0x10,0xf,0xd,0xc,0xb,0x9,0x8,0x7,0x6,0x5,0x4,0x3,0x3,0x2,0x1,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x3,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xa,0xc,0xd,0xe,0x10,0x12,0x13,0x15,0x17,0x18,0x1a,0x1c,0x1e,0x20,0x23,0x25,0x27,0x29,0x2c,0x2e,0x30,0x33,0x35,0x38,0x3b,0x3d,0x40,0x43,0x46,0x48,0x4b,0x4e,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,0x66,0x69,0x6c,0x6f,0x73,0x76,0x79,0x7c};/*结束*/void main(void){InitSysCtrl();dac_loop();}void dac_loop(void){int i,j,m,k;i=0;//m=DIPS&0x0f;for(;;){ m=DIPS&0x0f;if(m==0) //拨码开关值为0,显示上斜波形for(i=0;i<=0xfff;i+=0x10){DA_DA TA_L=i&0xff; //第一通道数据输出量低8位DA_DA TA_H=((i>>8)&0x0f)|DA_CHN1; //第一通道数据输出量高8位和通道号1DA_CTL=0;for(j=0;j<0x10;j++);}if(m==1) //拨码开关值为1,显示下斜波形for(i=0;i<=0xfff;i-=0x10){DA_DATA_L=i&0xff; //第一通道数据输出量低8位DA_DATA_H=((i>>8)&0x0f)|DA_CHN1; //第一通道数据输出量高8位和通道号1DA_CTL=0;for(j=0;j<0x10;j++);}if(m==2) //拨码开关值为2,显示三角波形{for(i=0;i<=0xfff;i+=0x10){DA_DATA_L=i&0xff; //第一通道数据输出量低8位DA_DATA_H=((i>>8)&0x0f)|DA_CHN1; //第一通道数据输出量高8位和通道号1DA_CTL=0;for(j=0;j<0x10;j++);}for(k=0xfff;k>=0;k-=0x10){DA_DA TA_L=k&0xff; //第一通道数据输出量低8位DA_DA TA_H=((k>>8)&0x0f)|DA_CHN1; //第一通道数据输出量高8位和通道号1DA_CTL=0;for(j=0;j<0x10;j++);}}if(m==3) //拨码开关值为3,显示梯形波{for(i=0;i<=0xfff;i+=0x50){DA_DATA_L=i&0xff; //第一通道数据输出量低8位DA_DATA_H=((i>>8)&0x0f)|DA_CHN1; //第一通道数据输出量高8位和通道号1DA_CTL=0;for(j=0;j<0x10;j++);}for(i=0;i<=0xfff;i+=0x50){DA_DATA_L=0xff; //第一通道数据输出量低8位DA_DATA_H=0x0f|DA_CHN1; //第一通道数据输出量高8位和通道号1DA_CTL=0;for(j=0;j<0x10;j++);}for(i=0xfff;i>=0;i-=0x50){DA_DA TA_L=i&0xff; //第一通道数据输出量低8位DA_DA TA_H=((i>>8)&0x0f)|DA_CHN1; //第一通道数据输出量高8位和通道号1DA_CTL=0;for(j=0;j<0x10;j++);}for(i=0xfff;i>=0;i-=0x50){DA_DA TA_L=0; //第一通道数据输出量低8位DA_DA TA_H=0|DA_CHN1; //第一通道数据输出量高8位和通道号1DA_CTL=0;for(j=0;j<0x10;j++);}}if(m==4) //拨码开关值为4,显示方波{for(i=0;i<=0xfff;i+=0x50){DA_DATA_L=0xff; //第一通道数据输出量低8位DA_DATA_H=0xf|DA_CHN1;//第一通道数据输出量高8位和通道号1DA_CTL=0;for(j=0;j<0x15;j++); //更改频率}for(i=0;i<=0xfff;i+=0x50){DA_DATA_L=0; //第一通道数据输出量低8位DA_DATA_H=0|DA_CHN1; //第一通道da数据输出量高8位和通道号1DA_CTL=0;for(j=0;j<0x15;j++); //更改频率}}////////if(m==5) //拨码开关值为5,显示更改频率后的上斜波形for(i=0;i<=0xfff;i+=0x10){DA_DA TA_L=i&0xff; //第一通道数据输出量低8位DA_DA TA_H=((i>>8)&0x0f)|DA_CHN1; //第一通道数据输出量高8位和通道号1DA_CTL=0;for(j=0;j<0x31;j++); //更改频率}if(m==6) //拨码开关值为6,显示更改频率后的下斜波形for(i=0;i<=0xfff;i-=0x10){DA_DATA_L=i&0xff; //第一通道数据输出量低8位DA_DATA_H=((i>>8)&0x0f)|DA_CHN1; //第一通道数据输出量高8位和通道号1DA_CTL=0;for(j=0;j<0x15;j++); //更改频率}if(m==7) //拨码开关值为7,显示更改频率后的三角波形{for(i=0;i<=0xfff;i+=0x10){DA_DATA_L=i&0xff; //第一通道数据输出量低8位DA_DATA_H=((i>>8)&0x0f)|DA_CHN1; //第一通道数据输出量高8位和通道号1DA_CTL=0;for(j=0;j<0x31;j++); //更改频率}for(k=0xfff;k>=0;k-=0x10){DA_DA TA_L=k&0xff; //第一通道数据输出量低8位DA_DA TA_H=((k>>8)&0x0f)|DA_CHN1; //第一通道数据输出量高8位和通道号1DA_CTL=0;for(j=0;j<0x31;j++); //更改频率}}if(m==8) //拨码开关值为8,显示更改频率后的梯形波形{for(i=0;i<=0xfff;i+=0x50){DA_DATA_L=i&0xff; //第一通道数据输出量低8位DA_DATA_H=((i>>8)&0x0f)|DA_CHN1; //第一通道数据输出量高8位和通道号1DA_CTL=0;for(j=0;j<0x31;j++); //更改频率}for(i=0;i<=0xfff;i+=0x50){DA_DATA_L=0xff; //第一通道数据输出量低8位DA_DATA_H=0x0f|DA_CHN1; //第一通道数据输出量高8位和通道号1DA_CTL=0;for(j=0;j<0x31;j++); //更改频率}for(i=0xfff;i>=0;i-=0x50){DA_DA TA_L=i&0xff; //第一通道数据输出量低8位DA_DA TA_H=((i>>8)&0x0f)|DA_CHN1; //第一通道数据输出量高8位和通道号1DA_CTL=0;for(j=0;j<0x31;j++); //更改频率}for(i=0xfff;i>=0;i-=0x50){DA_DA TA_L=0; //第一通道数据输出量低8位DA_DA TA_H=0|DA_CHN1; //第一通道数据输出量高8位和通道号1DA_CTL=0;for(j=0;j<0x31;j++) ;//更改频率}}if(m==9) //拨码开关值为9,显示更改频率后的方波{for(i=0;i<=0xfff;i+=0x50){DA_DATA_L=0xff; //第一通道数据输出量低8位DA_DATA_H=0xf|DA_CHN1;//第一通道数据输出量高8位和通道号1DA_CTL=0;for(j=0;j<0x31;j++); //更改频率}for(i=0;i<=0xfff;i+=0x50){DA_DATA_L=0; //第一通道数据输出量低8位DA_DATA_H=0|DA_CHN1; //第一通道da数据输出量高8位和通道号1DA_CTL=0;for(j=0;j<0x31;j++); //更改频率}}if(m==10) //拨码开关值为10,显示更改频率后的正弦波{uint16 data x;while(1){for(x=0;x<256;x++){DA_DA TA_L =ZXB_code[x]&0xff;DA_DA TA_H=(( ZXB_code[x]>>8)&0x0f)|DA_CHN1;DA_CTL=0;}}}}}。
关于DSP的一些反正切查表算法的编写

关于DSP的一些反正切查表算法的编写一直在拿TMS20F28335做电机控制,也从早前的简单寄存器IO口配置时代过渡到了真正的算法时代,很不适应,起初去查各种书籍,网上搜索各种网站,发现书本上讲的很多都是快速傅里叶啊啥的,找不到很原始的像啥低通滤波器,正弦,正切这些函数的编写。
起初写程序发现,C2000的库里支持啥正弦函数,浮点预算,反正弦函数,开根运算等算法,好兴奋。
用了才知道,太慢了,根本没法用在工程上。
关于三角函数的编写,其实都是利用查表发,查表法大家应该都懂。
这个就不再赘述,怎样去查一个正弦表呢?这里做一个基本的介绍。
首先,你可以自己写一个查表数组,也可以在程序初始化生成一个。
Eg:void SinCOS_TAB(void){unsigned char i;float Theta;for(i=0;i<TAB_Max;i++) // #define TAB_Max 180{Theta = i * Step_Angle; // Step_Angle=1.74532925E-02Sin_tab[i] =sin(Theta); // 生成正弦表数组,利用了库里现成的SIN函数Cos_tab[i] =cos(Theta); // 生成余弦表数组}}为啥我的数组里面只有180个元素呢?一:我的精度要求不高,我是一度一个步进角的,如果你要更高的精度,你可以选择容量更大的数组。
二:我不想因为庞大的浮点数组占据太大的存储空间,所以我利用了奇函数,偶函数的原理再次,就进入正题写查表程序,就我们初中数学所知,正弦函数是奇函数,余弦函数是偶函数,所以我只用了360角度中的一半。
下面为正弦查表程序:/*Refer to the truth that DSP use some SinCos operation will use six or more command* periods , So I look up the pre_generate SINCOS_TAB to speed up the Execution speed*/float SinF(float single){int i=(int)(single*180/pi);float value=0;if(i<0)value = -Sin_tab[i];elsevalue = Sin_tab[i];return value;}看起来应该很简单吧,余弦,正切,余切的编写和上面基本相似。
正弦函数计算程序的编写

1 正余弦的泰勒级数展开式高等数学中,正弦函数和余弦函数可以展开的泰勒级数,其表达试如下:-+-+-=!x !x !x !x x x 9753)sin(9753 (1)-+-+-=!x !x !x !x x 86421)cos(8642 (2)若要计算一个角度x 的正弦和余弦值,可取泰勒级数的前五项进行计算。
!x !x !x !x x x 9753)sin(9753+-+-=⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛----=9*817*615*413*212222x x x x x (3) !x !x !x !x x 86421)cos(8642+-+-=⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛----=8*716*514*31212222x x x x (4) 由式(3)和(4)可得导出递推公式,即])2sin[(])1sin[()cos(2)sin(x n x n x nx ---= ])2cos[(])1sin[()cos(2)cos(x n x n x nx ---=由递推公式可以看出,在计算正弦和余弦值时,不仅需要已知cos(x),而且需要x n )1sin[(-、x n )2sin[(-和x n )2cos[(-。
2 存储空间的分配在正弦函数的计算程序所需要的存储空间有四个已初始化的数据段table_s 与若干个程序段组成的已初始化段和九个存储空间未初始化段,分别为:d_xs 、d_squr_xs 、d_temp_s 、d_sinx 、c_1_s 、d_coef_s(4个存储空间)。
其存储空间分布如下:图2.1 计算正弦值存储单元分配3 迭代法计算正弦值3.1 迭代法正弦值的计算流程图其中n a 随迭代次数的变化而变化1a =9*81、2a =6*71、3a =4*51、4a =2*31(1) 执行第一次迭代:DL *AR5,B图3.1.1 迭代法正弦值的计算流程图MASR *AR3+,*AR2+,B,AMPYA ASTH A,*AR3 执行结果:d_temp_s= ⎪⎪⎭⎫⎝⎛-8*7122x x(2) 执行第二次迭代:MASR *AR3-,*AR2+,B,AMPYA *AR3+ST B,*AR3 执行结果:d_temp_s= ⎪⎪⎭⎫⎝⎛⎪⎪⎭⎫ ⎝⎛--8*717*61222x x x 执行第三次迭代:||DL *AR5,BMASR *AR3-,*AR2+,B,A MPYA *AR3+ ST B,*AR3 执行结果:d_temp_s= ⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛---8*717*614*512222x x x x 执行第四次迭代:||DL *AR5,BMASR *AR3-,*AR2+,B,ASTM #d_xs,AR3 执行结果:d_temp_s= ⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛----8*717*614*512*312222x x x x x 即可粗略的求的sinx 的值为d_temp_s 中的值3.2 正弦函数计算程序.title "sin.asm".mmregs.def start.ref sin_start,d_xs,d_sinxSTACK: .usect "STACK",10H ;定义堆栈空间S tart: STM #STACK+10,SP ;给堆栈指针赋值栈顶LD #d_xs,DPST #6487H,d_xsCALL sin_startend: B endsin_start:.def sin_startD_coef_s .usect "coef_s",4.dataTable_s: .word 01C7H ;C1=01C7H.word 030bH ;C2=030bH.word 0666H ;C3=0666H.word 1556H ;C4=1556Hd_xs .usect "sin_vars",1 ;定义未初始化段d_squr_xs .usect "sin_vars",1d_temp_s .usect "sin_vars",1d_sinx .usect "sin_vars",1c_1_s .usect "sin_vars",1.textSSBX FRCT ;设置小数乘法STM #d_coff_s,AR4RPT #3MVPD #table_s,*AR4+ ;c1=1/72,c2=1/42,c3=1/20;c4=1/6STM #d_coef_s,AR2STM #d_xs,AR3STM #c_1_s,AR5 ;AR5指向C_1_SST #7FFFH,c_1_sSQUR *AR3+,A ;求x的平方值ST A,*AR3 ;把x平方值放入(AR3)||DL *AR5,B ;B=1MASR *AR3+,*AR2+,B,A ;A=(1-x^2)/72;T = x^2 MPYA A ;A=x^2(1-x^2)/72STH A,*AR3 ; AR3=d_temp_s= x^2(1-x^2)/72MASR *AR3-,*AR2+,B,A ; A = 1-x^2/42(1-x^2/72); T =x^2(1-x^2/72)MPYA *AR3+ ; B = X^2(1-x^2/42(1-x^2/72))ST B,*AR3 ; AR3=d_temp_s=B||DL *AR5,BMASR *AR3-,*AR2+,B,A;A=1-x^2/20(1-x^2/42(1-x^2/7 2)MPYA*AR3+ ;B=(1-x^2/20(1-x^2/42(1-x^2/72))*x^2ST B,*AR3; d_temp_s= B = (1-x^2/20(1-x^2/42(1-x^2/72))*x^2||DL *AR5,BMASR *AR3-,*AR2+,B,A;A=1-x^2/6(1-x^2/20(1-x^2/42(1-x^2/72))*x^2STM #d_xs,AR3MPYA AR3;B=x(1-x^2/6(1-x^2/20(1-x^2/42(1-x^2/72 ))*x^2)STH B, d_sinx ; d_sinx=b 的出结果RET.end4 复位向量文件和链接文件4.1 复位向量文件程序中所用的复位向量文件如下:.sect ".vectors".ref start ; C entry point.align 0x80 ; must be aligned on page boundaryRESET: ; reset vectorBD start ; branch to C entry point .end4.2 链接文件链接命令文件是将链接的信息放在一个文件中,这在多次使用同样的链接信息时,可以方便地调用。
dsp-正弦波信号发生器课程设计.

※※※※※※※※※※2009级学生DSP原理※※※※及应用课程设计※※※※※※※※※※太原理工大学DSP原理及应用课程设计报告书课题名称正弦波信号发生器姓名学号院、系、部专业正弦波信号发生器课程设计一、课程设计基础数字信号处理(Digital Signal Processing,简称DSP)是一门涉及许多学科而又广泛应用于许多领域的新兴学科。
数字信号处理是利用计算机或专用处理设备,以数字的形式对信号进行分析、采集、合成、变换、滤波、估算、压缩、识别等加工处理,以便提取有用的信息并进行有效的传输与应用。
数字信号处理是以众多学科为理论基础,它所涉及的范围极其广泛。
如数学领域中的微积分、概率统计、随机过程、数字分析等都是数字信号处理的基础工具。
它与网络理论、信号与系统、控制理论、通信理论、故障诊断等密切相关。
一个典型的DSP系统应包括抗混叠滤波器、数据采集A/D转换器、数字信号处理器DSP、D/A转换器和低通滤波器等组成。
DSP信号处理过程:①将输入信号x(t)进行抗混叠滤波,滤掉高于折叠频率的分量,以防止信号频谱的混叠;②经采样和A/D转换器,将滤波后的信号转换为数字信号x(n);③数字信号处理器对x(n)进行处理,得数字信号y(n);④经D/A转换器,将y(n)转换成模拟信号;⑤经低通滤波器,滤除高频分量,得到平滑的模拟信号y(t)。
二、课程设计目的1、了解DSP对数据的处理能力2、利用DSP实现正弦信号发生器三、课程设计总体方案1. 总体方案设计①基于DSP的特点,本设计采用TMS320C54X系列的DSP作为正弦信号发生器的核心控制芯片。
②用泰勒级数展开法实现正弦波信号。
③设置波形时域观察窗口,得到其滤波前后波形变化图;④设置频域观察窗口,得到其滤波前后频谱变化图。
2. 正弦波信号发生器正弦波信号发生器已被广泛地应用于通信、仪器仪表和工业控制等领域的信号处理系统中。
通常有两种方法可以产生正弦波,分别为查表法和泰勒级数展开法。
基于DSP的三角函数快速计算

3.2 DSP 实现 另外由于该算法的实现过程中不需要跳转指令 因此可 以很好地利用 DSP 的 SIMD 特性同时得到多个数据的运算结 果 算法中的多项式可以采用秦九韶算法来减少计算的次数 和提高计算的并行度 举例来说 对于多项式 (2) y = ax 4 + bx 3 + cx 2 + dx + e 以秦九韶的方式可以表示为
0050132dsp实现另外由于该算法的实现过程中不需要跳转指令以很好地利用dsp的simd特性同时得到多个数据的运算结因此可果算法中的多项式可以采用秦九韶算法来减少计算的次数和提高计算的并行度以秦九韶的方式可以表示为计算式2一般需要20条指令果保留并调整运算顺序最少也需要11条指令要8条指令即可完成计算可以将3式进一步调整为来增加算法的并行度该调整方式对于高阶多项式尤为有效举例来说对于多项式2edxcxbxaxy234exdxcxbaxy若将x的幂次方作为中间结3而式3仅需为了避免dsp中产生指令相关exdcxxbaxy344查表法41算法介绍查表法适用于各种计算起来很耗时的函数其想法是将某些点的函数值构造成表以便需要时查找一般只在函数定义域的部分区间内造表称这个选取的部分区间为造表区间记为r用关键点nnxxxx110?l将造表区间划分成若干份查找表中记录的只是点nnxxxx110?l的函数值常采取的划分方法是等距划分由此定义造表间距iixxd?1有时我们会采用插值的方法常采用线性插值来得到介于关键点之间点的函数值42算法分析查表法主要有表的大小精度分析和快速索引3个问题需要考虑由于存储空间的限制查找表不可能无限大因此查找法适合计算定义域有限的函数或者周期性函数可只在一个周期内构造查找表l带插值的查表法与不带插值的查表法的精度分析结果表的大小是造表区间与造表间距的比从下面的分析可看出表的大小对精度影响值即dr不同对于不带插值的查表法由于介于关键点之间点的函数值必须用两个关键点中的某个点的函数值来近似因此在函数斜率最大的点误差最大对于xsin来说由于它的斜率最大为01cos因此误差上限是2x?cosx具有类似的结果计算正弦函数的误差曲线y轴为计算误差的因变量从图中可以看出表的长度与精度的关系图1分别是用表长为32与64的不带插值查表法x轴为正弦函数对于带插值的情况仅考虑线性插值12xx?插值公式是xx1121xxxfxfff??xsin在x点的近似值为sinsinx122112sinxxxxxxxx???误差可以表示为x122112sinsinsinxxxxxxxxxe????5将公式5绝对值号中的式子求导并令之为0sinsincos12?xx由上式可得xxx可得012??xxx6221所以每个插值段中最大误差出现在中点处其中最大误差为xxx??2121211221sinsinsin22exxxxxxxxx???
DSP课程设计--正弦信号发生器的设计

DSP课程设计–正弦信号发生器的设计简介正弦信号发生器是一种常见的电子信号发生器。
在数字信号处理中,正弦信号是非常重要的一种基础信号。
在本次课程设计中,我们将使用MATLAB软件设计一个正弦信号发生器。
设计步骤步骤一:信号采样我们的信号采样频率为fs,即每秒采样多少个点。
首先我们需要设置采样频率。
信号采样频率的选取需要满足采样定理,保证采样信号能够完全还原原信号。
我们使用MATLAB的“fs”命令设置采样频率。
假设我们的采样频率为10KHz,代码为:fs = 10000; % 设置采样频率为10KHz步骤二:生成时域正弦信号根据正弦波方程,我们可以生成时域上的正弦信号:f0 = 1000; % 正弦信号的频率为1kHzA = 1; % 正弦信号的幅度为1Vt = 0:1/fs:1; % 假设信号长度为1秒y = A * sin(2 * pi * f0 * t);代码中,我们生成了一个正弦信号,频率为1kHz,幅度为1V,信号长度为1秒,并将其存放在y变量中。
步骤三:对信号进行FFT变换为了验证我们生成的信号是否正确,我们需要对信号进行FFT变换。
FFT变换可以将一个时域信号转化为频域信号。
我们使用MATLAB的“fft”命令对信号进行FFT变换。
代码如下:Y = fft(y); % 对信号y进行FFT变换,得到频域信号YL = length(y); % 计算信号的长度P2 = abs(Y/L); % 取FFT变换结果的绝对值,然后除以长度LP1 = P2(1:L/2+1);P1(2:end-1) = 2*P1(2:end-1);f = fs*(0:(L/2))/L; % 生成频率坐标轴代码中,我们使用FFT变换对信号y进行变换,并将结果存放在Y变量中。
然后我们根据FFT变换结果,得到频率分量以及对应的幅度分量。
步骤四:绘制频域正弦信号最后,我们使用MATLAB的plot函数绘制频域信号采样结果图。
DSP FIR算法实验

实验5: 有限冲激响应滤波器(FIR)算法实验一.实验目的1.掌握用Matlab设计FIR数字滤波器的原理和方法。
2.掌握FIR数字滤波器的DSP实现方法。
3. 熟悉在CCS环境中信号波形的观察方法。
二.实验设备PC兼容机一台,操作系统为Windows2000,安装Code Composer Studio 4.2软件。
三.实验原理1.采用MATLAB设计FIR数字滤波器采用MATLAB设计FIR数字滤波器的方法有多种,本实验采用fir1函数,使用方法简介如下:(1)设计低通滤波器,格式为:b=fir1(N,Wn)或b = fir1(N,Wn,'low')其中N+1为滤波器阶数,b为返回的长度为N+1的系数向量。
Wn为归一化边界频率,0 < Wn < 1.0,Wn 处增益为-6dB。
Wn =1.0对应的非归一化频率为Fs/2,其中Fs为采样频率。
例,设Fs=8000Hz,低通滤波器的边界频率fp=1000Hz,则对应的归一化数字角频率为Wn=fp/(Fs/2)=0.25,取N=31(对应的滤波器阶数为32)。
于是,该低通fir滤波器的设计指令为b=fir1(31,0.25)。
执行该指令得到的系数为:b=[-0.000630469148644,-0.001818568124278,-0.002561941612458,-0.001587493994396,0.002369512668975,0.008332496978353,0.011803612855041,0.00675929677933,-0.009174511997729,-0.029730906886036,-0.039816452266422,-0.022301647638688,0.031027965907247,0.111143500492515,0.192455402100706,0.243730203886485,0.243730203886485,0.192455402100706,0.111143500492515,0.031027965907247,-0.022301647638688,-0.039816452266422,-0.029730906886036,-0.009174511997729,0.00675929677933,0.011803612855041,0.008332496978353,0.002369512668975,-0.001587493994396,-0.002561941612458,-0.001818568124278,-0.000630469148644]注意: 上述滤波器系数为浮点格式,当DSP程序中采用整数格式时。
dsp课程设计正弦

dsp课程设计正弦一、教学目标本章节的教学目标是使学生掌握正弦函数的基本概念、性质和图像,能够运用正弦函数解决实际问题。
具体目标如下:1.知识目标:学生能够准确理解正弦函数的定义,掌握正弦函数的性质,包括周期性、对称性和奇偶性;了解正弦函数的图像特点,能够绘制出正弦函数的图像。
2.技能目标:学生能够运用正弦函数解决简单的三角问题,如求解角度、计算三角函数值等;能够利用正弦函数进行函数图像的变换,如平移、伸缩等。
3.情感态度价值观目标:学生能够积极参与课堂讨论,提出问题并解决问题;通过学习正弦函数,培养对数学的兴趣和好奇心,提高对数学美的欣赏能力。
二、教学内容本章节的教学内容主要包括正弦函数的定义、性质、图像以及应用。
具体安排如下:1.第一课时:正弦函数的定义和性质,包括周期性、对称性和奇偶性。
2.第二课时:正弦函数的图像,包括绘制方法和平移、伸缩等变换。
3.第三课时:正弦函数的应用,包括解决三角问题和实际应用问题。
三、教学方法为了激发学生的学习兴趣和主动性,本章节将采用多种教学方法:1.讲授法:教师通过讲解正弦函数的定义、性质和图像,引导学生理解正弦函数的基本概念。
2.讨论法:学生分组讨论正弦函数的应用问题,培养学生的合作能力和解决问题的能力。
3.案例分析法:教师给出实际应用问题,引导学生运用正弦函数进行解决,提高学生的实际应用能力。
4.实验法:学生进行正弦函数图像的绘制实验,培养学生的实验操作能力和观察能力。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将准备以下教学资源:1.教材:正弦函数的相关内容,包括定义、性质、图像和应用。
2.参考书:提供额外的学习资料,帮助学生深入理解正弦函数的相关知识。
3.多媒体资料:正弦函数的图像动画演示,帮助学生直观地理解正弦函数的图像特点。
4.实验设备:绘图板、尺子等,用于学生进行正弦函数图像的绘制实验。
五、教学评估本章节的评估方式将包括以下几个方面:1.平时表现:通过观察学生在课堂上的参与度、提问回答和小组讨论的表现来评估学生的学习态度和理解程度。
DSP28335生成正弦波的程序

DSP28335⽣成正弦波的程序//产⽣周期变化的正弦波#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File #include "DSP2833x_Examples.h" // DSP2833x Examples Include File #include "IQmathLib.h"#include "qmath.h"#include "math.h"#define N 33#define PI 3.1415925#define PRD 600float M=0.8;int i;//double a[N];//unsigned int n=0;//float Q;#define PWM1_INT_ENABLE 1#define PWM2_INT_ENABLE 1#define PWM3_INT_ENABLE 1void InitEPwm1Example(void);//void InitEPwm2Example(void);//void InitEPwm3Example(void);interrupt void epwm1_timer_isr(void);//interrupt void epwm2_timer_isr(void);//interrupt void epwm3_timer_isr(void);//void InitCmp();//extern Uint16 NN,MM;//Uint16 NN=24,MM=1;//Uint16 n=0;Uint16 cmp1[360],cmp2[360],cmp3[360];Uint32 EPwm1TimerIntCount;Uint32 EPwm2TimerIntCount;Uint32 EPwm3TimerIntCount;void main(void){InitSysCtrl();InitEPwm1Gpio();// InitEPwm2Gpio();// InitEPwm3Gpio();DINT;InitPieCtrl();IER = 0x0000;IFR = 0x0000;InitPieVectTable();EALLOW; // This is needed to write to EALLOW protected registers PieVectTable.EPWM1_INT = &epwm1_timer_isr;// PieVectTable.EPWM2_INT = &epwm2_timer_isr;// PieVectTable.EPWM3_INT = &epwm3_timer_isr;EDIS;EALLOW;SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; // Stop all the TB clocksEDIS;InitEPwm1Example();// InitEPwm2Example();// InitEPwm3Example();// InitCmp();EALLOW;SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;EDIS;EPwm1TimerIntCount = 0;EPwm2TimerIntCount = 0;EPwm3TimerIntCount = 0;IER |= M_INT3;PieCtrlRegs.PIEIER3.bit.INTx1 = PWM1_INT_ENABLE;// PieCtrlRegs.PIEIER3.bit.INTx2 = PWM2_INT_ENABLE;// PieCtrlRegs.PIEIER3.bit.INTx3 = PWM3_INT_ENABLE;EINT; // Enable Global interrupt INTMERTM;{asm(" NOP");}}void InitEPwm1Example(){EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;//zhuyiEPwm1Regs.TBPRD = PRD; //载波周期=2*1500TBCLKEPwm1Regs.TBPHS.half.TBPHS = 0x0000; // Phase is 0EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;EPwm1Regs.TBCTR = 0x0000;EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up downEPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Disable phase loadingEPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2; // Clock ratio to SYSCLKOUTEPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV2;EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // Load registers every ZERO_PRD EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; //??EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;// EPwm1Regs.CMPA.half.CMPA =1000;EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // Clear PWM1A on CAUEPwm1Regs.AQCTLA.bit.CAD = AQ_SET;EPwm1Regs.AQCTLB.bit.CAU = AQ_SET; // SET PWM1B on CAU,输出互补波形EPwm1Regs.AQCTLB.bit.CAD = AQ_CLEAR;//set dead band//设置中断EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_PRD; //? Select INT on Zero Prd eventEPwm1Regs.ETSEL.bit.INTEN = PWM1_INT_ENABLE; // Enable INTEPwm1Regs.ETPS.bit.INTPRD = ET_1ST;}/*void InitCmp(){// Uint16 i = 0;if(i{cmp1[i]=(Uint16)(EPwm1Regs.TBPRD*0.25*(1+M*sin((2*i)*PI/N)+1+M*sin((2*i+1)*PI/N)));// cmp2[i]=(Uint16)(EvaRegs.T1PR*0.25*(1+M*sin((2*i)*PI/N+PI*4/3)+1+M*sin((2*i+1)*PI/N+PI*4/3))); // cmp3[i]=(Uint16)(EvaRegs.T1PR*0.25*(1+M*sin((2*i)*PI/N+PI*2/3)+1+M*sin((2*i+1)*PI/N+PI*2/3))); i++;}else{i=0;}}*///⽐较值是按正弦波变化的interrupt void epwm1_timer_isr(void){if(i{// cmp1[i]=(Uint16)(EPwm1Regs.TBPRD*sin((2*i)*PI/N)cmp1[i]=(Uint16)(EPwm1Regs.TBPRD*0.25*(1+M*sin((2*i)*PI/N)+1+M*sin((2*i+1)*PI/N)));// cmp2[i]=(Uint16)(EvaRegs.T1PR*0.25*(1+M*sin((2*i)*PI/N+PI*4/3)+1+M*sin((2*i+1)*PI/N+PI*4/3))); // cmp3[i]=(Uint16)(EvaRegs.T1PR*0.25*(1+M*sin((2*i)*PI/N+PI*2/3)+1+M*sin((2*i+1)*PI/N+PI*2/3))); EPwm1Regs.CMPA.half.CMPA = cmp1[i];i++;}else{i=0;}EPwm1Regs.ETCLR.bit.INT = 1;PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计任务书题目正弦函数计算程序的编写专业、班级学号姓名主要内容、基本要求、主要参考资料等:1、参考课本,正弦函数的泰勒级数展开式及C54X Mnemonic InstructionSet.pdf ,编写正弦函数的计算程序。
2、要求程序能够进行3次以上的叠代运算,计算一个数的正弦值。
3、要求用汇编语言书写,其中汇编语言源文件要求具有已初始化段,未初始化段,代码段的定义。
4、完成上述要求程序的编写并在CCS5000编译连接通过并验证计算结果,设计完成后要求每人上交一份课程设计说明书,说明书要求包含有课程设计任务书,各文件的说明,各文件里关键语句的说明。
说明书要求字迹工整、叙述清楚。
5、发挥部分,如时间可行,增加设计成为一个完整的项目(附加一个命令文件和一个向量表文件)。
并验证结果。
6、时间:一周。
完成期限:指导教师签名:课程负责人签名:2013 年 12 月 30 日目录引言 (2)1 正余弦的泰勒级数展开式 (3)2 存储空间的分配 (4)3 迭代法计算正弦值 (5)3.1、迭代法正弦值的计算流程图 (5)3.1、正弦函数计算程序 (7)4 复位向量文件和链接文件 (9)4.1、复位向量文件 (9)4.2、链接文件 (9)5 调试结果 (10)6 设计体会 (12)参考文献 (12)引言正弦作为一种数学方法,在科研和平时的数据处理方面应用的很广泛。
尤其是在通信、仪器仪表和工业控制等领域应用更为广泛。
在科技高速发展的今天,对函数的计算不仅要求有很高的精度,还对计算的时间又很高的要求,必须在很短的时间内完成数据的处理,否则根本不能完成大批量数据的实时性计算和处理。
介于DSP芯片运算速度快的特点,用DSP芯片完成这些算法已越来越受到重视。
通常有两种方法可以产生正弦波,分别是查表法和泰勒级数展开法。
查表法应用于精度要求不很高的场合,而泰勒级数展开法是一种比查表法更为有效的方法。
它能精确的计算出一个角度的正弦和余弦值,且占用的储存空间较小,体现了它的优越性。
1 正余弦的泰勒级数展开式高等数学中,正弦函数和余弦函数可以展开的泰勒级数,其表达试如下:-+-+-=!x !x !x !x x x 9753)sin(9753 (1) -+-+-=!x !x !x !x x 86421)cos(8642 (2) 若要计算一个角度x 的正弦和余弦值,可取泰勒级数的前五项进行计算。
!x !x !x !x x x 9753)sin(9753+-+-= ⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛----=9*817*615*413*212222x x x x x (3) !x !x !x !x x 86421)cos(8642+-+-= ⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛----=8*716*514*31212222x x x x (4) 由式(3)和(4)可得导出递推公式,即])2sin[(])1sin[()cos(2)sin(x n x n x nx ---=])2cos[(])1sin[()cos(2)cos(x n x n x nx ---=由递推公式可以看出,在计算正弦和余弦值时,不仅需要已知cos(x),而且需要x n )1sin[(-、x n )2sin[(-和x n )2cos[(-。
2 存储空间的分配在正弦函数的计算程序所需要的存储空间有四个已初始化的数据段table_s 与若干个程序段组成的已初始化段和九个存储空间未初始化段,分别为:d_xs 、d_squr_xs 、d_temp_s 、d_sinx 、c_1_s 、d_coef_s(4个存储空间)。
其存储空间分布如下:计算正弦值存储单元分配3 迭代法计算正弦值3.1、迭代法正弦值的计算流程图其中n a 随迭代次数的变化而变化1a =9*81、2a =6*71、3a =4*51、4a =2*31(1) 执行第一次迭代:||DL *AR5,B迭代法正弦值的计算流程图MASR *AR3+,*AR2+,B,AMPYA ASTH A,*AR3执行结果: d_temp_s= ⎪⎪⎭⎫ ⎝⎛-8*7122x x (2) 执行第二次迭代:MASR *AR3-,*AR2+,B,AMPYA *AR3+ST B,*AR3执行结果:d_temp_s= ⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛--8*717*61222x x x 执行第三次迭代:||DL *AR5,BMASR *AR3-,*AR2+,B,A MPYA *AR3+ST B,*AR3执行结果:d_temp_s= ⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛---8*717*614*512222x x x x 执行第四次迭代:||DL *AR5,BMASR *AR3-,*AR2+,B,ASTM #d_xs,AR3执行结果: d_temp_s= ⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛----8*717*614*512*312222x x x x x 即可粗略的求的sinx 的值为d_temp_s 中的值3.1、正弦函数计算程序.title "sin.asm".mmregs.def start.ref sin_start,d_xs,d_sinxSTACK: .usect "STACK",10H ;定义堆栈空间S tart: STM #STACK+10,SP ;给堆栈指针赋值栈顶LD #d_xs,DPST #6487H,d_xsCALL sin_startend: B endsin_start:.def sin_startD_coef_s .usect "coef_s",4.dataTable_s: .word 01C7H ;C1=01C7H.word 030bH ;C2=030bH.word 0666H ;C3=0666H.word 1556H ;C4=1556Hd_xs .usect "sin_vars",1 ;定义未初始化段d_squr_xs .usect "sin_vars",1d_temp_s .usect "sin_vars",1d_sinx .usect "sin_vars",1c_1_s .usect "sin_vars",1.textSSBX FRCT ;设置小数乘法STM #d_coff_s,AR4RPT #3MVPD #table_s,*AR4+ ;c1=1/72,c2=1/42,c3=1/20;c4=1/6STM #d_coef_s,AR2STM #d_xs,AR3STM #c_1_s,AR5 ;AR5指向C_1_SST #7FFFH,c_1_sSQUR *AR3+,A ;求x的平方值ST A,*AR3 ;把x平方值放入(AR3)||DL *AR5,B ;B=1MASR *AR3+,*AR2+,B,A ;A=(1-x^2)/72;T = x^2 MPYA A ;A=x^2(1-x^2)/72STH A,*AR3 ; AR3=d_temp_s= x^2(1-x^2)/72MASR *AR3-,*AR2+,B,A ; A = 1-x^2/42(1-x^2/72); T =x^2(1-x^2/72)MPYA *AR3+ ; B = X^2(1-x^2/42(1-x^2/72))ST B,*AR3 ; AR3=d_temp_s=B||DL *AR5,BMASR *AR3-,*AR2+,B,A;A=1-x^2/20(1-x^2/42(1-x^2/7 2)MPYA*AR3+ ;B=(1-x^2/20(1-x^2/42(1-x^2/72))*x^2ST B,*AR3; d_temp_s= B = (1-x^2/20(1-x^2/42(1-x^2/72))*x^2||DL *AR5,BMASR *AR3-,*AR2+,B,A;A=1-x^2/6(1-x^2/20(1-x^2/42(1-x^2/72))*x^2STM #d_xs,AR3MPYA AR3;B=x(1-x^2/6(1-x^2/20(1-x^2/42(1-x^2/72 ))*x^2)STH B, d_sinx ; d_sinx=b 的出结果RET.end4 复位向量文件和链接文件4.1、复位向量文件程序中所用的复位向量文件如下:.sect ".vectors".ref start ; C entry point.align 0x80 ; must be aligned on page boundaryRESET: ; reset vectorBD start ; branch to C entry point .end4.2、链接文件链接命令文件是将链接的信息放在一个文件中,这在多次使用同样的链接信息时,可以方便地调用。
在命令文件中可使用两个十分有用的伪指令MEMORY和SECTIONS,用来指定实际应用中的存储器结构和地址的映射。
在命令行中不能使用这两个伪指令,命令文件为ASCⅡ文件,可包含一下内容:(1)输入文件名,用来指定目标文件、存档库或其他命令文件。
注意,当命令文件调用其他文件时,该调用语句必须是最后一句,连接器不能从被调用的命令文件中返回。
(2)连接器选项,他们在命令文件中的使用方法于在命令行中相同。
(3)MEMORY和SECTIONS链接伪指令,MEMORY用来指定目标存储器结构,SECTIONS用来控制段的构成于地址分配程序中所用到的链接文件如下:vectors.objsinx.obj-o a1.out-m a1.map-e startMEMORY{PAGE 0: EPROG: origin = 0x1400, len = 0x7c00 VECT: origin = 0xff80, len = 0x80 PAGE 1: USERREGS: origin = 0x60, len = 0x1cBIOSREGS: origin = 0x7c, len = 0x4IDATA: origin = 0x80, len = 0x1380 EDATA: origin = 0x1400, len = 0x8000 EDATA1: origin = 0x9400, len = 0x4c00 }SECTIONS{ .vectors: {} > VECT PAGE 0.sysregs: {} > BIOSREGS PAGE 1.data: {} > EPROG PAGE 0.text: {} > EPROG PAGE 0.cinit: {} > EPROG PAGE 0.pinit: {} > EPROG PAGE 0.sysinit: {} > EPROG PAGE 0.stack: {} > IDATA PAGE 1.bss: {} > IDATA PAGE 1.sin_vars: {} > IDATA PAGE 1}5 调试结果第一次叠代计算结果:A=004E4510A4B=007FFF0000T=4EF3AR2=0061AR3=1428AR4=0094SP=0089第二次叠代计算结果:A=007E230000B=004DCCCA72T=4EF3AR2=0093AR3=0095AR4=0094SP=0089第三次叠代计算结果:A=007C1B0000B=004C8C0F42T=4EF3AR2=0094AR3=0095AR4=0094SP=0089第四次叠代计算结果:A=00733D0000B=0013356EFCT=1556AR2=0094AR3=0094AR4=0094SP=008A116 设计体会一周的课程设计很快结束了,从刚接触课程设计时的无从下手,到最后的完成,收获了很多。