基于DSP技术的QAM调制器设计方案_第1页
基于DSP技术的QAM调制器设计方案_第2页
基于DSP技术的QAM调制器设计方案_第3页
基于DSP技术的QAM调制器设计方案_第4页
基于DSP技术的QAM调制器设计方案_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于DSP技术的QAM调制器设计方案01071099刘樵1、 QAM概述正交幅度调制(QAM,Quadrature Amplitude Modulation)是一种在两个正交载波上进行幅度调制的调制方式。这两个载波通常是相位差为90度(/2)的正弦波,因此被称作正交载波。这种调制方式因此而得名。同其它调制方式类似,QAM通过载波某些参数的变化传输信息。在QAM中,数据信号由相互正交的两个载波的幅度变化表示。模拟信号的相位调制和数字信号的PSK可以被认为是幅度不变、仅有相位变化的特殊的正交幅度调制。由此,模拟信号频率调制和数字信号FSK也可以被认为是QAM的特例,因为它们本质

2、上就是相位调制。这里主要讨论数字信号的QAM,虽然模拟信号QAM也有很多应用,例如NTSC和PAL制式的电视系统就利用正交的载波传输不同的颜色分量。类似于其他数字调制方式,QAM发射信号集可以用星座图方便地表示。星座图上每一个星座点对应发射信号集中的一个信号。设正交幅度调制的发射信号集大小为N,称之为N-QAM。星座点经常采用水平和垂直方向等间距的正方网格配置,当然也有其他的配置方式。数字通信中数据常采用二进制表示,这种情况下星座点的个数一般是2的幂。常见的QAM形式有16-QAM、64-QAM、256-QAM等。星座点数越多,每个符号能传输的信息量就越大。但是,如果在星座图的平均能量保持不变

3、的情况下增加星座点,会使星座点之间的距离变小,进而导致误码率上升。因此高阶星座图的可靠性比低阶要差。当对数据传输速率的要求高过8-PSK能提供的上限时,一般采用QAM的调制方式。因为QAM的星座点比PSK的星座点更分散,星座点之间的距离因之更大,所以能提供更好的传输性能。但是QAM星座点的幅度不是完全相同的,所以它的解调器需要能同时正确检测相位和幅度,不像PSK解调只需要检测相位,这增加了QAM解调器的复杂性。M-QAM信号波形的表达式为:其中g(t)为码元信号脉冲。因此QAM可以分解为分别在两个正交的载波cos2fct与sin2fct上的M1-PAM与M2-PAM的叠加,其中M1M2

4、0;= M。将上面sm(t)变形得到其中,m = arctan(Ams / Amc)。因此,M-QAM还可以看作是M1-PAM与M2-PSK的叠加,其中M1M2 = M。2、DSP技术 2.1 DSP实现QAM调制的方案设计 用数字方法实现QAM调制器不同于用模拟方法实现,特别是在本课题中,所有模块功能都是集中在一个芯片(DSP芯片)上实现的,因此不再进行明确的分工,而是通过星座图直接分析各种模式的调制器的结果,使调制器能够按照输入数据产生相应的调制输出结果。为了使QAM调制器的速率尽可能高,必须使调制的处理过程尽量短,因此让大量的处

5、理工作都在调制处理前完成,即进行大量的初始化。用DSP实现QAM调制的设计思路如下: 一、产生各种模式QAM调制所需的各种幅值的数字正、余弦波形,即抑制载波的双边带调制后得到的各种幅值的数字正、余弦波形。二、根据输入数据,选择相应幅值的正、余弦数字波形进行叠加,从而得到QAM调制的数字输出结果。 第一步即为初始化过程,它是一个不影响调制器波特率的处理过程,可分为三个步骤完成:1、在DSP上产生数字正弦波。2、对数字正弦波均匀采样,通过选择合适的采样点数M,从而产生频率可变的数字正、余弦波。3、对采样后的频率可变的数字正、余弦波进行处理,产生QAM调制所需的各种幅值的正、余弦波。其设计流图如图1

6、.1: 在DSP上产生数字正弦波 根据输入数据,进行QAM调制对数字正弦波进行均匀采样产生调制所需的各种幅值的正、余弦波形 图1.1 DSP实现QAM调制的设计流图 2.2 各模块的实现方法 (1) 在DSP上产生数字的正弦波 在模拟设计中,正弦波是通过振荡器产生,而数字方法中正弦波是由软件编程实现的。因为处理器能够处理的信息都是数字的,因此只能通过数字计算的方法产生正弦波。模拟在DSP上产生数字正弦波对数字正弦波进行均匀采样产生调制所需的各种幅值的正、余弦波形根据输入数据,进行QAM调制正弦波采样即得到了数字正弦波,根据这种思路,可以得到数字正弦波的产生方法:通过数字计算方法计算出一个正弦周

