概述
Part 1.概念
1.调制
在Polar码进行编码操作后,得出的结果仍然是由0和1组成的比特序列,这时,将0译成1,将1译成-1的操作称为调制。实质上,调制是对信号源的信息进行处理加到载波上,将其变为适合信道传输的过程,在软件环境下模拟,进行赋值即可。
2.高斯白噪声
在通信系统中,噪声的概念不再停留在声音(机械波)上,在这里,指的是对通信系统有干扰作用的电磁波。类似于白光,白噪声包含着各种各样频段的噪声,它是自然界中的噪声。我们要加的高斯白噪声函数,就是根据模拟信噪比,产生均值为0、服从正态分布的浮点数,将调制结果加上这些浮点数,即可得到比特经调制后,在传输过程中受外界噪声干扰而形成的错码。这些错码不能直接以信息的形式传输给用户端,因此,就需要SC、SCL等纠错码进行译码纠错。
Part 2.代码实战
程序要求:以16码长为例,将编码结果进行调制、加噪声。
输入:信噪比(实数,一般在0~3.5之间模拟)
输出界面显示内容:原码序列与经过白噪声干扰的比特序列。
先把编码部分程序挂出:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>//噪声部分会用到数学函数
const int N=16;
const int n=5;
int A[N][n];
float a[N][n];//增加一个float型二维数组存储加噪声后的比特
int CBR[N]={0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1};
float add_gassrand(float EbNo);//加噪声函数
float gaussrand();//生成噪声函数
int main()
{
srand((unsigned)time(NULL));
//设定种子随机数,使随机数随时间改变
float EbNo;//信噪比
printf("EbNo(dB):");
scanf("%f",&EbNo);//信噪比输入端
printf("n");
int Vi,e,sum=0,s=0;
for(Vi=0;Vi<N;Vi++)
{if(CBR[Vi])A[Vi][0]=rand()%2;
//CBR数组中非0的元素是信息比特位,在对应行产生0或1的随机数
else A[Vi][0]=0;
//固定比特位仍然为0
}
//编码部分
int h=N,y1,o;
for(y1=0;y1<n-1;y1++)
{
for(o=0;o<N;o=o+(2*N)/h)
{for(e=o;e<o+N/h;e++)
{A[e][y1+1]=A[e][y1]^A[e+N/h][y1]?1:0;
//^即为异或运算符号
A[e+N/h][y1+1]=A[e+N/h][y1];
}
}
h/=2;
}
//以下部分仍是main函数
调制:(接上方代码)
for(y1=0;y1<N;y1++)
{a[y1][n-1]=A[y1][n-1]?-1.0:1.0;}
加噪声:(接上方代码)
add_gassrand(EbNo);//加噪声
printf(" 原码序列vs加噪声结果:n");//输出端
for(y1=0;y1<N;y1++)printf(" %d vs %fn",A[y1][0],a[y1][n-1]);
return 0;
}
在main函数外的噪声函数有两个,分别是add_gassrand(float EbNo)和gaussrand()。
加噪声内容与极化码SC编译算法关系不大,仅用于模拟,不必深究,但有兴趣欢迎往下看,加高斯白噪声的公式原理如下:
噪声函数如下:
float gaussrand()
{
static float V1,V2,S;
static int phase=0;
float X;
if (!phase){do{
float U1=(float)rand()/RAND_MAX;
float U2=(float)rand()/RAND_MAX;
V1=2*U1-1;
V2=2*U2-1;
S=V1*V1+V2*V2;
} while(S>=1||!S);
X=V1*sqrt(-2*log(S)/S);
}
else X=V2*sqrt(-2*log(S)/S);
phase=1-phase;
return X;
}
float add_gassrand(float EbNo)
{
int i;
float Sigma2;//噪声方差
float Sigma;//噪声标准差
float Rate=(N/2)/(float)N;//数据的传输速率
Sigma2=(float)1/(2*Rate*pow(10,(EbNo / 10.0)));//白噪声的方差
Sigma=sqrtf(Sigma2);//白噪声的标准差
for(i=0;i<N;i++)a[i][n-1]=2*(a[i][n-1]+gaussrand()*Sigma)/Sigma2;
return 0;
}
调制与噪声的内容到此结束,感谢大家的耐心观看,如有错误,欢迎指正。下一篇我们将会学习极化码SC算法中最复杂、也是最精彩的部分——译码,敬请期待。
最后
以上就是忐忑铃铛为你收集整理的Polar SC的C语言实现之噪声篇的全部内容,希望文章能够帮你解决Polar SC的C语言实现之噪声篇所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复