1. 程式人生 > >《C》C語言程式設計輸出“m序列”資料並通過gnuplot繪圖

《C》C語言程式設計輸出“m序列”資料並通過gnuplot繪圖

一、怎麼構建m序列

    m序列是一種基本的偽隨機序列,有優良的自相關函式,易於產生和複製,在擴頻技術中得到了廣泛的應用。長度為 位的m序列可以用n級線性移位暫存器來產生。如下圖所示:
在這裡插入圖片描述
將發生器寫成如下方程: f ( x ) = C

0 + C 1 x + C 2
x 2 + . . . + C
n
x n = i = 0 n C i x i f(x)=C_0+C_1x+C_2x^2+...+C_nx^n=\sum_{i=0}^nC_ix^i
    這方程成為特徵多項式。式中 x i x^i 僅指明其係數 C i C_i 的值(1或0),x本身的取值並無實際意義,也不需要去計算x的值。例如,若特徵方程為 f ( x ) = x 4 + x + 1 f(x)=x^4+x+1 則它僅表示 , x 4 x 1 x 0 x^4,x^1和x^0 的係數 C 4 = C 1 = C 0 = 1 C_4=C_1=C_0=1 ,其餘為0。經嚴格證明:若反饋位移暫存器的特徵多項式為本原多項式,則位移寄出器能產生m序列。只要找到本原多項式,就可構成m序列發生器。

二、C語言程式設計實現“六階位移暫存器”m序列(即n=6)

1. 六階m序列分析
  • 六階m序列的週期: p = 2 6 1 = 63 p=2^6-1=63
  • 六階m序列的本原多項式: f ( x ) = x 6 + x + 1 f(x)=x^6+x+1
    C 6 = C 1 = C 0 = 1 C_6=C_1=C_0=1
  • 六階m序列的序列發生器結構圖:
    在這裡插入圖片描述
    觀察上圖可知反饋量為: a 5 a 0 a_5\oplus a_0
2. 六階m序列源程式
【6msquence.c】
#include<stdio.h>

main()
{	 
	int a[6] = {0,0,0,0,0,1};  //六級暫存器初始化[0 0 0 0 0 1]
	int m[63];
	int temp;          //temp用於存放反饋量 
	float period = 0.0;  //時間間隔
		
	for(int i=0;i<63;i++) 
	{
		m[i] = a[0];
		temp = a[5]^a[0];
		a[0] = a[1];            
		a[1] = a[2];
		a[2] = a[3];
		a[3] = a[4];
		a[4] = a[5];
		a[5] = temp;
	} 
	
	for(int j=0;j<63;j++)
	{
		for(int k=0;k<101;k++){
			period += 0.01; 
			printf("%f\t%d\n",period,m[j]);
		}
	}
}

三、gnuplot繪製圖像

關於gnuplot的詳細教程請點選 \rightarrow Java計算出三角函式的資料並通過gnuplot作出波形圖

1. 編譯C程式

    博主使用TCC編譯器將.c檔案編譯為.exe檔案。
在這裡插入圖片描述

2. 執行程式

    執行.exe檔案,觀察輸出結果,第一列為時間,第二列為m序列資料。
在這裡插入圖片描述

3. 繪製序列圖
  • 繪圖指令:
gnuplot>plot [0:80] [-1.5:1.5] "<6msquence.exe" u 1:2 w l title "6msquence"
  • 繪圖演示:
    在這裡插入圖片描述

四、驗證m序列

1. m序列特性驗證

    改變源程式【6msquence.c】第22行至第28行的內容:

for(int j=0;j<63;j++)
{
	printf("%d",m[j]);
}

執行後可以觀察到“1”和“0”的數量,執行結果如下圖:
在這裡插入圖片描述
程式計算結果符合m序列的特點:在一個週期63( p = 2 6 1 p=2^6-1 )內“1”為32( 2 n 1 2^{n-1} )個,“0”為31( 2 n 1 1 2^{n-1}-1 )個,“1”比“0”多一個。

2. 序列圖驗證

    為了驗證C語言程式設計實現的m序列是否正確,博主使用matlab構建了一個六階m序列發生器,生成的m序列圖如下:
在這裡插入圖片描述
C語言程式設計實現的m序列圖如下:
在這裡插入圖片描述
對比兩張圖我們發現圖形一模一樣。