//-----------------------------------------------------
// 二进制差分相移键控(2DPSK)调制及其相干解调程序
// 采用C和汇编的混合编程
// 主函数:2DPSK_main.c
// 子函数:2dpsk.asm
// coef.asm
//-----------------------------------------------------
#include "C54MATH.H"
#include "C54FIR.H"
#include "stdio.h"
#define N 256
extern void dpsk();
extern void d_dpsk();
extern DATA *hcoef;
extern DATA d[32];
DATA ddat[9];
DATA x[256];
DATA y[256]; //正弦信号
DATA Pulse[256]; //被调信号
DATA Dpulse[256];
DATA DPSK[256]; //PSK调制信号
DATA dbuf[256];
void main()
{
int i;
short dat[8]={1,0,1,1,1,0,1,0}; //原始数据
short b[9],c[8];
//--------------------------------------------------------------
//产生一个500Hz的正弦信号作为调制信号
for(i=0;i<N;i++)
{
x[i]=i*0x1000;
// fc=(0x1000/0x10000)*fs=500Hz, fs固定在8000
}
sine( x, y, N );
for(i=0;i<N;i++)
y[i]=y[i]*0.8;
//---------------------------------------------------------------
//---------------------------------------------------------------------------------
//产生一个被调信号,符号间隔为32个采样点
//差分编码
ddat[0]=1;
for(i=1;i<=8;i++)
ddat[i]=dat[i-1]^ddat[i-1];
// //转换为双极性码
for(i=0;i<9;i++)
if (ddat[i]==0)
ddat[i]=-1;
for(i=0;i<N;i++)
{
Pulse[i]=ddat[i/32];
}
//--------------------------------------------------------------------------------------
//调用汇编函数dpsk,结果在DPSK
dpsk();
//--------------------------------------------------------------------------------------
//2DPSK相干解调和低通滤波 ,结果分别存放在dbuf和Dpulse.
d_dpsk();
//抽样判决
for(i=20;i<N+32;i=i+32) //考虑到延时对判决的影响,推迟20个采样点进行判决
b[i/32]=(Dpulse[i]>0)?1:-1;
//转换成单极性码
for(i=0;i<9;i++)
b[i]=(b[i]==-1)?0:b[i];
// 差分译码
for(i=0;i<8;i++)
c[i]=b[i]^b[i+1]; //数组c为译码结果
//------------------------------------------------------------------
for(;;){}; //运行到此处后,打开View->Graph->Time/Frequency Graph
////按照当前文件夹内给出的图形属性设置,即可显示DPSK信号
}