📄 适于调试的cdma程序.txt
字号:
#include<iostream.h>
#include<cmath>
#include<cstdlib>
#include<ctime>
const double length=1000000;//需要产生的随机数个数
const int n=4;//m序列的级数
const double m_sequence_states2[n]={0,0,0,1};// 初始化m=15序列状态量
double *b=new double[100*length];//产生的随机数序列
double *c=new double[length];//二进制信号源
double *c1=new double[length];//解调输出码
double *I=new double[length/2];
double *Q=new double[length/2];//双比特码元
double *m_sequence=new double[length];//m序列
class CDMA
{public:
void Gauss (double *,double,double);//高斯随机数产生函数
void binary_bear();//均匀分布的二进制信号源
void m_sequence_state();// 初始化m=5序列状态量
void m_bear();//产生m=15序列
void ADD_modulation();//信码与扩频码模二和,然后调制
void disturbance_I();
void disturbance_Q();
void ADD_demodulation();
double caculation_BER();
private:
double m_sequence_states[n];//初始化m=15序列状态量
double BER;
};
//产生高斯随机数
void CDMA::Gauss (double *r,double sigma,double a)
{
int i,k,m;
double s,w,v,t;
s=65536.0;w=2053.0;v=13849.0;
for(k=0;k<length/2;k++)
{t=0;
for(i=1;i<=12;i++)
{*r=(*r)*w+v;m=(int)(*r/s);
*r=*r-m*s;t=t+(*r)/s;}
b[k]=a+sigma*(t-6.0);
}
return;
}
//均匀分布的二进制信号源
void CDMA::binary_bear()
{
int k=0;int x;
srand(time(NULL));
for(k=0;k<length;k++)
{x=0+rand()%(1-0+1);
c[k]=x+1.0-1.0;
c1[k]=c[k];
cout<<c[k]<<" ";
}
cout<<endl;
}
// 初始化m=15序列状态量
void CDMA::m_sequence_state()
{int i;
for(i=0;i<n;i++)
m_sequence_states[i]=m_sequence_states2[i];
}
//产生m=15序列
void CDMA::m_bear()
{double cn[n]={1,0,0,1};
int i,j;
for(j=0;j<length;j++)
{double x=m_sequence_states[n-1];
for(i=0;i<n-1;i++)
{m_sequence_states[n-1]+=(cn[i]*m_sequence_states[i]);
if((int(m_sequence_states[n-1])%2)==0)
m_sequence_states[n-1]=0;
else m_sequence_states[n-1]=1;}
m_sequence[j]=m_sequence_states[0];
cout<<m_sequence[j]<<" ";
for(i=0;i<n-2;i++)
m_sequence_states[i]=m_sequence_states[i+1];
m_sequence_states[n-2]=x;}
cout<<endl;
}
//下面用简化扩频放法进行调制
void CDMA::ADD_modulation()
{
int i,j;
//首先将信码与扩频码模二和
for(i=0;i<length;i++)
{c1[i]+=m_sequence[i];
if((int(c1[i])%2)==0)
c1[i]=0;
else c1[i]=1;
cout<<c1[i]<<" ";}
cout<<endl;
//然后调制
for(i=0,j=0;i<length;i=i+2,j++)
{if(c1[i]+1.0==1.0)
I[j]=-1;
else I[j]=1;
cout<<I[j]<<" ";}
cout<<endl;
for(i=1,j=0;i<length;i=i+2,j++)
{if(c1[i]+1.0==1.0)
Q[j]=-1;
else Q[j]=1;
cout<<Q[j]<<" ";}
cout<<endl;
}
//高斯白噪声干扰
void CDMA::disturbance_I()
{int i,j;
for(i=0,j=0;i<length;i=i+2,j++)
{I[j]=I[j]+b[j];cout<<I[j]<<" ";}
cout<<endl;
}
void CDMA::disturbance_Q()
{int i,j;
for(i=1,j=0;i<length;i=i+2,j++)
{Q[j]=Q[j]+b[j];cout<<Q[j]<<" ";}
cout<<endl;
}
//解调,解扩
void CDMA::ADD_demodulation()
{int i,j;
//解调
for(i=0,j=0;i<length;i=i+2,j++)
{if(I[j]>=0)
I[j]=1;
else I[j]=0;
c1[i]=I[j];
cout<<I[j]<<" ";}
cout<<endl;
for(i=1,j=0;i<length;i=i+2,j++)
{if(Q[j]>=0)
Q[j]=1;
else Q[j]=0;
c1[i]=Q[j];
cout<<Q[j]<<" ";}
cout<<endl;
//解扩
for(i=0;i<length;i++)
{c1[i]+=m_sequence[i];
if((int(c1[i])%2)==0)
c1[i]=0;
else c1[i]=1;
cout<<c1[i]<<" ";}
cout<<endl;
}
//计算BER
double CDMA::caculation_BER()
{int i;
double j=0;
for(i=0;i<length;i++)
{if(int(c[i])!=int(c1[i]))
j++;}
BER=j/double(length);
return BER;
}
void main()
{
double y;//y=Eb/No(db)
double Eb_N0[5];
double ber[5];
double a=0;//高斯分布的均值
double sigma;//高斯分布的方差
int i;
CDMA obj1;
for(y=0,i=0;y<5;y+=0.5)
{Eb_N0[i]=y;
cout<<y<<endl;
sigma=sqrt(1/pow(10,y/10));
//均匀分布的二进制信号源
obj1.binary_bear();
// 初始化m=15序列状态量
obj1.m_sequence_state();
//产生m=15序列
obj1.m_bear();
//下面用简化扩频放法进行调制
obj1.ADD_modulation();
//高斯白噪声干扰
//产生高斯随机数
double r0=15;
obj1.Gauss (&r0,sigma,a);
obj1.disturbance_I();
r0=20;
obj1.Gauss (&r0,sigma,a);
obj1.disturbance_Q();
//解调,解扩
obj1.ADD_demodulation();
//计算BER
ber[i]=obj1.caculation_BER();
cout<<ber[i]<<endl;}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -