正弦波信号产生理工.docx
- 文档编号:12094897
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:29
- 大小:210.58KB
正弦波信号产生理工.docx
《正弦波信号产生理工.docx》由会员分享,可在线阅读,更多相关《正弦波信号产生理工.docx(29页珍藏版)》请在冰豆网上搜索。
正弦波信号产生理工
第3章正弦波信号产生
3.1单频正弦波信号实验
3.1.1实验目的
⏹熟悉使用CCS集成环境,对程序进行编译、链接运行和仿真。
⏹学习使用定点数表示小数的方法及其在55xDSP中的运算。
⏹学习使用汇编语言编写计算一个正弦值和一个余弦值的子程序。
⏹掌握子程序调用和55xDSP块重复操作。
⏹学习正弦波发生器的实现。
3.1.2实验设备
⏹PC兼容机一台;操作系统为Windows2000(或WindowsNT、Windows98、WindowsXP)。
⏹计算机安装CCS5000或CCS3.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)
TMS320VC55x是16bit定点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=32768/72=01c7HS2=32768/42=030bH
S3=32768/20=0666HS4=32768/6=1556H
C1=32768/56=0294HC2=32768/30=0444H
C3=32768/12=0aabHC4=32768/2=4000H
这里用小写字母表示的实际小数值,用大写字母表示相应小数Q15格式的定点数。
下面这些算式表示如何在十六位定点DSPC55x上实现正弦值计算的方法,目的是让读者了解定点DSP如何实现小数运算。
由(3.1)式中每层括号计算出来的中间结果分别用小写字母kx1、kx2、kx3和kx4表示为:
kx1=1-x2/72
kx2=1-(x2/42)(1-x2/72))
kx3=1-(x2/20)(1-(x2/42)(1-x2/72)))
kx4=1-(x2/6)(1-(x2/20)(1-(x2/42)(1-x2/72)))
用大写的X表示实际小数x的定点Q15格式,则有:
X=32768*x
X2用Q30格式可以表示为:
X2=(32768*x)2=32768*(32768*x2)
用D_X表示x2的Q15格式为:
D_X=32768*x2=(2*X2)/65536
这里2*X2是表示要将Q30调整为Q31。
在程序执行中完成从Q30到Q31的调整需要左移1位,将会去掉小数乘法产生的多余符号位。
我们只需把状态寄存器ST1_55的FRCT比特位设置成1即可,除以65536是为了将Q31调整为Q15,只需取累加器高十六位即可,余下相同。
用大写字母KX1、KX2、KX3和KX4分别表示相应小数kx1、kx2、kx3和kx4的Q15格式的定点数,计算如下:
KX1=32768*kx1=32768-x2*S1
=(32768*65536-32768*x2*2*S1)/65536
=(32768*65536-D_X*S1*2)/65536
KX2=32768*kx2=32768-(x2/42)*32768*(1-x2/72)
=32768-(x2/42)*KX1
=(32768*65536-32768*x2*2*KX1/42)/65536
=(32768*65536-D_X*KX1*2/42)/65536
=(32768*65536-((D_X*KX1*2)/65536)*32768*2/42)/65536
=(32768*65536-((D_X*KX1*2)/65536)*S2*2)/65536
KX3=32768*kx3
=32768-(x2/20)*32768*(1-(x2/42)(1-x2/72)))
=32768-(x2/20)*KX2
=(32768*65536-32768*x2*2*KX2/20)/65536
=(32768*65536-D_X*KX2*2/20)/65536
=(32768*65536-(D_X*KX2*2/65536)*S3*2)/65536
KX4=32768*kx4
=32768-(x2/6)*32768*(1-(x2/20)(1-(x2/42)(1-x2/72)))
=32768-x2/6*KX3
=(32768*65536-(D_X*KX3*2/65536)*S4*2)/65536
最后由(3.1)式得到sin(x)值,用Y表示为:
Y=sin(x)*32768=x*KX4=(2*32768*x*KX4)/65536=X*KX4*2/65536
用DSP计算sin(x)的程序流程图如图3-1所示。
cos(x)的算法与流程图和sin(x)相似,请读者参照sin(x)的算法与流程图研究,这里不再赘述。
2.产生正弦波的方法
利用倍角三角公式sin(2x)=2sin(x)cos(x)计算0到π/2正弦值,再利用sin(x)=sin(π-x)和sin(x)=-sin(π+x)得到0到2π正弦值。
在本实验中计算720个点从0到2π正弦值,如果读者需要更多点数,只需对程序进行简单修改即可。
一个连续随时间变化的正弦信号可表示为:
y(t)=Am*sin(2π*f*t)(3.3)
其中Am表示信号的振幅,f表示信号的频率。
对其离散化:
Y(N)=Am*sin(2πf*N*ΔT),N=0,1,2,3……(3.4)
其中N表示样点值,ΔT为D/A转换时间间隔。
D/A转换率fs=1/ΔT,信号周期T=ΔT*L=1/f,L为正整数,f=1/(ΔT*L),则:
Y(N)=Am*sin(2π(1/ΔT*L)*N*ΔT)=A*sin(2π*N/L)(3.5)
信号是以L为周期的周期函数,只要知道所生成信号频率和D/A转换率就可以求出L。
例如:
若生成信号频率为100Hz信号,幅值为0.5,D/A转换率为10000次每秒,则L=1/(f*ΔT)=100,即一个信号周期输出100个点;若生成信号频率为500Hz信号,幅值为1,D/A转换率为10000次每秒,则L=1/(f*ΔT)=20,即一个信号周期输出20个点。
本实验只使用软件仿真,如需要硬件输出,则要加上定时器和D/A转换器。
3.1.5实验步骤
参照第1章1.2.5节和1.2.6节中的实验步骤,进行建立工程文件、源文件和命令文件,输入3.1.6程序清单参考中给出的内容,再添加文件到工程、编译工程和装载输出文件等操作,这些步骤完成之后,再观察输出的正弦波形。
以下是观察程序运行到不同的位置时输出波形的操作步骤。
1)分别在程序中的loop1、loop2和loop3三处设置断点,如图3-2所示。
图3-2在程序中的loop1、loop2、loop3三处设置断点
2)从主菜单中选择选择View→Graph→Time/Frequency命令,如图3-3所示,将会打开图形属性对话框。
图3-3用于打开图形属性对话框的命令
3)出现的图形属性对话框如图3-4所示。
图3-4图形属性对话框
4)点击图标
或按F5键,程序运行到loop1处将会停下来,如图3-5所示,这时你会看到一个黄色箭头刚好指到程序的loop1处。
图3-5程序运行到loop1处
5)在程序运行之前观察波形,如图3-6(a)所示,没有波形输出;点击图标
或按F5键,程序运行到loop1处停下来,再观察输出波形,如图3-5(b)所示,得到1/4周期的正弦波形;运行到loop2处,得到如图3-6(c)所示半个周期的正弦波形,这是程序中利用sin(x)=sin(π-x)得到的0到π正弦值结果;运行到loop3处,得到了一个周期完整的正弦波形,如图3-6(d)所示,这是程序中利用sin(x)=-sin(π+x)得到的0到2π正弦值结果。
图3-6观察程序运行到不同位置时输出正弦波形的变化
6)打开图形属性对话框,在对话框中修改相应的参数,点击OK确认,如图3-7所示。
图3-7在图形属性对话框中修改相应的参数
7)再将程序运行到loop4处,得到如图3-8所示的多周期正弦波图形。
由于图形纵坐标上的幅度值为0.5,横坐标上的时间单位为s,因此这是频率值为100Hz的正弦信号。
图3-8幅度值为0.5、频率值为100Hz的正弦信号
8)把3.1.6小节“1.”的程序内信号频率语句“F.set100”中的100改为500,幅值系数语句“Ax_v.set50*32768/100”中的50改为100,重新编译工程和装载输出文件,然后打开图形属性对话框,再在对话框中修改相应的参数,如图3-9所示。
图3-9图形属性对话框修改之后相应的参数
9)取消所有断点,运行程序到loop4处,得到如图3-10所示的波形图。
从图形上可以看出,这是一个幅度值为1且频率为500Hz的正弦信号。
图3-10幅度值为1频率值为500Hz的正弦信号
3.1.6程序清单参考
1.产生正弦波的sinwave.asm文件
.title"sin_wave.asm"
.mmregs
.def_c_int00
.bssL,1
.bssK,1
.bssAx,1
Fs.set10000;A/D转换率
F.set100;信号频率
L_v.setFs/F;每个周期输出点数
K_v.set720;预先计算点数
Ax_v.set50*32768/100;幅值系数
sin_x.usect"sin_x",K_v
sin_wave.usect"sin_wave",2000
d_xs.usect"sin_vars",1
d_squr_xs.usect"sin_vars",1
d_temp_s.usect"sin_vars",1
d_sinx.usect"sin_vars",1
d_l_s.usect"sin_vars",1
d_xc.usect"cos_vars",1
d_squr_xc.usect"cos_vars",1
d_temp_c.usect"cos_vars",1
d_cosx.usect"cos_vars",1
d_l_c.usect"cos_vars",1
STACK.usect".stack",200h
SYSSTACK.usect".sysstack",200h
k_theta.set(314159265/K_v)*32767/100000000;theta=(pi/720)*32768(0.25deg)
.data
table_s:
.word01c7h,030bh,0666h,1556h
table_c:
.word0249h,0444h,0aabh,4000h
****************************************************************************
*Thisfunctionisthemainprogramthatcallthesub-functions*
*evaluatedthesineandcosineofanangle,whichgeneratedsine-wave.*
****************************************************************************/
.text
_c_int00:
amov#STACK+100h,xsp
amov#STACK+200h,xssp
mov#0,mmap(imr0)
mov#0,mmap(imr1)
bclrAR3LC
mov#k_theta,ar0
mov#0,ar1
amov#sin_x,xar6
mov#K_v/4,mmap(brc0)
rptbloop1-1
movmmap(ar1),ac0
movac0<<#0,*(#d_xs)
movac0<<#0,*(#d_xc)
callsinx
callcosx
amov#d_sinx,xar3
amov#d_cosx,xar4
bsetfrct
mpym*ar3,*ar4,ac0
movhi(ac0<<#1),*ar6+
amar*ar1+0
loop1:
amov#sin_x+K_v/4-1,xar7;sin91(deg)--sin179(deg)
mov#K_v/4-2,mmap(brc0)
rptbloop2-1
mov*ar7-,*ar6+
loop2:
mov#K_v/2,mmap(brc0)
amov#sin_x,xar7
rptbloop3-1
mov*ar7+,ac0
negac0
movac0<<#0,*ar6+
loop3:
nop
amov#sin_x,XAR3
amov#sin_x,XAR5
bclrsxmd
bclrfrct
amov#0,ar1;N
amov#L,xar2;L
mov#L_v,*ar2+
mov#K_v,*ar2+;K=720
mov#Ax_v,*ar2+;Ax
amov#sin_wave,xar4
mov#2000,mmap(brc0)
rptbloop4-1;loop
bclrfrct
movar1,hi(ac0);N
sftlac0,#-16,ac0;取N/L余数
amov#L,xar2
rpt#15
subc*ar2,ac0
amov#K,ar2
mpym*ar2,ac0,ac0;720*N
amov#L,xar2
rpt#15
subc*ar2,ac0;720*N/L
mov#0ffffh,ac1
andac1,ac0;
amar*ar2+;K
rpt#15
subc*ar2,ac0;取余数
movhi(ac0),ar5
addar3,ar5
amov#Ax,xar2
bsetfrct
mpym*ar2,*ar5,ac0
movhi(ac0),*ar4+
amar*ar1+
loop4:
nop
bloop4
/****************************************************************************
*Thisfunctionisasub-functionthatevaluatedthesineofanangle*
*suingtheTaylorseriesexpansion.*
*****************************************************************************/
sinx:
bsetfrct
amov#table_s,xar3
amov#d_xs,xar2
amov#d_l_s,xar4
mov#7fffh,*ar4
sqrmr*ar2+,ac0
mov*ar4<<#16,ac1
:
:
movhi(ac0),*ar2
masmrt3=*ar2+,*ar3+,ac1,ac0
mpyt3,ac0,ac0
movhi(ac0),*ar2
masmr*ar2-,*ar3+,ac1,ac0
mpym*ar2+,ac0,ac0
movhi(ac0),*ar2
masmr*ar2-,*ar3+,ac1,ac0
mpym*ar2+,ac0,ac0
movhi(ac0),*ar2
masmr*ar2-,*ar3+,ac1,ac0
amov#d_xs,xar5
mpym*ar5,ac0,ac0
movhi(ac0),*(#d_sinx)
ret
/***************************************************************************/
*Thisfunctionisasub-functionthatevaluatedthecosineofanangle*
*suingtheTaylorseriesexpansion.*
*****************************************************************************/
cosx:
bsetfrct
amov#d_xc,xar2
amov#d_l_c,xar4
mov#7fffh,*ar4
sqrmr*ar2+,ac0
mov*ar4<<#16,ac1
:
:
movhi(ac0),*ar2
masmrt3=*ar2+,*ar3+,ac1,ac0
mpyt3,ac0,ac0
movhi(ac0),*ar2
masmr*ar2-,*ar3+,ac1,ac0
mpym*ar2+,ac0,ac0
movhi(ac0),*ar2
masmr*ar2-,*ar3+,ac1,ac0
sftsac0,#-1
negac0
mpym*ar2+,ac0,ac0
amar*ar2+
add*ar4,16,ac0
movhi(ac0),*ar2
ret
.end
2.产生正弦波的sinwave.cmd文件
-stack200h/*PRIMARYSTACKSIZE*/
-sysstack0x200h/*SECONDARYSTACKSIZE*/
MEMORY
{
PAGE0:
RAM0:
o=0200h,l=1800h
RAM1:
o=2000h,l=1000h
RAM2:
o=3000h,l=1000h
RAM3:
o=4000h,l=1000h
RAM4:
o=5000h,l=2000h
RAM5:
o=8000h,l=2000h
}
SECTIONS
{
.text:
>RAM0PAGE0
.data:
>RAM1PAGE0
.bss:
>RAM2PAGE0
.stack:
>RAM3PAGE0
.sysstack:
>RAM3PAGE0
sin_vars:
>RAM4PAGE0
sin_wave:
>RAM5PAGE0
cos_vars:
>RAM4PAGE0
sin_x:
align(1024){}>RAM4PAGE0
}
3.2两种频率的正弦波叠加信号实验
3.2.1实验目的
⏹学习一般算法在数字信号处理器上的实现。
⏹进一步加深对C55xDSP的CCS集成仿真环境认识。
⏹了解C55xDSP的查表编程方法。
⏹学习通过计算产生混频波形。
3.2.2实验设备
⏹PC兼容机一台;操作系统为Windows2000(或WindowsNT、Windows98、WindowsXP)。
⏹计算机安装CCS5000或CCSv3.1。
3.2.3实验要求
使用CCS集成仿真环境,完成建立工程、源文件、命令文件,保存和添加文件到工程,进行编译、链接、运行和调试等操作。
使用观察视窗观察寄存器和存储器空间的内容以及输出波形的时域和频域图等。
3.2.4实验原理
任意周期信号都可以表示成多个不同频率正弦信号的叠加,如果已知一个信号由哪几个正弦信号组成以及每个信号的频率、幅值和初始角,就可以进行信号的合成。
本实验是用两个不同频率的正弦信号,分别设为F1(t)和F2(t),叠加合成一个新的信号F(t),则有:
F(t)=F1(t)+F2(t)
=Am1*sin(2π*f1*t+1)+Am2*sin(2π*f2*t+2)(3.6)
在这里1、2为两个不同频率的正弦信号的初始相位,假设我们都取为0;f1、f2分别是这两个信号的频率;Am1、Am2分别是这两个正弦信号的振幅值。
因为1/f1=ΔT*L1,1/f2=ΔT*L2,ΔT表示D/A转换的时间间隔,L1、L2分别表示采样频率(fs)和信号频率(f1或f2)的比值,D/A转换速率为fs=1/ΔT,转换时间为t=N*ΔT,N=0,1,2,3,…
F(N*ΔT)=Am1*sin(2π*N/L1)+Am2*sin(2π*N/L2)(3.7)
例如:
要产生一个F(t)=0.6*sin(2π*100*t)+0.2*sin(2π*1000*t)的信号,D/A转换率fs=10000,则L1=fs/f1=100,L2=fs/f2=10。
3.2.5实验步骤
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 正弦波 信号 产生 理工