C 实现BPSK信号的调制解调过程课题设计报告DOC 下载本文

模块划分

Bpsk调制模块 Bpsk解调模块 输入输出模块

模块功能设计

Bpsk调制模块包括: 基带数据产生模块 单双极性变换模块 FFT模块

功率信号幅值单位转换模块 加载波模块

Bpsk解调模块包括: 产生高斯白噪声模块 去载波模块 低通滤波器模块 判决模块 FFT模块

误码率计算模块

输入输出模块包括: 数据输入模块 数据读取模块 数据输出模块

绘图模块OnPaint() 图形界面模块

二、 详细设计

(一) 资源项目

程序文件

头文件

(二)Bpsk调制模块

★基带数据产生模块

int* CTools::BaseDataPut(long length) { int* nBaseDataBit; nBaseDataBit = (int*)malloc(length*sizeof(int)); srand((unsigned)time(NULL)); for (long i = 0; i

★单双极性变换模块

int *pnget = NULL;//单双变换后数据

pnget = (int*)malloc(m_nNumOfBase*sizeof(int));

for (i = 0; i < m_nNumOfBase; i++) {

pnget[i] = 1-m_pBaseData[i]*2; }//单双极性变换

★FFT模块

float *CTools::fft(float *y, long n, long *len) { //傅立叶变换;

//len:返回补0以后数据长度的一半;

//函数输出:fft变换后的数据,长度为len; //若失败,则返回一个空指针(NULL) long i, j, k, m, i1, i2, i3, i4, n1, n2, n4; float a, e, cc, ss, xt, t1, t2; float *x;

long temp_n;

////////////////////////////////// //自动补零 temp_n=1;

while(temp_n

x=(float *)malloc(temp_n*sizeof(float)); if (!x) return NULL; for (i=0;i

if(temp_n>n) { for (i=n;i

//////////////////////////// //开始做fft运算

for (j=1, i=1;i<32;i++) { m=i; j=2*j; if(j==temp_n) break; }

n1=temp_n-1;

for (j=0, i=0;i

}

k=temp_n/2;

while(k<(j+1)) { j=j-k; k=k/2; } j=j+k; }

for (i=0;i

for (k=2;k<=m;k++) { n4=n2; n2=2*n4; n1=2*n2; e=float(6.283185307179596/n1); for (i=0;i

}

} }

*x=float(fabs(*x));

*(x+temp_n/2)=float(fabs(*(x+temp_n/2))); for (i=1;i

x=(float *) realloc(x, (temp_n/2)*sizeof(float)); *len=temp_n/2; if(!x) { free(x); return NULL; } else { return x; }

★功率信号幅值单位转换模块

double CTools::TransformUnit(double dRecPower) { double dPower; dPower = pow(10, (dRecPower - 30) / 10); return dPower; }

★加载波模块

float* pfModData = NULL;//调制数据

pfModData=(float*)malloc(m_nNumOfScan*sizeof(float)); for (i = 0; i < m_nNumOfScan; i++)

{

j = long(i*m_nNumOfBase/m_nNumOfScan);

*(pfModData+i) =*(pnget+j)*dPa*cos(2*PI*m_dSimRf*i/m_dSampleFreq); //A*cos(wc*t)=A*cos(2*Pi*f*t) }

(二) Bpsk解调模块

★产生高斯白噪声模块