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算法中最複雜、也是最精彩的部分——譯碼,敬請期待。