7、期内的若干个正弦值,将这些值作为一个集合,只要循环读取这个离散值的集合即可产生数字正弦波,其实质就是对模拟正弦波进行采样。为了便于读取正弦波,通常对正弦波进行均匀采样,即使集合中的数据为一个正弦周期内均匀取点的数值的正弦值。 根据泰勒公式: f(x)=f(x。)+f'(x。)(x-x。)+f''(x。)/2!*(x-x。)2,+f'''(x。)/3!*(x-x。)3+f(n)(x。)/n!*(x-x。)n+Rn(x) (1.1) 其中在a与x之间,可以得到: sinx=x-x3/3!+x5/5!-x7/7!+x9/9!(1.2) cosx=1-x

8、2/2!+x4/4!-x6/6!+x8/8!(1.3) 通过(1.2)、(1.3)两个公式,我们可以用数字计算的方法求出任意数值的正、余弦值,应当注意公式中的x是一个弧度值。为了便于产生频率可变的正、余弦波,对正弦波的采样点数应尽量多些,即用(1.3)、(1.4)计算时,x间的差值尽量小些。以0.5o为间隔求0o45o间的90个点的sin(x)、cos(x)值,根据sin(2x)=2sinxcosx,从而得到以1o为间隔的0o90o间的90个点的sin(x)值,再经过数据复制和求反即可产生0o360o间的360点的sin(x)值,通过循环读取这360个数据,即可产生数字正弦波。 (2) 频率可

9、变的数字正弦波的产生 由于产生的正弦波是360点的,若将其作为载波,则需要读取360次才能产生一个周期的正弦波,相对调制而言,这将需要非常长的时间。而实际上,读取360点是完全没有必要的,对于一个正弦波只要适当地读取两个以上的点就能够准确地体现它的特性,这在处理时间上将缩短几十倍甚至上百倍,因而还需对360点的数字正弦波均匀采样,通过控制采样点数M,即可产生频率可变的数字正、余弦波。为了使等间隔均匀采样产生的正弦波是一个整波形,必须保证M是360的一个因子。采样点数为M,则采样间隔为360/M。对于正弦波产生而言,直接对360点数字正弦波进行等间隔均匀采样,即能产生M点的数字正弦波;而对于余弦

10、波的产生而言,必须先对正弦波的90o360o进行等间隔均匀采样,再对0o90o进行等间隔采样,从而产生M点的数字余弦波。 (3) 产生QAM调制所需的各种幅值的正、余弦波 为了使QAM调制的波特率尽可能高,必须使QAM调制处理时的工作量尽可能少,因此必须把所有调制要输出的各种幅值都事先准备好,使调制处理只需完成由输入数据到输出数据的一个对应过程。对于不同进制数的QAM调制,从其星座图可以看出,所需的正、余弦波的幅值是各不相同。把从星座图得到的各种模式的QAM调制的幅值变化,转化为DSP中的数据表示形式如下:(因为正、余弦值的取值范围为-11之间,在DSP中用Q15格式表示数据形式。) 4QAM

11、:幅值只有一个,为1。 16QAM:有两个幅值,为1、1/3。 1/3*32768=2AAAh 64QAM:有四个幅值,为1、5/7、3/7、1/7。 5/7*32768=5B6Dh 3/7*32768=36DBh 1/7*32768=1249h 256QAM:有八个幅值,为1、13/15、11/15、9/15、7/15、5/15、3/15、1/15。 13/15*32768=6EEEh 11/15*32768=5DDDh 9/15*32768=4CCCh 7/15*32768=3BBBh 5/15*32768=2AAAh 3/15*32768=1999h 1/15*32768=0888h 将

12、M点数字正、余弦波形的所有数据乘以以上的各幅值的数据表示值,即得到相应幅值的正、余弦波形的数据。为了便于寻址读取和仿真,将同一模式QAM的各幅值数据存放于一个连续的存储区。 (4) 根据输入数据,选择相应幅值的正、余弦数字波形进行QAM调制 先对输入口进行判断,根据输入口数据选用不同的QAM调制。各模式的QAM调制,其实现方法基本相同,进行QAM调制时按以下条件设计: 􀁺 用AR1指向正弦载波路中经过处理的应当输出的正弦波数据,AR2指向余弦载波路中经过处理的应当输出的余弦波数据,则QAM输出为它们指向数据之和。 􀁺 用AR5指向与输入数据相对应的某一幅值的

13、正弦波数据,AR6指向与输入数据相对应的某一幅值的余弦波数据,便于读取波形数据。 􀁺 AR1、AR2指向的数据即为AR5、AR6经过处理后的数据。 􀁺 将时钟信号接到BIO引脚,用时钟信号来控制读取输入数据,该时钟也是采样时钟。当引脚输入为高电平时读入数据,并进行处理,而引脚输入为低电平时继续检测引脚输入。为了保证不出错,应当使每一次的处理时间在1/2时钟周期和1个时钟周期之间。 􀁺 每次读入数据后,和前一次读入数据相比,若不同则表明新数据到来,此时应根据输入数据判断其相应的幅值,修改地址指针AR5和AR6,使其指向正确的幅值。若相同则表明

