/******************************** 头文件保护开头 ******************************/
/*******************************************************************************
* COPYRIGHT Wireless Mobile Communications Center
********************************************************************************
* 文件名称: dpsk_mod_sim.c
* 功能描述: 主要用于DMPSK的调制
* 使用说明: (输入char型的0、1序列,输出为数值型的符号)
* 文件作者:
* 编写日期: (2011/05/11)
* 修改历史:
*******************************************************************************/
/******************************* 包含文件声明 *********************************/
#include"com_moddemod.h"
#include"data_typedef.h"
#include"stdio.h"
#include"math.h"
#include"vsip.h"
#define PI 3.1415926
BOOL graymap(int M,int k ,int *star_seq);
BOOL psk_mod_sim(const BYTE* pstrSigInArray, int nLength, short nM ,float fIniPhase, PCOMPLEXARRAY pSigOutArray);
/******************************* 局部宏定义 ***********************************/
/******************************* 全局变量定义/初始化 **************************/
/*特别说明:有时全局变量的初始化可能需要用到局部变量或函数指针,在这种情况下,*/
/*作者可以根据需要将全局变量的定义和初始化的位置进行适当调整。 */
/******************************* 局部常数和类型定义 ***************************/
/******************************* 局部函数原型声明 *****************************/
/******************************* 函数实现 *************************************/
/*****************************************************************
* 函数功能:DMPSK信号调制
* 输入参数:
* const BYTE* pstrSigInArray,输入数据,为二进制符号输入;
* int nLength,输入二进制数据长度nLength,
* short nM,进制数nM,
* float fIniPhase,输入的初始相位,
* PCOMPLEXARRAY pSigOutArray,输出pSigOutArray,为调制后的符号序列
* 输出参数:无;
* 返回参数: 成功TRUE=0,失败FALSE=-1
****************************************************************/
/*本函数是DMPSK的调制函数*/
BOOL dpsk_mod_sim(const BYTE* pstrSigInArray,int nLength,short nM, float fIniPhase, PCOMPLEXARRAY pSigOutArray)
{
int i = 0, logo_return = 0, k = 0, out_length = 0, y = 0, j = 0, mod_flag = 0;
int *sigModin = NULL, *star_fig = NULL;
const int b0 = 1; /*对输入序列做异或的第0位*/
sigModin = (int*)malloc(nLength*sizeof(int)); /*为做异或后的序列分配存储空间,用以进行MPSK调制*/
*sigModin = b0^(*pstrSigInArray-48); /*char型的输入化为int型,再做异或*/
for(i=1;i<nLength;i++)
{
*(sigModin+i) = (*(sigModin+i-1))^(*(pstrSigInArray+i)-48);
}
k = vsip_log10_f(nM)/vsip_log10_f(2); /*每符号对应比特位数*/
out_length = nLength/k; /*输出符号数目*/
pSigOutArray->nLength =out_length;
(((pSigOutArray)->nLength)) = out_length;
star_fig = (int*)malloc((k*nM)*sizeof(int)); /*为格雷码表的存储指针,动态分配内存*/
logo_return = graymap(nM,k,star_fig); /*产生格雷码码表*/
if(logo_return!=TRUE)
{
return FALSE;
}
/*将输入比特,映射为输出符号*/
for(y=0;y<out_length;y++)
{
for(j=0;j<nM;j++)
{
for(i=0;i<k;i++)
{
if((*(star_fig+i+j*k))!=(*(sigModin+y*k+i))) /*判断格雷码码表中相应位是否与输入的值相同*/
{
mod_flag = 0; /*不同的话置0并且终止此循环*/
break;
}
else
{
mod_flag++; /*标志符自加*/
}
}
/*如果输入的k位bit与星座点的k位比特相等,则判定对应的符号*/
if(mod_flag==k)
{
*(((pSigOutArray)->RealCom)+y) = cos(2*PI*j/nM+fIniPhase); /*产生I输出信号,即实部*/
*(((pSigOutArray)->ImagCom)+y) = sin(2*PI*j/nM+fIniPhase); /*产生Q输出信号,即虚部*/
/*用以测试调制输出的符号是否正确*/
# ifdef DEBUG
printf(" pskmod %f +j%f ",*(((pSigOutArray)->RealCom)+y),*(((pSigOutArray)->ImagCom)+y));
# endif
mod_flag = 0; /*标识符归零*/
break;
}
mod_flag = 0; /*标识符归零*/
}
}
free(sigModin); /*释放动态分配的内存空间*/
free(star_fig);
pSigOutArray->nLength = nLength/k;
return TRUE;
}
/******************************* 函数结束 *************************************/