扩频中的Eb/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);
}
没发现什么问题,让您失望了。
相关文章:
- 问一个有关直接序列扩频的抗多经干扰的问题(05-08)
- 直接序列扩频是如何抗多径干扰呢(05-08)
- 在扩频信号的跟踪环里,是如何实现pn码相关的?(05-08)
- 请教CDMA接收的扩频信号功率是否大于噪声功率(05-08)
- 扩频通信用英语怎么说?(05-08)
- 弱问:仿真多径信道扩频通信(05-08)