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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章