14、新数据尚未到或到来的新数据和上次输入数据相同,应在原来幅值的数据块中循环寻址。 􀁺 如何根据输入新数据,修改地址指针AR5和AR6,使其指向正确幅值的数据呢?先通过映射表,把具体的星座图编码转变成一种具有简单规律的、易实现的星座图编码,这种星座图的规律为:符号位0表示+,1表示-,数据位按从大到小分别对应从大到小的各种幅值。完成映射后,根据映射后的数据修改地址指针AR5、AR6。按照QAM调制的进制数M的不同,可以有两种修改地址的方法。编程时先判断对应的幅值修改地址,再判断符号位,且按幅值修改地址的操作只在新数据到来时进行,而判断符号位的操作却在每次处理时都进行,这样可以使无

15、论新数据到来与否,处理过程在时间上都相差不大,同时不影响处理所需的最长时间。 其中提到的两种修改地址的方法如下:当QAM进制数较小时,对映射后数据进行逐比特判断,然后修改AR5、AR6。当然如果不考虑程序的普遍适用性,可以不用映射表,直接对输入数据进行逐比特判断,再修改地址指针。 以16QAM映射后数据1001为例:(编程时让低位送正弦载波路,高位送余弦载波路) 正弦载波路:01,符号位为0表示正幅值,数据位为1表示幅值为1,若数据位为0则幅值为1/3,此时应修改地址AR5,使其指向幅值为1的正弦波数据的起始位置。 余弦载波路:10,符号位为1表示负幅值,数据位为0表示幅值为1/3,若数据位为

