1. 程式人生 > >FPGA數字訊號處理(28)QPSK星座對映與解對映

FPGA數字訊號處理(28)QPSK星座對映與解對映

QPSK星座對映

星座圖對映是指按一定規則(PSK或QAM)將輸入位元對應到I/Q座標系中的複數點。複數點越多,則頻譜效率越高,抗噪聲能力越強。

我們都知道QPSK調製每個符號有2-bits,用4種不同相位的載波分別表示00、01、10和11。QPSK星座對映是指將4種不同相位的載波訊號用I路和Q路兩條支路表示。有兩種對映方式,一種用0、π/2、π、3π/2四個相位,另一種用π/4、3π/4、5π/4、7π/4四個相位。本文采用第二種對映方式,關係如下表:

輸入 對映 輸出 輸出Q
0 0 1+j 1 1
0 1 -1+j -1 1
1 0 -1-j -1 -1
1 1 1-j 1 -1

實現時通常還會做歸一化處理

,即乘一個係數1/sqrt(2)。輸出I支路和Q支路的資料位寬根據系統來設定。經過通道傳輸後,I/Q支路上的資料都會因各種干擾而發生變化。解對映時要計算每個I+jQ到4個標準星座點之間的距離,判斷該資料原本屬於哪個星座點,從而恢復原始bit流資料。

對bit流進行星座對映處理主要有兩個好處:(1).規範資料格式,根據硬體平臺與系統引數選擇合適的資料格式;(2).bit資料轉換為複數資料,適合於IFFT和FFT的處理。OFDM系統便是星座對映的一個典型應用。

MATLAB設計

使用MATLAB模擬QPSK星座對映和解對映的過程,可以使用MATLAB提供的現成函式pskmod和pskdemod,也可以自己編寫。本設計模擬時和第26、27篇中的設計結合,資料流為:原始序列->加擾器->卷積編碼->QPSK星座對映->通道->QPSK星座解對映->Viterbi譯碼->解擾器。與QPSK星座對映相關的核心程式碼如下:

%%% ---------  QPSK星座對映  --------- %%%
qpskData = zeros(1,1500);

for i = 1 : 1500         %要歸一化
   if (codeData(2*(i-1)+1)==0 && codeData(2*(i-1)+2)==0) 
       qpskData(i) = complex(sqrt(2)/2,sqrt(2)/2);   %00 1+j
   elseif (codeData(2*(i-1)+1)==1 && codeData(2*(i-1)+2)==0) 
       qpskData(i) = complex(-sqrt(2)/2,sqrt(2)/2);  %10 -1+j 
   elseif (codeData(2*(i-1)+1)==1 && codeData(2*(i-1)+2)==1) 
       qpskData(i) = complex(-sqrt(2)/2,-sqrt(2)/2); %11 -1-j
   elseif (codeData(2*(i-1)+1)==0 && codeData(2*(i-1)+2)==1) 
       qpskData(i) = complex(sqrt(2)/2,-sqrt(2)/2);  %01 1-j  
   end
end

上述程式碼中使用i作為迴圈控制變數,因此構建複數時使用complex函式完成。與QPSK星座解對映相關的核心程式碼如下:

%%% --------  QPSK星座解對映  -------- %%%
deqpskData_p = zeros(1,1500);  %複數形式
deqpskData_s = zeros(1,3000);  %bit流形式
a = complex(sqrt(2)/2,sqrt(2)/2);   %00
b = complex(-sqrt(2)/2,sqrt(2)/2);  %10
c = complex(-sqrt(2)/2,-sqrt(2)/2); %11
d = complex(sqrt(2)/2,-sqrt(2)/2);  %01

for i = 1 : 1500         
   comp1 = receive(i) - a; comp2 = receive(i) - b;
   comp3 = receive(i) - c; comp4 = receive(i) - d;
   dis1 = abs(comp1); dis2 = abs(comp2); dis3 = abs(comp3); dis4 = abs(comp4);
   
   if (dis1<dis2 && dis1<dis3 && dis1<dis4)       %00 1+j
       deqpskData_p(i) = complex(sqrt(2)/2,sqrt(2)/2);   
       deqpskData_s(2*(i-1)+1:2*(i-1)+2) = [0,0];
   elseif (dis2<dis1 && dis2<dis3 && dis2<dis4)   %10 -1+j 
       deqpskData_p(i) = complex(-sqrt(2)/2,sqrt(2)/2); 
       deqpskData_s(2*(i-1)+1:2*(i-1)+2) = [1,0];
   elseif (dis3<dis1 && dis3<dis2 && dis3<dis4)   %11 -1-j
       deqpskData_p(i) = complex(-sqrt(2)/2,-sqrt(2)/2);
       deqpskData_s(2*(i-1)+1:2*(i-1)+2) = [1,1];
   elseif (dis4<dis1 && dis4<dis2 && dis4<dis3)   %01 1-j  
       deqpskData_p(i) = complex(sqrt(2)/2,-sqrt(2)/2);  
       deqpskData_s(2*(i-1)+1:2*(i-1)+2) = [0,1];
   end
end

使用awgn函式為訊號新增噪聲時要注意Eb/N0、Es/N0和SNR之間的關係。在MATLAB幫助中搜索“AWGN Channel”可以查閱到具體描述,轉換公式如下: 在這裡插入圖片描述 使用Scatter繪製複數的散點圖。標準QPSK星座圖如下: 在這裡插入圖片描述 經過高斯白噪聲通道傳輸後,接收到的訊號如下圖所示(左圖Eb/N0=10dB,右圖Eb/N0=4dB) 在這裡插入圖片描述 可以看到當噪聲干擾太大時,某些點甚至已經跨越到了其它象限,必然會導致解映射出現錯誤。但據第27篇中講述,卷積編譯碼可以對傳輸過程中受到的干擾具有一定糾錯能力。因此在上面右圖的情況下,據程式統計,星座對映與解對映有0.9%的誤位元速率,但編譯碼、加擾與解擾的誤位元速率為0,仍然可以正確恢復出原始資料。

FPGA設計

稍後補充