官方淘宝店 易迪拓培训 旧站入口
首页 > 无线通信 > 通信技术学习讨论 > 扩频中的Eb/No

扩频中的Eb/No

12-16
如果扩频中没考虑能量归一化。扩频之后,对应No是不是该这么计算的?
double No=(double)spreadfactor/(pow(10,EbNo_dB/10)*Rc);

你想说的N0代表什么量总得事先说好吧

序列b经过码率Rc的编码得到序列c,c经过扩频因子为spreadfactor的序列直序扩频。
然后加入功率为σ^2=No/2的噪声。扩频的时候能量没有除以归一化,各个码片的幅值为1。
那么计算No的时候,这样是不是不对?
double No=(double)spreadfactor/(pow(10,EbNo_dB/10)*Rc)
附:
EbNo_dB=10log(Eb/No)=10log(spreadfactor*Es/Rc*No),Es为码片能量=1
=>No=spreadfactor/(pow(10,EbNo_dB/10)*Rc)
该是这样的吧!?


Eb*Rc=K*Ec  Ec: energy per chip

可是仿真的时候,0dB的时候BER都是0,-10dB的时候,BER是2.187500e-001
大致该是哪里出了问题呢?

单BER为0就不对,怎么能仿出这个结果?

很简单的一个链路仿真。
Rc=1/2的卷积码,经BPSK,直序扩频后AWGN,收端解扩后BCJR译码。
查了半天也没查出哪里出了问题:(

不太清楚,大概是什么量级才是正常的呢?


我查了下,
你的系统,-10db处shannon bound  Pe-->1
0db处也达不到Pe=0

看书上的情况是如下这样的数字量级:
0dB 1.0e-1
1dB 3.0e-2
2dB 8.0e-3
3dB 1.0e-3
4dB 1.0e-4

单独的卷积码,和单独的扩频,都没问题。
Eb/No那个地方我也推导了好几遍了,感觉应该也是对的。
frame_num=1000000,frame_length=128.UserNum=4,spreadfactor=11
EbNo=0dB,BER居然是0

你加噪声的程序那段写出来看看,还有你用没用成型滤波器?最好把仿真主程序要点贴上来。

让您见笑了,没有用成形滤波器,简单的AWGN。
void awgn(double *mesg_in,double *mesg_out,int size,double No)
{
        double sigma=sqrt(No/2);
        for(int i=0;i<size;i++)
        {
                mesg_out[i]=mesg_in[i]+sigma*rand_gaussian();
        }
}
主程序也很简单
       //parameters的部分情况。
        int     **mesg;
        int     **parity;
        int     **combined_mesg;
        double  **bpsk_mesg;
        double  **spread_mesg;
        double  *add_mesg_;
        double  *channel_mesg;
        double  **despread_mesg;
        double  **dec_mesg;
        double  **dec_parity;
        int     **final_mesg;
      //主程序
for(double EbNo_dB=EbNo_start;EbNo_dB<=EbNo_end;EbNo_dB+=EbNo_step)
{
  double No=(double)spreadfactor/(pow(10,EbNo_dB/10)*Rc);//要修改此处?
  int error[USER]={0,0,0,0};
  for(int frame=0;frame<frame_num;frame++)
  {
   for(int usr=0;usr<USER;usr++)
   {
    gen_message(mesg[usr],frame_length);
    encode(mesg[usr],parity[usr],frame_length,true);
    //the following realizes turning parall to serial
    combine_message(mesg[usr],parity[usr],combined_mesg[usr],frame_length);
    bpsk(combined_mesg[usr],bpsk_mesg[usr],2*frame_length);
    spread(bpsk_mesg[usr],spread_mesg[usr],2*frame_length,spreadfactor,usr);
    }
     //add all users' mesg stream.                        
    add_mesg(spread_mesg,add_mesg_,2*frame_length*spreadfactor,USER);
    awgn(add_mesg_,channel_mesg,2*frame_length*spreadfactor,No);
                        
    for(usr=0;usr<USER;usr++)
    {
     despread(channel_mesg,despread_mesg[usr],2*frame_length*spreadfactor,spreadfactor,usr);
     decode(despread_mesg[usr],frame_length,dec_mesg[usr],dec_parity[usr],No);
     decision(dec_mesg[usr],final_mesg[usr],frame_length);
     error[usr]+=ber_test(mesg[usr],final_mesg[usr],frame_length);
     printf("\rUser %d's %d frames have been finished",usr,frame);
     }
  }
  double BER[USER];
  int sum_error=0;
                
  for(usr=0;usr<USER;usr++)
  {
   BER[usr]=(double)error[usr]/(double)(frame_num*frame_length);
   sum_error+=error[usr];
  }
  double total_BER=(double)sum_error/(double)(frame_num*frame_length*USER);
  fprintf(fp,"Error of user 1= %d,BER of user 1=%e\n",error[0],BER[0]);
  fprintf(fp,"Error of user 2= %d,BER of user 2=%e\n",error[1],BER[1]);
  fprintf(fp,"Error of user 3= %d,BER of user 3=%e\n",error[2],BER[2]);
  fprintf(fp,"Error of user 4= %d,BER of user 4=%e\n",error[3],BER[3]);
  fprintf(fp,"total error= %d,total BER=%e\n\n",sum_error,total_BER);
}

没发现什么问题,让您失望了。

Top