BPSKQPSK调制与解调DSP实现.docx
《BPSKQPSK调制与解调DSP实现.docx》由会员分享,可在线阅读,更多相关《BPSKQPSK调制与解调DSP实现.docx(15页珍藏版)》请在冰豆网上搜索。
BPSKQPSK调制与解调DSP实现
数字调制解调的DSP实现
——BPSK、QPSK调制解调仿真
1系统的工作原理
1.1BPSK调制解调原理
在PSK调制时,载波的相位随调制信号状态不同而改变。
如果两个频率相同的载波同时开始振荡,这两个频率同时达到正最大值,同时达到零值,同时达到负最大值,此时它们就处于“同相”状态;如果一个达到正最大值时,另一个达到负最大值,则称为“反相”。
一般把信号振荡一次(一周)作为360度。
如果一个波比另一个波相差半个周期,我们说两个波的相位差180度,也就是反相。
当传输数字信号时,“1”码控制发0度相位,“0”码控制发180度相位。
载波相位只有0和π两种取值,分别对应于调制信号的“0”和“1”。
传“1“信号时,发起始相位为π的载波;当传“0”信号时,发起始相位为0的载波。
由“0”和“1”表示的二进制调制信号通过电平转换后,变成由“–1”和“1”表示的双极性NRZ(不归零)信号,然后与载波相乘,即可形成2PSK信号。
用开关电路去选择相位相差的同频载波(如图1-1)产生。
图11
BPSK解调必须采用相干接收法(如图1-2)。
图12
1.2QPSK调制解调原理
正交相移键控(QuadraturePhaseShiftKeyin,QPSK)是一种数字调制方式。
它分为绝对相移和相对相移两种。
由于绝对相移方式存在相位模糊问题,所以在实际中主要采用相对移相方式DQPSK。
目前已经广泛应用于无线通信中,成为现代通信中一种十分重要的调制解调方式。
在四相绝对相移键控是利用载波的四种不同相位来表征数字信息的。
由于每一种载波相位代表两个比特信息,故每个四进制码元又被称为双比特码元。
双比特码元中的两个信息比特通常是按格雷码(即反射码)排列的。
图1-3(a)表示A方式时QPSK信号的矢量图,图(b)表示B方式时QPSK信号的矢量图。
图13QPSK信号的矢量图
QPSK信号常用的产生方法有三种:
正交调制法、相位选择法及脉冲插入法。
1)正交调制法
发送端采用正交调制法的方框图如图1-4所示,
图14QPSK调制系统方框图(正交法)
2)相位选择法
图15相位选择法的方框图
3)脉冲插入法
图16插入脉冲法产生QPSK信号原理方框图
QPSK信号的相干解调
图17QPSK信号的相干解调方框图
QPSK同2PSK一样,在接收机解调时,由于相干载波相位的不确定性,使得解调后的输出信号不确定。
为了克服这种缺点,在实际通信中通常采用QDPSK系统。
2BPSK和QPSK的数学模型
2.1BPSK信号模型
BPSK信号的数学表达式为:
其中
若在某一码元持续时间T内观察是,式(1.1)可以简写为:
BPSK信号也相当于用矩形双极性不归零基带信号与载波信号相乘,故也可表示成:
2.2QPSK信号模型
BPSK信号的数学表达式为:
式中
常见的
有两种形式(见下表):
双比特码元
载波相位
A
B
A
B
0
0
0
5π/4
1
0
π/2
7π/4
1
1
π
π/4
0
1
3π/2
3π/4
3仿真结果
1、BPSK仿真结果:
BPSK调制解调过程
星座图
2、QPSK仿真结果
BPSK调制过程
4仿真代码
BPSK代码:
1.main.c
externvoidqpsk();
voidfilter(float*b,float*a,float*s,intN_b,intN_s);
#include"C54MATH.H"
DATAx[256];
DATAy[256];//正弦信号
DATAPulse[256];//被调信号
DATAPskSignal[256];//BPSK调制信号
DATAPskSignal01[256];//BPSK调制信号
DATARecMeg[256];
DATARecSig[256];
#defineN256
voidmain()
{inti,j;
for(i=0;i{
x[i]=i*0x1000;
}
sine(x,y,N);
for(i=0;i{
j=i/32;
switch(j%2)
{
case0:
Pulse[i]=-1;
break;
case1:
Pulse[i]=1;
break;
}
}
//调用汇编函数bpsk
bpsk();
for(i=0;i{
PskSignal01[i]=PskSignal[i]*y[i+4];
if(PskSignal01[i]>0)
RecMeg[i]=1;
elseif(PskSignal01[i]<0)
RecMeg[i]=-1;
RecSig[i]=(RecMeg[i]+1)/2;
}
for(;;){};
}
2.psk_asm.asm
.title"psk_asm.asm"
.global_qpsk;定义为全局变量,提供给C调用
.global_y;C程序变量
.global_Pulse;C程序变量
.global_PskSignal;C程序变量
.mmregs
.text
_qpsk:
rsbxCPL
stm#8-1,AR2;循环变量256/32=8
stm#_y,AR4
stm#_Pulse,AR3
stm#_PskSignal,AR5
loop:
ld*AR3,A
bcphase0,AEQ;若为0状态信号,则相移0
sub#1,A
addm#4,AR4
bcphase1,AEQ;若为1状态信号,则相移pi
pskend:
addm#32,AR3
banzloop,*AR2-
ret
phase0:
rpt#32-1
mvdd*AR4+,*AR5+
bpskend
phase1:
rpt#32-1
mvdd*AR4+,*AR5+
addm#-36,AR4
bpskend
phase2:
rpt#32-1
mvdd*AR4+,*AR5+
addm#-40,AR4
bpskend
phase3:
rpt#32-1
mvdd*AR4+,*AR5+
addm#-44,AR4
bpskend
.end
3.bpsk.cmd
-c
-lrts.lib
-lc54math.lib
-stack0x200
-heap0x200
MEMORY
{
PAGE0:
INT_PM_DRAM:
origin=0080h,length=1000h
PAGE1:
INT_DM_1:
origin=1080h,length=01000h
}
SECTIONS
{
.text:
{}>INT_PM_DRAMPAGE0
.cinit:
{}>INT_PM_DRAMPAGE0
.switch:
{}>INT_PM_DRAMPAGE0
.data:
{}>INT_DM_1PAGE1
.stack:
{}>INT_DM_1PAGE1
.bss:
{}>INT_DM_1PAGE1
.sysmem:
{}>INT_DM_1PAGE1
.const:
{}>INT_DM_1PAGE1
.dout:
{}>INT_DM_1PAGE1
}
QPSK代码:
1.main.c
externvoidqpsk();
#include"C54MATH.H"
DATAx[256];
DATAy[256];//正弦信号
DATAPulse[256];//被调信号
DATAPskSignal[256];//QPSK调制信号
DATAPskSignal01[256];
DATARecMeg[256];
DATARecSig[256];
#defineN256
voidmain()
{
inti,j;
for(i=0;i{x[i]=i*0x1000;
}
sine(x,y,N);
//产生一个被调信号(用-3,-1,1,3分别表示被调信号的四种状态)
for(i=0;i{
j=i/32;
switch(j%4)
{
case0:
Pulse[i]=-3;
break;
case1:
Pulse[i]=-1;
break;
case2:
Pulse[i]=1;
break;
case3:
Pulse[i]=3;
break;
}
}
//调用汇编函数qpsk
qpsk();
for(i=0;ifor(;;){};
}
2.psk_asm.asm
.title"psk_asm.asm"
.global_qpsk;定义为全局变量,提供给C调用
.global_y;C程序变量
.global_Pulse;C程序变量
.global_PskSignal;C程序变量
.mmregs
.text
_qpsk:
rsbxCPL
stm#8-1,AR2;循环变量256/32=8
stm#_y,AR4
stm#_Pulse,AR3
stm#_PskSignal,AR5
loop:
ld*AR3,A
bcphase0,AEQ;若为0状态信号,则相移0
sub#1,A
addm#4,AR4
bcphase1,AEQ;若为1状态信号,则相移pi/2
sub#1,A
addm#8,AR4
bcphase2,AEQ;若为2状态信号,则相移pi
sub#1,A
addm#12,AR4
bcphase3,AEQ;若为3状态信号,则相移3*pi/2
pskend:
addm#32,AR3
banzloop,*AR2-
ret
phase0:
rpt#32-1
mvdd*AR4+,*AR5+
bpskend
phase1:
rpt#32-1
mvdd*AR4+,*AR5+
addm#-36,AR4
bpskend
phase2:
rpt#32-1
mvdd*AR4+,*AR5+
addm#-40,AR4
bpskend
phase3:
rpt#32-1
mvdd*AR4+,*AR5+
addm#-44,AR4
bpskend
.end
3.qpsk.cmd
-c
-lrts.lib
-lc54math.lib
-stack0x200
-heap0x200
MEMORY
{
PAGE0:
INT_PM_DRAM:
origin=0080h,length=1000h
PAGE1:
INT_DM_1:
origin=1080h,length=01000h
}
SECTIONS
{
.text:
{}>INT_PM_DRAMPAGE0
.cinit:
{}>INT_PM_DRAMPAGE0
.switch:
{}>INT_PM_DRAMPAGE0
.data:
{}>INT_DM_1PAGE1
.stack:
{}>INT_DM_1PAGE1
.bss:
{}>INT_DM_1PAGE1
.sysmem:
{}>INT_DM_1PAGE1
.const:
{}>INT_DM_1PAGE1
.dout:
{}>INT_DM_1PAGE1
}