-
18.基於Matlab的QPSK系統載波同步分析
前面幾節介紹了相干解調的幾個基本概念,下來結合一個實際的通信系統,從實際的應用出發深入理解載波同步的概念。載波同步是基於鎖相環技術使本地獲取和載波同頻同相的參考信號,用來解調信號。
載波同步就是對本地參考信號進行頻率和相位偏差的補償,進而實現本地參考信號和載波信號同頻同相。
載波同步只適用於單載波調製系統,載波同步算法對於BPSK、QPSK、OQPSK、8-PSK、PAM和QAM都是兼容的。
目前鎖相環使用比較多的是Costas環和平方環進行載波同步,但是兩者都有相位模糊的特點。
18.1.QPSK通信系統載波同步分析
- 系統參數設置:
幀長:1000bits(包括preamble)
幀個數:10;
調製模式:QPSK;
解調相位模糊處理:barker碼,由於鎖相環處理必然有相位模糊,所以通過barker碼解決相位模糊的問題;
%%------------------------------ Parameter ------------------------------%%
M = 4;% Modulation order,QPSK
rng(1993) % For repeatable results,每次仿真結果相同
barker = comm.BarkerCode(...
'Length',13,'SamplesPerFrame',13);% For preamble,使用preamble來解決相位模糊問題
msgLen = 1e4;
numFrames = 10;%10幀
frameLen = msgLen/numFrames;
- 產生射頻信號
將preamble添加到幀頭位置;
%%--------------------------- Generate Tx Signal ------------------------%%
preamble = (1+barker())/2;% Length 13,unipolar,將雙極性的barker碼,轉換爲單極性
data = zeros(msgLen,1);
for idx = 1 : numFrames
payload = randi([0 M-1],frameLen-barker.Length,1);
data((idx-1)*frameLen + (1:frameLen)) = [preamble; payload];%將barker碼添加到幀頭
end
modSig = pskmod(data,4,pi/4);%產生調製信號
- 生成相位和頻率偏差
相偏:45°
頻偏:10KHz
採樣頻率:1Mhz,頻偏是採樣頻率的1%
%%------------------- Generate Phase and Frequence Offset ---------------%%
pfo = comm.PhaseFrequencyOffset('PhaseOffset',45, ...
'FrequencyOffset',1e4,'SampleRate',1e6);
- 生成載波同步器
SamplesPerSymbol:符號過採樣倍數,本例子默認爲1;
%%---------------------------- Carrier Synchronizer ---------------------%%
carrierSync = comm.CarrierSynchronizer( ...
'SamplesPerSymbol',1,'Modulation','QPSK');
- 添加相偏、頻偏和信道噪聲
%%-------------------- Add Phase and Frequence Offset -------------------%%
modSigOffset = pfo(modSig);
%%--------------------------- Add Channel Noise -------------------------%%
rxSig = awgn(modSigOffset,12);
- 查看發射信號的星座圖
由星座圖可以看出由於存在相偏和頻偏導致星座點沒有收斂,星座圖發散。
不添加相偏和頻偏的發射信號星座點如下:
scatterplot(rxSig)%發射星座圖
- 對比同步處理前後的星座圖
存在相偏和頻偏的情況下,對比第一幀和第十幀的星座圖可以看出進過同步器後星座點已經開始收斂。
沒有相偏和頻偏的情況下,對比第一幀和第十幀的星座圖可以看出星座點均斂。
- 對同步後的信號進行解調並計算BER
syncDataTtlErr = 3990;
syncDataBER = 0.4986;
從結果可以看出BER比較大,由於星座點已經收斂,說明已經獲得同頻同相的本地載波信號,造成BER高的原因可能是相位模糊造成的。
%%-----------------------------------------------------------------------%%
syncData = pskdemod(syncSignal,4,pi/4);%Demodulate the synchronized signal
[syncDataTtlErr,syncDataBER] = biterr(data(6000:end),syncData(6000:end))%Compute and display the total bit errors and BER
- 利用barker碼計算相位模糊
相位模糊範圍:0、,或者,通常情況下Costas環和平方環的是的相位模糊,具體和調製模式有關;
求出載波同步前後相同barker碼的相位角,就求出了相位模糊角;
angle求出的相位角範圍,滿足相位模糊範圍;
%%--------------------------- Phase ambiguity ---------------------------%%
idx = 9000 + (1:barker.Length);
phOffset = angle(modSig(idx) .* conj(syncSignal(idx)));
phOffset = round((2/pi) * phOffset); % -1, 0, 1, +/-2
phOffset(phOffset==-2) = 2; % Prep for mean operation
phOffset = mean((pi/2) * phOffset); % -pi/2, 0, pi/2, or pi
disp(['Estimated mean phase offset = ',num2str(phOffset*180/pi),' degrees'])
求出的相位模糊:Estimated mean phase offset = 180 degrees
- 補償相位模糊,將補償後的數據進行解調並計算BER
syncDataTtlErr = 403;
syncDataBER = 0.0504;
%%------------------------------ Phase Shift ----------------------------%%
resPhzSig = exp(1i*phOffset) * syncSignal;
resPhzData = pskdemod(resPhzSig,4,pi/4);%Demodulate the signal after resolving the phase ambiguity
[resPhzTtlErr, resPhzBER] = biterr(data(6000:end),resPhzData(6000:end))
18.2.下一步分析內容
結合以上分析實例,對具體同步器算法進行研究;