第8章(1)内容如下:
- 一、STO和CFO的基本介紹及影響
- 二、STO的估計技術
- 三、STO估計技術的可運作MATLAB代碼及其注意點
- 四、總結
今天來講OFDM同步技術的知識,主要參考材料是《MIMO-OFDM無線通信技術及MATLAB實作》,于是給本章取名為第8章——OFDM同步技術。
《MIMO-OFDM無線通信技術及MATLAB實作》代碼下載下傳位址:
LyricYang/MIMO_OFDMgithub.com
OFDM同步技術主要内容如下:
圖1 OFDM同步技術内容
一、STO和CFO的基本介紹及影響
在第7章《OFDM信道估計與均衡》系列文章中講清楚了OFDM符号間幹擾(ISI)和子載波(ICI)是什麼,也講了什麼時候會出現ISI和ICI以及應對措施。(不懂的同學可出門左轉,及時複習!)
那麼問題了,既然要厘清OFDM符号間,前提便是要知道一個OFDM符号的起始點和結束點在哪裡,這樣才可以厘清楚不同的OFDM符号。
是以,找到OFDM符号的起始點和結束點這是一個關鍵的問題。
我舉個例子。
假設OFDM符号長度是64符号+CP長度16符号=80符号,假設這80個符号是1到80的随機數。
在沒有噪聲和信道的影響下,接收端收到這些符号,怎麼知道收到的第一個符号是不是發送端的第一個符号呢?如果不是,是第幾個符号呢?
再進一步,假設發送端循環發送一個OFDM符号是5 6 3 4 5 6,即5 6 3 4 5 6 5 6 3 4 5 6……
接收端不小心漏掉了第一個,其實他自己并不知道漏掉的是第一個或者是第幾個,反正收到了 6 3 4 5 6 5 6 3 4 5 6……
然後接收端以為6 是OFDM符号中的第一個符号,此時便認為6 3 4 5 6 5是一個OFDM符号。
可能你已經發現問題了,真正在做FFT的符号(6 3 4 5 6 5)和你想要用去做FFT(5 6 3 4 5 6)偏差了一個符号,這便是符号定時偏差。
以上的舉例不是特别嚴謹,但希望能幫助你了解符号定時偏差是什麼。
是以,為了在接收端順利的進行N點FFT,接收機需要在OFDM符号周期内得到對發射信号精确采樣。
也就是說,必須要知道哪些符号是屬于一個完整的OFDM符号,或者說需要準确知道一個完整OFDM符号的起始和結束位置。(這句話,仔細閱讀,但不用死記硬背,結合後面的代碼便能深刻了解了!!!)
對應到數學表達式來講,令 δ \delta δ 和 ε \varepsilon ε 表示歸一化的STO和CFO,則
y l [ n ] = IDFT { Y l [ k ] } = IDFT { H l [ k ] X l [ k ] + Z l [ k ] } = 1 N ∑ k = 0 N − 1 H l [ k ] X l [ k ] e j 2 π ( k + ε ) ( n + δ ) / N + z l [ n ] \begin{aligned} y_{l}[n] &=\operatorname{IDFT}\left\{Y_{l}[k]\right\}=\operatorname{IDFT}\left\{H_{l}[k] X_{l}[k]+Z_{l}[k]\right\} \\ &=\frac{1}{N} \sum_{k=0}^{N-1} H_{l}[k] X_{l}[k] \mathrm{e}^{\mathrm{j} 2 \pi(k+\varepsilon)(n+\delta) / N}+z_{l}[n] \end{aligned} yl[n]=IDFT{Yl[k]}=IDFT{Hl[k]Xl[k]+Zl[k]}=N1k=0∑N−1Hl[k]Xl[k]ej2π(k+ε)(n+δ)/N+zl[n] (1)
其中, z l [ n ] = IDFT { Z l [ k ] } z_{l}[n]=\operatorname{IDFT}\left\{Z_{l}[k]\right\} zl[n]=IDFT{Zl[k]}
在這裡 δ \delta δ 和 ε \varepsilon ε 表示歸一化的STO和CFO,你需要了解(k+ ε \varepsilon ε)是關于頻率的這一項, (n+ δ \delta δ)是關于符号位置的這一項, 這将直接決定你是否了解STO和CFO的差別。
那麼出現了STO,會對接收端有什麼影響呢?
舉個例子來說,假設真實的 δ \delta δ =3,此時令n=1,若 δ \delta δ =0,按照上面的公式(1)算出來的就是 y l [ 1 ] {y_l}\left[ 1 \right] yl[1] ,而由于實際上真實的 δ \delta δ =3,算出來的其實是 y l [ 4 ] {y_l}\left[ 4 \right] yl[4] ,但被接收機認為是 y l [ 1 ] {y_l}\left[ 1 \right] yl[1] 。
以下圖檔内容來自《MIMO-OFDM無線通信技術及MATLAB實作》第5章:
說完了STO的影響,說一下CFO。
在前面第3章和第4章内容中,均介紹過多普勒效應和收發端本地振蕩器對于頻率偏差的影響。
舉個數值的例子來說,比如發送信号的載波頻率是2000Hz,假設多普勒頻偏是30Hz,此時接收機的本振是産生1998Hz的載波頻率。此時,就有了2000+30-1998 = 32Hz。
當然,多普勒偏移的正負值是和發送機相對于接收機的移動速度的方向有關。
有了頻率偏移後,會有什麼影響呢?你先思考一下?這個留到下一篇文章再講。
二、STO的估計技術
上面已經講過了STO的定義和影響,為了保證OFDM系統性能,接收機必須利用同步技術來估計STO,即準确估計出OFDM符号的起始點和結束點。
CP是OFDM一段資料的複制,正是複制這個特點,可以通過兩滑動窗的相似度來對STO進行估計,也可通過CP與該段資料頻域上的特點,來對CFO進行估計。(這句話結合下面給出的代碼便更好了解了)
我想,這又是CP相對于ZP的一大優勢吧。
不管是基于CP還是基于訓練符号的STO技術,核心步驟,我個人總結如下:
1、窗滑動
可能是兩滑動窗均在移動,也有可能是一個滑動窗在不停向前移動,本地窗固定不動。
2、衡量相似度
可能是兩滑動窗之間的相似度,也有可能是滑動窗與本地固定窗的相似度。
相似度的衡量可以從兩個角度入手:
(1)基于相關性,則用“相乘、累加”的值來衡量,值越大,說明兩滑動窗的相似度越好;
(2)基于內插補點最小的,則用“相減、平方”的值來衡量,值越小,說明兩滑動窗的相似度越好。
當然,基于相關性和內插補點最小的思想,結合到具體的應用,可以參考下面的公式(5.10)(5.11)(5.12)等公式
3、比較
比較的目的是找出當滑動窗滑到什麼位置時,兩滑動窗之間的相似度或者滑動窗與本地固定窗的相似度最好,便将這個位置進行标記,以此作為OFDM符号的起始點。
滑動相關的思想和第3章突發通信捕獲的思想是一樣的,不過第3章中衡量的是滑動窗與本地固定窗的相似度。
當然,STO和CFO的聯合估計,可以類似地采用二維搜尋。
繼續看《MIMO-OFDM無線通信技術及MATLAB實作》第5章内容:
可能有的同學一看到大量的數學公式,就已經開始瞌睡了。不對,說不定已經睡着了。不對,說不定直接滑到下面的代碼區了,沒看到這段話,哈哈哈哈哈哈哈。
說實話,要完全搞懂那些數學公式推導是要有比較強的信号與系統、數字信号處理的基礎知識。我一開始也是看不太懂,在這裡提供兩個小建議:
(1)代具體數字:上面的公式中,都是字母表示,可代具體的數字進去了解,即用特殊情況幫助了解一般情況;
不想帶公式??(有一點真實。)
(2)運作一下代碼,看代碼一步步執行,便可以了解了。
頻域STO技術如下:
三、STO估計技術的可運作MATLAB代碼及其注意點
下面代碼内容是基于CP的STO估計,在相關性最大和內插補點最小兩種算法的性能比較。
%%%%%%%%%%%%%%%%%%%%% 基于CP的STO(符号定時偏差) %%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%% STO_estimation_sim1.m %%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%% date:2020年11月20日 author:飛蓬大将軍 %%%%%%%%%%
%%%%%%%%%%%%%%%%%程式說明
%%%%基于CP,采用最大相關和最小距離算法完成STO的估計
%%%%%% 仿真環境
%軟體版本:MATLAB R2019a
clear, figure(1), clf, figure(2), clf
nSTOs = [-3 -3 2 2]; %對應STO的采樣數
CFOs = [0 0.5 0 0.5]; %CFO向量
SNRdB = 30; %SNR
MaxIter = 10; %疊代次數
%CFOs = [0 0 0 0];
Nfft = 128; %FFT大小
Ng = Nfft/4; % GI長度
Nofdm = Nfft+Ng; % OFDM符号長度
Nbps = 2; % 2/4 對應 QPSK/16QAM
M = 2^Nbps;
Es = 1;
A = sqrt(3/2/(M-1)*Es); % QAM歸一化因子
N = Nfft;
com_delay = Nofdm/2;
Nsym = 100;
rand('seed',1);
randn('seed',1);
for i=1:length(nSTOs)
nSTO= nSTOs(i);
CFO= CFOs(i);
x = []; % 初始化信号塊
for m=1:Nsym % random bits generates
msgint=randi([0 M-1],1,N); %bits_generator(1,Nsym*N,Nbps)
Xf = A.*qammod(msgint,M,'UnitAveragePower',true);
xt = ifft(Xf,Nfft);
x_sym = add_CP(xt,Ng); %加CP
x = [x x_sym];
end
%*********************** 信道 ************************%
%%%%%在這裡根據需求添加信道,先假設是沒有信道
y = x; % 沒有信道影響
sig_pow = y*y'/length(y); % sig_pow= mean(mean(y.*conj(y),2))
%%%%%頻率偏移 + 符号定時偏移
y_CFO= add_CFO(y,CFO,Nfft); %加CFO
y_CFO_STO= add_STO(y_CFO,-nSTO); %加STO
v_ML=zeros(1,Ng);
v_Cl=zeros(1,Ng);
Mag_cor= 0;
Mag_dif= 0;
%%Add additive white gaussian noise
for iter=1:MaxIter
%%%%%%%%%%%加噪聲
y_aw = awgn(y_CFO_STO,SNRdB,'measured');
%%%%%%%Symbol Timing Acqusition
[STO_cor,mag_cor]= STO_by_correlation(y_aw,Nfft,Ng,com_delay); %書中自帶
[STO_cor_temp,mag_cor_temp]= STO_by_correlation_sim1(y_aw,Nfft,Ng,com_delay); %我自己編寫
%%%%%經驗證,以上兩者函數結果一緻
[STO_dif,mag_dif] = STO_by_difference(y_aw,Nfft,Ng,com_delay); %書中自帶
[STO_dif_temp,mag_dif_temp] = STO_by_difference_sim1(y_aw,Nfft,Ng,com_delay); %我自己編寫
%%%%%經驗證,以上兩者函數結果一緻
v_ML(-STO_cor+Ng/2)= v_ML(-STO_cor+Ng/2)+1;
v_Cl(-STO_dif+Ng/2)= v_Cl(-STO_dif+Ng/2)+1;
Mag_cor= Mag_cor + mag_cor;
Mag_dif= Mag_dif + mag_dif;
end % End of for loop of iter
%%%%%%% Probability
v_ML_v_Cl= [v_ML; v_Cl]*(100/MaxIter);
figure(1+i-1);
set(gca,'fontsize',9);
% subplot(220+i)
bar(-Ng/2+1:Ng/2,v_ML_v_Cl');
hold on, grid on
str = sprintf('nSTO Estimation: nSTO=%d, CFO=%1.2f, SNR=%3d[dB]',nSTO,CFO,SNRdB);
title(str);
xlabel('Sample'), ylabel('Probability');
legend('ML','Classen');
axis([-Ng/2-1 Ng/2+1 0 100])
%%%%%%% Time metric
Mag_cor = Mag_cor/MaxIter;
[Mag_cor_max,ind_max] = max(Mag_cor);
nc= ind_max-1-com_delay;
Mag_dif = Mag_dif/MaxIter;
[Mag_dif_min,ind_min] = min(Mag_dif);
nd= ind_min-1-com_delay;
nn= -Nofdm/2 + [0:length(Mag_cor)-1];
nt= nSTO;
% figure(2);
% subplot(220+i);
figure(5+i-1);
plot(nn,Mag_cor,nn,1.5*Mag_dif,'r:','markersize',1);
hold on
stem(nc,Mag_cor_max,'b','markersize',5);
stem(nSTO,Mag_cor(nSTO+com_delay+1),'k.','markersize',5); % Estimated/True Maximum value
str1 = sprintf('STO Estimation - ML(b-)/Classen(r:) for nSTO=%d, CFO=%1.2f',nSTO,CFO); %,SNRdB);
title(str1);
xlabel('Sample'), ylabel('Magnitude');
%stem(n1,Mag_dif_min,'r','markersize',5)
stem(nd,Mag_dif(nd+com_delay+1),'r','markersize',5);
stem(nSTO,Mag_dif(nSTO+com_delay+1),'k.','markersize',5); % Estimated/True Minimum value
set(gca,'fontsize',9, 'XLim',[-32 32], 'XTick',[-10 -3 0 2 10]); %, xlim([-50 50]),
end % End of for loop of i
圖2 nSTO = -3,CFOs = 0時,基于相關性最大和基于內插補點最小的估計性能
圖3 nSTO = -3,CFOs = 0.5時,基于相關性最大和基于內插補點最小的估計性能
圖4 nSTO = 2,CFOs = 0時,基于相關性最大和基于內插補點最小的估計性能
圖5 nSTO = 2,CFOs = 0.5時,基于相關性最大和基于內插補點最小的估計性能
運作上面的代碼,有以下幾點需要注意:
(1)原書中的STO_by_correlation和STO_by_difference不是很好了解,我自己寫了一個,與之結果一樣。
STO相關函數:
%%%%%%%%%%%%%%%%%%%%% STO相關函數 %%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%% STO_by_correlation_sim1.m %%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%% date:2020年11月20日 author:飛蓬大将軍 %%%%%%%%%%
%%%%%% 仿真環境
%軟體版本:MATLAB R2019a
function [STO_est, Mag]=STO_by_correlation_sim1(y,Nfft,Ng,com_delay)
% STO estimation by maximizing the correlation between CP and rear part of OFDM symbol
% estimates STO by maximizing the correlation between CP (cyclic prefix)
% and rear part of OFDM symbol
% Input: y = Received OFDM signal including CP
% Ng = Number of samples in Guard Interval (CP)
% com_delay = Common delay
% Output: STO_est = STO estimate
% Mag = Correlation function trajectory varying with time
N_ofdm = Nfft+Ng;
if nargin<4
com_delay = N_ofdm/2;
end
yy = y(com_delay : com_delay+ Ng-1)*y(Nfft+com_delay : Nfft+com_delay+Ng-1)';
maximum = abs(yy);
for k = 1:N_ofdm
yy_temp = y(com_delay+k : com_delay+k+Ng-1)*y( Nfft+com_delay+k : Nfft+com_delay+k+Ng-1)';%% 公式.(5.13)
Mag(k) = abs(yy_temp);
if abs(yy_temp) > maximum
maximum = abs(yy_temp);
STO_est = N_ofdm - com_delay - k + 1;
end
end
end
STO內插補點最小函數:
function [STO_est,Mag] = STO_by_difference_sim1(y,Nfft,Ng,com_delay)
% STO estimation by minimizing the difference between CP and rear part of OFDM symbol
% estimates STO by minimizing the difference between CP (cyclic prefix)
% and rear part of OFDM symbol
% Input: y = Received OFDM signal including CP
% Ng = Number of samples in CP (Guard Interval)
% com_delay = Common delay
% Output: STO_est = STO estimate
% Mag = Correlation function trajectory varying with time
N_ofdm = Nfft+Ng;
minimum = 100;
STO_est = 0;
if nargin<4
com_delay = N_ofdm/2;
end
temp = abs(y(com_delay : com_delay + Ng-1)) - abs(y(com_delay+Nfft : com_delay + Ng-1 +Nfft));
minimum = temp*temp'; % 公式.(5.12)
for k = 1:N_ofdm
temp = abs(y(com_delay + k : com_delay + k + Ng-1)) - abs(y(com_delay+Nfft+k : com_delay + Ng-1 +Nfft+k));
Mag(k) = temp*temp';
if Mag(k)<minimum
minimum = Mag(k);
STO_est = N_ofdm - com_delay - k + 1;
end
end
end
(2)噪聲考慮的是接收機熱噪聲,并沒有考慮信道對信号的影響。
是以,你可以根據自己實驗内容所需,對其添加信道,比如瑞利信道、萊斯信道等,便可以衡量出不同STO技術在相應信道下的估計性能了。
(3)實驗中加入了STO和CFO,是以是在CFO存在的時候來估計STO,不同算法表現的性能從圖中可看出稍有不同。
四、總結
同步的内容在大學的課程中講的非常少,一般就隻會介紹下載下傳波同步、位同步的概念,這導緻許多同學在腦海中覺得同步是非常容易實作,甚至覺得同步就是很“預設”的一個步驟。
然而同步其實是通信過程中最難的内容,這直接決定了後面的解調和譯碼是否能夠正确運作。
從這篇文章中,我們知道STO和CFO對OFDM系統的影響。下一講,将集中在CFO的内容。
歡迎你點贊、收藏、轉發和分享,關注我的知乎号,也歡迎讀者朋友就相關技術問題與我交流,一起學習,共同進步。請你也别忘了把這篇文章分享給你身邊正在學習通信專業的同學們,也許能夠幫到Ta。
這是《陳老濕·通信MATLAB仿真》的第8章,期待下次更新見!