Polar SC的C语言实现之噪声篇

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  %f\n",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算法中最复杂、也是最精彩的部分——译码,敬请期待。

发布了9 篇原创文章 · 获赞 14 · 访问量 4700
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章