16、1则幅值为1,此时应修改地址AR6,使其指向幅值为1/3的余弦波数据的起始位置。 当QAM进制数较大时,根据映射后数据与地址修改量的以下规律可以简化地址修改的过程。 (假设采用8点采样,每个基带数据对应两个整波形,既每个码元对应16个点的波形,这里只研究数据位以判断相应的幅值) 16QAM:1(幅值为1) bx(bx+16*0=bx+16*(1-1) 0(幅值为1/3) bx+16(bx+16*1=bx+16*(1-0) (数据位最大值为1) 64QAM:11(幅值为1) cx(cx+16*0=cx+16*(3-3) 10(幅值为5/7) cx+16(cx+16*1=cx+16*(3-2) 0

17、1(幅值为3/7) cx+32(cx+16*2=cx+16*(3-1) 00(幅值为1/7) cx+48(cx+16*3=cx+16*(3-0) (数据位最大值为3) 256QAM:111(幅值为1) dx(dx+16*0=dx+16*(7-7) 110(幅值为13/15) dx+16(dx+16*1=dx+16*(7-6) 101(幅值为11/15) dx+32(dx+16*2=dx+16*(7-5) 100(幅值为9/15) dx+48(dx+16*3=dx+16*(7-4) 011(幅值为7/15) dx+64(dx+16*4=dx+16*(7-3) 010(幅值为5/15) dx+80

18、(dx+16*5=dx+16*(7-2) 001(幅值为3/15) dx+96(dx+16*6=dx+16*(7-1) 000(幅值为1/15) dx+112(dx+16*7=dx+16*(7-0) (数据位最大值为7) 从上面的分析结果能够看出,地址修改量和映射后数据有一种线性关系,且正、余弦载波路都符合这种规律,因此可以根据输入新数据的数据位的值控制地址指针的修改。具体实现方法为:将数据位最大值减去输入新数据映射后的数据位值,计算出重复修改地址的次数,而每次修改地址都是地址指针加一个固定值,该固定值为一个输入码元对应的波形的采样点数。64QAM中重复修改地址的次数为数据位最大值3减去输入数

19、据映射后的数据位值,修改地址程序如下:(B为3-输入新数据映射后的数据位值,AR0存放了地址修改的固定值) a: STM #cx,AR5 ;指向初始地址后修改 STL B,*AR7 ;置循环次数 RPT *AR7 ;输入数据控制循环次数 MAR *AR5+0 ;修改指针 MAR *AR5-0 ;循环了B+1次,宜循环B次 b: 程序中,当输入为新数据时执行a段程序,而输入数据不变时,跳过a段程序。为了使不同情况下执行时间相差不大,a段程序指令不宜太多。 虽然进制数小的QAM也具有上述规律,但用上述方法实现进制数较小的QAM时,在指令上,并没有比逐比特判断修改地址方法少,所以进制数较小的QAM仍

20、用逐比特判断来修改地址指针AR5、AR6。 2.3 技术难点分析 (1)数据如何输入的问题 数据输入有串行和并行输入方式,本程序中将使用并行输入。尽管在调制器框图中是串行输入,然后经过串/并转换的,但是在程序中实现串/并转换无疑将占用一定的时间。为了使调制器速率尽可能快,同时考虑到DSP拥有并行接口,我们将用硬件来换取速率,将串/并转换功能由外部硬件实现,而程序中只考虑并行输入数据。而并行输入数据中哪几位送正弦载波路,哪几位送余弦载波路,由每种具体的调制进行具体的判断。 (2)新数据的判断问题 判断新输入的到来,最简单的方法是用计数器,设每位输入数据对应M个点,则计数器记到M时表示新数据到来,

21、虽然能准确判断新数据的到来,但程序实现计数功能毕竟也需占用一定的时间。考虑到选用并行输入,串/并转换器将输出的并行数据锁存在锁存器中,即QAM调制的输入数据并不是时刻变化的,而只在新码元到来时才发生变化。因此我们采用保存上次输入数据的方法,将输入新数据和上次保存数据相比,看是否相同来确定是否为新数据的方法,不同则表示输入数据为新数据,反之不是新数据。但是用这种方法判断,在输入新数据和上次数据相同时,并不判断为新数据到来,为了不让寻址出错,必须采用循环寻址的方法。 (3)输入新数据和上次输入数据相同时的循环寻址问题8无论上述哪一种修改地址的方法,在输入新数据和上次输入数据相同时,程序不根据此数据

22、进行幅值的地址修改,宜在原来幅值的存储单元的内循环寻址,以免出错。但是进行循环寻址要求缓冲区地址始于最低N位为零的地址,且缓冲区的大小R值满足R<2N,当地址的低N位值大于R时,低N位自动清0,从而实现循环寻址。程序中R=16,N必须为5(占个存储单元),这样各种幅值的数据就不能连在一起存放。因此为了循环寻址,必须使同种QAM的各种幅值数据间间隔32,而不是16。若将各幅值数据连续存储,即间隔为16,则不能用循环寻址,此时只能判断缓冲区地址的低4位,当低4位为0时,将地址减16,使地址重新指向原来幅值的起始位置(如程序中所用)。 3225= (4)循环次数的置数问题 循环次数不设置为B-

23、1,使其直接循环B次,而将循环次数设置为B,循环B+1次,然后再做一次与循环操作相反的操作。这是因为当B为0时,在DSP中循环次数置数为FFFFH,程序执行时,虽然最后地址也修改正确了,但通过测试程序执行时间,发现执行完该段程序后指令周期数突然增加到一个很大的值,原因是要循环的指令执行了FFFF+1次,而不是0次。为了使B为0时,执行时间不出现异常,让程序先多做一次循环,循环完后再做一次反循环,从而达到循环B次的目的。 (5)映射表问题 为了使QAM调制器有更强的适应性,使其能适应不同星座图编码的调制,而不是对不同星座图编码用不同的程序实现,程序中增加了映射表。这样针对不同编码方式的星座图,只

24、需修改映射表,就可以用该调制器实现具体的调制。更重要的是用映射表后可以使数据更有规律性,使QAM调制更容易实现,尤其是对一些进制数较大的QAM调制。 应当考虑的是,使用映射表并不会影响调制器的性能。实际上即使不用映射表,由于信道噪声引起误码时,通过星座图译码后误码仍然存在,而使用映射表时,通过映射表和星座图译码,误码也存在,不同的只是译出的误码结果不一样而已。那么为什么要用不同星座图编码呢?目的是减小根据星座图译码时发生错误译码的可能性,同时还有一定的保密作用。以格雷码编码星座图为例,当传输数据相邻时,它们的编码只差一位,这样在干扰严重而引起误码时,虽然译出的结果是错误的,但可以在前一个译出的

25、星座点周围寻找这个含干扰的星座点进行译码,从而减小译码错误的概率。若加上映射表,在干扰严重而引起误码时,译码出来的结果也是错误的,但同样可以在前一个译码出来的星座点周围寻找着这个含干扰的星座点进行译码,同样能减小错误概率,因而不影响性能。 由于加入映射表,因此判断输入数据是否为新数据有两种方法。一、直接对输入数据进行判断,看本次输入数据是否和上次输入数据是否相同,此时保留的上次数据为输入数据。二、对映射后的数据进行判断,因为如果输入数据相同,那它们的映射后数据也相同,看映射后数据与上次的映射后数据是否相同,因此此时保留的是上次输入数据的映射后数据。程序中用第二种方法,因为后面程序也是对映射后数

26、据进行处理的,可以从指令上和资源上减少消耗。3. QAM调制器的DSP汇编语言实现 3.1 DSP汇编语言编程技术 用计算机语言编写程序,一般分为三种,即机器语言、汇编语言、高级语言。 机器语言是一种用二进制表示指令和数据,能被机器直接识别的计算机语言。它不直观,不易理解和记忆,因此编写、阅读和修改都比较繁琐,但机器语言程序是计算机惟一能够直接理解和执行的程序,具有执行速度快、占用内存少等特点。 高级语言(如BASIC、C)是一种容易为人识别记忆的面向过程的语言,程序员可以完全不考虑机器的结构特点,不必了解和熟记机器的指令系统,仅使用一些接近人们书写习惯的英语和数学表达式形式的语句来编制程序。

27、高级语言编写的程序与问题本身的数学模型之间有着良好的对应关系,可以在各种机器上通用,但不能在机器上直接执行,需要通过编译(或解释)程序翻译成对应的目标程序(即机器语言程序),才能被机器运行。高级语言程序是在未考虑机器的结构特点的条件下编写的,不能充分利用CPU所具有的特性,通过编译程序生成的目标程序往往比较冗长、占有较多的内存空间,执行时间也较长,因而实时性要求高的场合限制了它的运用。 汇编语言是一种用助记符表示的程序设计语言,即用助记符来表示指令的操作码和操作数,用标号或符号来代表地址、常量或变量。助记符一般都是英文字的缩写,以便人们书写、阅读和检查。实际上,汇编语言编写的汇编语言源程序就是

28、机器语言程序的符号表示,源程序与经过汇编产生的目标程序代码之间有明显的对于关系,因此也称汇编语言为符号语言。用汇编语言编写的源程序也需要翻译成目标程序才能被机器执行,这个翻译过程称为汇编。用汇编语言编写程序能够直接利用硬件系统的特性(如寄存器、标志、中断系统等)直接对位、字节、字寄存器或存储单元、I/O端口进行处理,同时也能直接使用CPU指令系统和指令系统提供的各种寻址方式,因而能编制出高质量的程序,这样的程序不但占用内存空间少、而且执行速度快。由于源程序和所要解决的问题的数学模型之间的关系不够直观,使得汇编语言程序设计需要较多的软件开发时间,也增加了程序设计过程中出错的可能性。 在C54xD

29、SP中,软件设计的方法通常有三种。 第一种,用C语言开发。TI公司提供了用于C语言开发的CCS(Code Composer Studio)平台,该平台包括了优化ANSI C编译器,从而可以在C源程序级进行开发调试。这种方式可以增强软件的可读性,提高了软件的开发速度,方便软件的修改和移植,然而,C编译器无法实现在任何情况下都能合理的利用DSP芯片的各种资源,且对DSP芯片的某些硬件控制,C语言不如汇编语言方便。 第二种,用汇编语言开发。此种方式代码效率高,程序执行速度快,可以充分合理地利用芯片提供的硬件资源。然而,用汇编语言编写程序比较烦琐,可读性较差,开发产品周期长,不同类别或不同公司的芯片汇

30、编语言往往不同,因此可移植性较差。 第三种,C和汇编语言混合编程开发。采用混合编程的方法能更好地达到设计要求,完成设计任务。 鉴于提高QAM调制器的数据传输率的要求和汇编语言开发具有的代码效率高,程序执行速度快,并能充分合理地利用芯片提供的硬件资源的优点,我们将用汇编语言来开发QAM调制器。 C54xDSP中的汇编源程序由源说明语句组成,包含汇编语言指令、汇编伪指令、宏伪指令和注释等,一般一句程序占据编辑器的一行。由于汇编器每行最多只能读200个字符,因此源语句的字符数不能超过200个,一旦长度超过200个字符,汇编器将自行截去行尾的多余的字符并给出警告信息。如果截去了语句的执行部分,则程序会

31、编译出错或错误执行。汇编语言格式可以包含4个部分:标号域、指令域、操作数域和注释域,汇编语言语句格式如下:标号: 指令 操作数列表 ;注释其中 内的部分是可选项。C54xDSP的汇编指令按功能可分为:数据传送指令、算术运算指令、逻辑运算指令、程序控制指令。其中数据传送指令包括装载指令、存储指令、条件存储指令、并行装载和存储指令、并行装载和乘法指令、并行存储和加/减指令等。算术运算指令包括加法指令、乘法指令、乘法-累加指令、乘法-减法指令、双字运算指令及特殊应用指令。逻辑运算指令包括与、或、异或、移位、及测试指令。程序控制指令包括分支转移指令、子程序调用指令、中断指令、返回指令、重复指令、堆栈处

32、理指令及混合程序控制指令。 3.2 用汇编语言实现QAM调制器的关键模块 3.2.1 数字正弦波的产生 DSP中产生的正、余弦波形为数字波形,即用数字方法求出若干个点的正弦值,将这些值作为一个整体一一存储,通过循环读取即可产生数字正、余弦波形,其实质就是对模拟正弦波形进行采样。由sinx=x-x3/3!+x5/5!-x7/7!+x9/9! cosx=1-x2/2!+x4/4!-x6/6!+x8/8! 计算出以0.5o为间隔的0o45o的sin(x)、cos(x)值,再根据sin(2x)=2sinxcosx,求出以1o为间隔的0o90o的sin(x),经过复制和求反即产生0o360o间的360点

33、的sin(x)。程序如下:.title "sin.asm" ;文件名 .mmregs .def _c_int00 .ref sinx,d_xs,d_sinx,cosx,d_xc,d_cosx ;引用其他地方定义的变量 sin_x .usect "sin_x",360 ;定义360个存储空间 STACK .usect "STACK",10 ;定义堆栈段 k_theta .set 286 ;0.5/360*PI*32768 PA0 .set 0 ;定义两个端口 PA1 .set 1 .text *产生360点的正弦波* _c_int00:

34、 STM #STACK+10,SP ;SPSTACK+10 STM k_theta,AR0 ;AR0-k_theta STM 0,AR1 ;AR1=0(rad) STM #sin_x,AR6 ;AR6-sin_x STM #90,BRC ;from sin0-sin90 RPTB loop1-1 LDM AR1,A ;A=AR1 LD #d_xs,DP STL A,d_xs ;弧度值送给sin函数的输入 STL A,d_xc ;d_xc-x(rad) CALL sinx ;d_sinx=sinx CALL cosx ;d_cosx=cosx LD #d_sinx,DP LD d_sinx,16

35、,A ;AH=sinx MPYA d_cosx ;B=sinx*cosx STH B,1,*AR6+ ;AR6-2sinx*cosx MAR *AR1+0 ;AR1=AR1+0.5(弧度) loop1: STM #sin_x+89,AR7 ;sin91-sin179 STM #88,BRC ;循环次数为89次 RPTB loop2-1 LD *AR7-,A ;A=(AR7) STL A,*AR6+ ;(AR6)=A loop2: STM #179,BRC ;sin180-sin359 STM #sin_x,AR7 ;AR7=sin_x RPTB loop3-1 LD *AR7+,A NEG A

36、 STL A,*AR6+ ;sinx=-sin_x loop3: NOP loop: B loop *求正弦函数sinx=x-x3/3!+x5/5!-x7/7!+x9/9!* sinx: .def d_xs,d_sinx ;定义变量以便其他地方使用 .data table_s: .word 01c7h ;1/72*32768 .word 030bh ;1/42*32768 .word 0666h ;1/20*32768 .word 1556h ;1/6*32768 d_coef_s .usect "coef_s",4 ;定义系数空间 d_xs .usect "si

37、n_vars",1 ;sin函数的输入 d_squr_xs .usect "sin_vars",1 ;存放x的平方值 d_temp_s .usect "sin_vars",1 d_sinx .usect "sin_vars",1 ;sin函数的输出 d_l_s .usect "sin_vars",1 .text SSBX FRCT STM #d_coef_s,AR5 ;搬移系数 RPT #3 MVPD #table_s,*AR5+ STM #d_coef_s,AR3 STM #d_xs,AR2 ;AR2-

38、x STM #d_l_s,AR4 ST #7FFFh,d_l_s ;AR4-d_l_s=1 SQUR *AR2+,A ;A=x2 ST A,*AR2 ;(AR2)=x2 |LD *AR4,B ;B=1 MASR *AR2+,*AR3+,B,A ;A=1-x2/72 T=x2 MPYA A ;A=x2(1-x2/72) STH A,*AR2 ;(AR2)=x2(1-x2/72) MASR *AR2-,*AR3+,B,A ;A=1-x2/42(1-x2/72) MPYA *AR2+ ;B=x2(1-x2/42(1-x2/72) ;(AR2)=x2 ST B,*AR2 ;(AR2)=x2(1-x2/

39、42(1-x2/72) |LD *AR4,B ;B=1 MASR *AR2-,*AR3+,B,A ;A=1-x2/20(1-x2/42(1-x2/72) MPYA *AR2+ ;B=x2(1-x2/20(1-x2/42(1-x2/72) ST B,*AR2 |LD *AR4,B MASR *AR2-,*AR3+,B,A ;A=1-x2/6(1-x2/20(1-x2/42(1-x2/72) MPYA d_xs ;B=A*x STH B,d_sinx ;d_sinx=sinx RET *求余弦函数cosx=1-x2/2!+x4/4!-x6/6!+x8/8!* cosx: .def d_xc,d_c

40、osx d_coef_c: .usect "coef_c",4 ;定义系数空间 .data table_c: .word 0249h ;1/56*32768 .word 0444h ;1/30*32768 .word 0aabh ;1/12*32768 .word 4000h ;1/2*32768 d_xc .usect "cos_vars",1 ;cos函数的输入 d_squr_xc .usect "cos_vars",1 ;存放x的平方值 d_temp_c .usect "cos_vars",1 d_cosx

41、.usect "cos_vars",1 ;cos函数的输出 d_l_c .usect "cos_vars",1 .text SSBX FRCT LD #8,DP ;指向第8页,与连接文件有关 STM #d_coef_c,AR5 ;搬移系数 RPT #3 MVPD #table_c,*AR5+ STM #d_coef_c,AR3 STM #d_xc,AR2 STM #d_l_c,AR4 ST #7FFFh,d_l_c SQUR *AR2+,A ;A=x2 ST A,*AR2 ;(AR2)=x2 |LD *AR4,B MASR *AR2+,*AR3+,B,A

42、 ;A=1-x2/56 T=x2 MPYA A ;A=x2(1-x2/56) STH A,*AR2 ;(AR2)=x2(1-x2/56) MASR *AR2-,*AR3+,B,A ;A=1-x2/30(1-x2/56) MPYA *AR2+ ;B=x2(1-x2/30(1-x2/56) ST B,*AR2 |LD *AR4,B ;B=1 MASR *AR2-,*AR3+,B,A ;A=1-x2/12(1-x2/30(1-x2/56) SFTA A,-1,A ;1/2 NEG A ;-1/2 MPYA *AR2+ ;B=-x2/2(1-x2/12(1-x2/30(1-x2/56) MAR *AR

43、2+ RETD ADD *AR4,16,B STH B,d_cosx RET3.2.2 可调频率正交载波的产生 对360点正弦波直接进行等间隔采样,通过选择不同的采样点数M,即能产生频率可变的数字正弦波;对于M点正弦波,直接对360点正弦波均匀采样即可,而对于M点余弦波,先对360点正弦波的90o360o等间隔采样,再对0o90o等间隔采样,从而得到M点的数字余弦波。等间隔采样通过寻址地址每次递增一个固定的值来实现。程序如下:ax .usect "smp",32 ay .usect "smp",32 S .set 16-1 ;一个数据两个波形16个点 .

44、text *产生一个幅值的16点的正余弦波* STM #sin_x,AR2 ;AR2-sin_x STM #ax,AR3 ;AR3-ax STM #45,AR0 ;AR0=45 STM #7,BRC ;从sinx取8个点生成sinx RPTB loop4-1 LD *AR2+0,A ;每隔45个点取一个点 STL A,*AR3+loop4: STM #sin_x+90,AR1 STM #ay,AR4 STM #45,AR0 STM #5,BRC RPTB loop5-1 ;每隔45点采样6次 LD *AR1+0,A ;A=(AR1) STL A,*AR4+ ;(AR4)=A loop5: ST

45、M #sin_x,AR2 STM #1,BRC ;再取余弦所需的两个点 RPTB loop6-1 LD *AR2+0,A STL A,*AR4+ ;从sinx取8个点生成cosx loop6: STM #7,BRC ;由产生的正、余弦得到两个周期的波形 STM #ax,AR5 ;AR5-ax STM #ax+8,AR6 ;AR6ax+8 STM #ay,AR3 ;AR3-ay STM #ay+8,AR4 ;AR4ay+8 RPTB loopa-1 LD *AR5+,A ;A=(AR5) STL A,*AR6+ ;(AR6)=A LD *AR3+,A STL A,*AR4+ ;产生16点的两个波

46、形的sin,cos loopa:3.2.3 QAM已调波形的产生将M点数字正、余弦波形的所有数据乘以一个用DSP中数据表示的幅值,即得到相应幅值的正、余弦波形。16QAM的已调波形产生程序如下: bx .usect "smp",48 by .usect "smp",48 S .set 16-1 ;一个数据两个波形16个点 .text *产生两个幅值的16点的正余弦波* STM #S,BRC ;置循环次数 STM #bx,AR2 ;AR2-bx STM #ax,AR1 ;AR1-ax RPTB loop8-1 LD *AR1+,A STL A,*AR2+

47、;产生幅值为1的sin loop8: STM #ax,AR3 STM #S,BRC RPTB loop9-1 MPY *AR3+,#2AAAh,A ;2AAAh为1/3*32768 STH A,*AR2+ ;产生幅值为1/3的sin loop9: STM #by,AR4 ;AR4-by STM #ay,AR1 ;AR1-ay STM #S,BRC RPTB loop10-1 LD *AR1+,A STL A,*AR4+ ;产生幅值为1的cos loop10: STM #ay,AR2 ;AR2-ay STM #S,BRC RPTB loop11-1 MPY *AR2+,#2AAAh,A ;A=(

48、AR2)*1/3 STH A,*AR4+ ;产生幅值为1/3的cos loop11:3.2.4 QAM调制 根据QAM调制的实现方案,可以画出QAM调制的流程图(如图2.1)。图2.1a为16QAM调制流图,采用逐比特判断修改地址的方法进行调制;图2.1b为64QAM调制流图,采用根据规律重复修改地址的方法进行调制。由流程图能够方便地编写QAM调制的程序,64QAM的调制程序如下: *64QAM调制,85至103个指令周期* modu64: STM #b64,AR5 RPT #63 MVPD tab64,*AR5+ ;将表送到数据区 STM #cx+64,AR1 STM #cy+64,AR2

49、;AR1,AR2指向预留空间 STM #cx+48,AR5 STM #cy+48,AR6 ;AR5,AR6指向初值为0的波形 STM #out,AR4 ;AR4-out LD #14,DP ;设置页指针为14,700h-7FFh STM #16,AR0 ;AR0=16 STM #n,AR7 ;AR7-n STM #16,BK ;缓冲区为16个存储单元 ST #0,in+1 ;(in+1)=0 startc: XC 2,NBIO B startc PORTR PA1,in ;从PA1输入数据 STM #b64,AR3 ;AR3指向表头地址 LDM AR3,B ;表头地址送B ADD in,B ;

50、将读入数据与表头相加生成映射地址 STLM B,AR3 ;将生成映射地址送入AR3以便查表 NOP ;解除冲突 LD in+1,A ;输出上次查表数据LD *AR3,B ;将映射后的数据送入B XOR B,A ;A,B异或,结果放A,判断是否相同 STL B,in+1 ;保存映射后数据 RSBX TC XC 1,ANEQ ;映射后数据与上次映射后数据不同 SSBX TC ;则将测试位置为1,表示新数据到来 AND #011B,B,A ;A=(in+1)011测试低3bit SUB #3,A NEG A ;A=3-A,A为循环次数 BC a,TC ;新数据到来宜修改指针 B b a: STM #

51、cx,AR5 ;指向数据块初始地址后修改 STL A,*AR7 ;置循环次数 RPT *AR7 ;映射后数据控制循环次数 MAR *AR5+0 ;修改指针 MAR *AR5-0 ;循环了B+1次,宜循环B次 b: AND #4,B,A ;(in+1)与100相与判断符号 LD *AR5+,B NOP XC 1,AGT ;符号位为1时取反 NEG B STL B,*AR1 ;处理后的数据放(bx+32) LDM AR5,A ;A=AR5 AND #000Fh,A ;测试AR5的低4位 LD *AR3,B AND #011000B,B ;B=(AR3)011000测试高3bit XC 1,AEQ

52、;AR5低4位为0,即地址加了16次后 MAR *AR5-0 ;使地址回到该存储块起始位循环寻址 SFTA B,-3,A ;A=B>>3 SUB #3,A NEG A ;A=3-A,A为循环次数 XC 2,TC ;新数据到来时修改指针 B c B d c: STM #cy,AR6 ;AR6指向初始地址 STL A,*AR7 ;置循环次数 RPT *AR7 ;映射后数据控制循环次数 MAR *AR6+0 ;修改指针 MAR *AR6-0 ;循环了A+1次,宜循环A次 d: LD #32,A AND *AR3,A ;(AR3)与100000相与判断符号 LD *AR6+,B NOP X

53、C 1,AGT ;符号位为1取反 NEG B STL B,*AR2 LDM AR6,A ;A=AR6 AND #000Fh,A ;测试AR6的低4位 LD *AR1+%,B ADD *AR2+%,B STL B,*AR4 ;叠加后输出 XC 1,AEQ ;AR6低4位为0,即地址加了16次后 MAR *AR6-0 ;使地址回到该存储块起始位循环寻址 BD startc PORTW *AR4,PA24. QAM调制器的仿真与分析 4.1 QAM调制器的仿真 程序调通后,执行程序到调制处理前(即已调波形产生后),用波形显示已调波形。选择View/Graph/Time/Frequency,修改其中的

54、某些参数,起始地址为要显示数据的数据存放地址(0x0D40),获取缓冲区大小为需要显示数据块的大小(288),显示数据大小为用波形显示出的数据点数(288),DSP数据类型为16- bit signed integer, Q-value为15,点击OK显示波形。256QAM已调波形的仿真波形如图3.1,从仿真波形可以看出,程序产生了8个幅值的正、余弦波形,每个幅值含两个整周期。图3.1 256QAM已调波形的仿真波形在CCS中用星座图显示QAM调制器的星座图,选择View/Graph/ constellation,与波形显示相似,修改其中的某些参数,得到64QAM的星座图结果如图3.2。从星座

55、图可以看出,已调波形的幅值是正确的。图3.2 64QAM的星座图仿真为了在CCS中对调制结果进行软件仿真,需对程序进行一些修改。由于程序中都采用了间接寻址,使得所有辅助寄存器都分配给了程序,为了空出一个寄存器专门用于读入仿真输入数据,将指向循环次数的AR7寄存器空出,程序中所有*AR7改成绝对寻址*(n)或直接寻址n。将从端口读入数据的指令PORTR PA1,in改成从存储区读入数据LD *AR7+,B STL B,in,当然必须先把输入数据倒入存储区(在程序中某处设置探针,选择File/File I/0,打开File Input选项,点击Add File,选择数据文件后,点击Add Prob

56、e Point连接探针,在Probe Point中选择探针位置和在Connect中连接文件后,点击Replace,确定后回到File I/0对话框,Probe显示Connected,再输入与数据文件中一致的起始地址和长度,连接完成,执行程序到探针处时即会将数据倒入到存储区),使AR7指向倒入的数据。为了用波形显示调制结果,必须分配一块存储区保留调制处理的结果,对输出数据的地址进行修改,将指令中PORTW *AR4,PA2改成PORTW *AR4+,PA2。 运行程序后,用波形显示调制结果。选择View/Graph/Time/Frequency,修改其中的某些参数,起始地址为0x076C,获取缓

57、冲区大小为64(因为输入数据中只有四个数据),显示数据大小为64,DSP数据类型为16- bit signed integer,Q-value为15,点击OK显示波形。 64QAM输入为1,2,3,4时仿真如图3.3。通过数字电视的映射表映射后1,2,3,4分别对应001000B,000001B,001001B,011000B。1是幅值为1/7的正弦波与幅值为3/7的余弦波叠加,第一个点为0+3/7=3/7,2是幅值为3/7的正弦波与幅值为1/7的余弦波叠加,第一个点为0+1/7=1/7,3是幅值为3/7的正、余弦波叠加,第一个点为0+3/7=3/7,4是幅值为1/7的正弦波与幅值为1的余弦波叠加,第一个点为0+1=1。通过对第一个点和其他点的分析可以看出仿真结果是符合理论结果的,是正确的。图3.3 64QAM输入为1,2,3,4时的仿真图图3.4 64QAM输入为4,5,6,7时的仿真图输入为4,5,6,7时仿真如图3.4。通过数字电视的映射表映射后4,5,6,7分别对应011000B,010000B,011001B,010001B。4是幅值为1/7的正弦波与幅值为1的余弦波叠加,第一个点为0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论