第7章(5)内容如下:
- 一、參考資料
- 二、OFDM相關問題繼續探讨
- 三、CP和ZP對OFDM系統的影響(完整可運作MATLAB代碼及其注意點)
- 四、總結
本已打算更新OFDM同步方面的内容了,但在這之前仍有許多問題浮現在腦海,比如
(1)保護間隔(GI)和循環字首(CP)、補零(zero padding,ZP)的差別
(2)OFDM與IFFT、FFT的關系
(3)子載波(ICI)和符号間幹擾(ISI)的差別
解決以上的問題,明晰一些概念,也是為OFDM同步的内容做知識儲備。
我一直提到的《MIMO-OFDM無線通信技術及MATLAB實作》下載下傳位址是:https://github.com/LyricYang/MIMO_OFDM,該書有的代碼版本可能老舊,是以需要偶爾改改代碼适應新的MATLAB版本才可以正常運作。
是以,本文先讨論以上提到的問題,然後集中在OFDM采用ZP或者CP,經過多徑衰落信道的誤碼率分析,并附上完整可運作的代碼,代碼下載下傳位址:123kevin456/OFDM-5。
若出現代碼缺少子函數,可在《MIMO-OFDM無線通信技術及MATLAB實作》的下載下傳位址中https://github.com/LyricYang/MIMO_OFDM 找到相應函數。
一、參考資料
1、《MIMO-OFDM的無線通信技術及其MATLAB實作》
2、孫宇彤《LTE教程:原理和實作》
此書對于剛開始接觸LTE協定的我來說,有一定的幫助。該書沒有複雜的計算公式,也沒有代碼的相關驗證,用大量的例子和圖示來通俗講明白LTE協定的許多概念,不錯。
3、CSDN的《OFDM專題之子載波間幹擾問題(一)》和《OFDM專題之子載波間幹擾問題(二)》、《給“小白”圖示講解OFDM的原理》,這幾篇文章均不錯,值得多次反複學習,我時不時會翻出來閱讀,認真消化。
二、OFDM相關問題繼續探讨
1、子載波幹擾(ICI)和符号間幹擾(ISI)是什麼?出現這兩種幹擾後,各自的應對方法是什麼?保護間隔(GI)和補零(ZP)、循環字首(CP)的差別?
每次用到保護間隔時都是以CP的形式嗎?用了CP後會有子載波幹擾(ICI)和符号間幹擾(ISI)嗎?
2、IFFT與FFT等技術與OFDM實作的關系?OFDM是不是就一定要用到IFFT和FFT技術?或者更本質的講,IFFT與FFT等技術在OFDM實作中,到底起到什麼樣的作用?
3、下圖(a)中,為什麼是不同子載波信号是加到一起再進行發送呢?而不是各自發送?這是受到什麼限制了呢?
接下來對各個問題依次回答。
1、子載波幹擾(ICI)和符号間幹擾(ISI)是什麼?出現這兩種幹擾後,各自的應對方法是什麼?
在OFDM系統,最基本的傳輸機關是OFDM符号。由于同一信号的不同分量經過不同路徑到達接收端的時間不一樣。
如圖4.14所示,如果保護間隔長度小于最大多徑時延擴充,對于前一個OFDM符号的尾部已經影響到下一個OFDM符号的前端,這樣就造成ISI。
有了符号間幹擾怎麼來解決呢?
當出現這個問題的時候,有的書籍便就立馬引出來CP的概念了,但不解釋清為什麼。
其實有了符号間幹擾後,我們的目的依然是讓不同的OFDM符号區分開來,隻需要加入保護間隔(GI)即可。
而保護間隔有兩種插入方法,一種是補零(ZP),即在保護間隔中補充0。這便可以使得第n個符号經過最長路徑後也不會影響到第n+1個符号,但這會給系統帶來ICI。
(思考下為什麼帶來ICI?可以看《OFDM專題之子載波間幹擾問題(一)》和《OFDM專題之子載波間幹擾問題(二)》,這兩篇文章解釋得非常好)。
另一種便是CP。這個在《第7章:OFDM 信道估計與均衡(1)》中也已經講到過其作用。
CP是既起到了保護間隔作用,避免了ISI,同時又使得循環擴充(為了某種連續性,可以說是為了循環卷積)消除了ICI,真是非常巧妙。
加CP和加ZP,對應在下面的代碼中,是信号在接收端的處理方式有所不同。
function y=remove_GI(Ng,Lsym,NgType,ofdmSym)
if Ng~=0
if NgType==1 % cyclic prefix
y=ofdmSym(Ng+1:Lsym);
elseif NgType==2 % zp
y=ofdmSym(1:Lsym-Ng)+[ofdmSym(Lsym-Ng+1:Lsym) zeros(1,Lsym-2*Ng)];
end
else
y=ofdmSym;
end
2、IFFT與FFT等技術與OFDM實作的關系?OFDM是不是就一定要用到IFFT和FFT技術?或者更本質地講,IFFT與FFT等技術在OFDM實作中,到底起到什麼樣的作用?
在實作OFDM時,IFFT和FFT不是唯一的方法,但是一種比較好的方法。
孫宇彤《LTE教程:原理和實作》還介紹了OFDM信号的其他生成算法,比如反向離散哈特利變換(IDHT)、離散餘弦變換等等。
接下來再舉孫宇彤《LTE教程:原理和實作》中講到IFFT作用,這與我在别的地方看到的不一樣,可做參考。
三、CP和ZP對OFDM系統的影響(完整可運作MATLAB代碼及其注意點)
%%%%%%%%%%%%%%%%%%%%% 檢查正弦信号間的相交性 %%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%% OFDM_basic_myself3.m %%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%% data:2020年12月11日 author:飛蓬大将軍 %%%%%%%%%%
%%%%%%%%%%%%%%%%%程式說明
%%%(1)CP和ZP作用 (2)子載波幹擾與符号間幹擾的差別及其消除方法
%%%%%% 仿真環境
%軟體版本:MATLAB R2019a
%**************************** 程式主體 **************************%
clear all;
%%%%%%%%%%%%%%%%%%%%參數設定%%%%%%%%%%%%%
%%%%選擇CP或ZP
NgType = 1; %對于ZP或CP NgType = 1或2
if NgType == 1
nt = 'CP';
elseif NgType == 2
nt = 'ZP';
end
%%%%選擇信道類型
Ch = 0;
if Ch == 0
chType ='AWGN'; %高斯白噪聲信道
Target_neb = 100;
else
chType ='CH';
Target_neb = 500;
end
figure(Ch+1);
clf;
PowerdB = [0 -8 -17 -21 -25]; %信道抽頭功率特性'dB'
Delay = [0 3 5 6 8]; %信道時延
Power = 10.^(PowerdB/10); %信道抽頭功率特性 '線性'
Ntap = length(PowerdB);
Lch = Delay(end)+1;
Nbps = 2; %調制階數 2/4/6
M = 2^Nbps; %QPSK、16-QAM、64-QAM
Nfft = 64; %FFT大小
%Ng = 3;
Ng = Nfft/4; %保護間隔(GI)長度,若沒有保護間隔,Ng = 0
Nsym = Nfft + Ng; %符号周期
%%%調整Nvc
Nvc = Nfft/4; %Nvc若等于0,則沒有VC(虛拟子載波)
% Nvc = 0; %Nvc若等于0,則沒有VC(虛拟子載波)
Nused = Nfft - Nvc; %Nused為用于傳輸資料的子載波數
EbN0 = [0:2:20]; %Eb/N0
% EbN0 = 50; %Eb/N0
N_iter = 1e5; %對于每一次EbN0的疊代次數
Nframe = 3; %每一幀的符号數
sigPow = 0; %初始信号功率
file_name = ['OFDM_BER_' chType '_' nt '_' 'GL' num2str(Ng) '.dat'];
fid = fopen(file_name,'w+');
norms = [1 sqrt(2) 0 sqrt(10) 0 sqrt(42)]; %BPSK 4-QAM 16-QAM
for i = 0:length(EbN0)
randn('state',0);
rand('state',0);
Ber2=ber(); %初始化BER
Neb = 0; %初始化誤比特數
Ntb = 0; %初始化總比特數
for m = 1:N_iter
X = randi([0 M-1],1,Nused*Nframe);
Xmod = qammod(X,M,'gray')/norms(Nbps);
if NgType~=2
x_GI = zeros(1,Nframe*Nsym);
elseif NgType == 2
x_GI = zeros(1,Nframe*Nsym+Ng);
end
% kk1 = 1:Nused/2;
% kk2 = Nused/2+1:Nused;
kk1 = [1:Nused/2];
kk2 = [Nused/2+1:Nused];
kk3 = 1:Nfft;
kk4 = 1:Nsym;
for k = 1:Nframe
if Nvc~= 0
X_shift = [0 Xmod(kk2) zeros(1,Nvc-1) Xmod(kk1)];
else
X_shift = [Xmod(kk2) Xmod(kk1)];
end
x = ifft(X_shift);
x_GI(kk4) = guard_interval(Ng,Nfft,NgType,x);
kk1 = kk1 + Nused;
kk2 = kk2 + Nused;
kk3 = kk3 + Nfft;
kk4 = kk4 + Nsym;
end
%%%%%能量檢測
if i == 0 %隻測量信号功率
sigPow_temp = x_GI*x_GI';;
end
if Ch==0
y = x_GI; %沒有信道
else %多徑衰落信道
channel =(randn(1,Ntap)+1j*randn(1,Ntap)).*sqrt(Power/2);
h = zeros(1,Lch);
h(Delay+1) = channel;
y = conv(x_GI,h);
end
if i == 0 %隻測量信号功率
y1 = y(1:Nframe*Nsym);
sigPow = sigPow + y1*y1';
continue;
end
%******************** 信道 ***********************%
snr = EbN0(i) + 10*log10(Nbps*(Nused/Nfft)); %%友善fig标号,(1),原書公式
% snr = EbN0(i) + 10*log10(Nbps);
% snr = EbN0(i) + 10*log10(Nbps*(Nfft/Nsym)); %%友善fig标号,(3)CP消耗能量
noise_msg = sqrt((10.^(-snr/10))*sigPow/2);
y_GI = y + noise_msg*(randn(size(y)) + 1j*randn(size(y)));
%%%%%%%%%%%接收端
kk1 = (NgType==2)*Ng + [1:Nsym];
kk2 = 1:Nfft;
kk3 = 1:Nused;
kk4 = Nused/2 + Nvc + 1:Nfft;
kk5 = (Nvc~=0)+[1:Nused/2];
if Ch ==1
H = fft([h zeros(1,Nfft-Lch)]); %信道頻率響應
H_shift(kk3) = [H(kk4) H(kk5)];
end
for k =1:Nframe
Y(kk2) = fft(remove_GI(Ng,Nsym,NgType,y_GI(kk1)));
Y_shift = [Y(kk4) Y(kk5)];
if Ch ==0
Xmod_r(kk3) = Y_shift;
else
Xmod_r(kk3) = Y_shift./H_shift; %均衡器
end
kk1 = kk1 + Nsym;
kk2 = kk2 + Nfft;
kk3 = kk3 + Nused;
kk4 = kk4 + Nfft;
kk5 = kk5 + Nfft;
end
X_r = qamdemod(Xmod_r*norms(Nbps),M,'gray');
Neb = Neb + sum(sum(de2bi(X_r,Nbps)~=de2bi(X,Nbps)));
Ntb = Ntb + Nused*Nframe*Nbps;
% if Neb>Target_neb
% break
% end
end
if i == 0
sigPow = sigPow/Nsym/Nframe/N_iter;
fprintf('Signal power= %11.3e\n', sigPow);
fprintf(fid,'%%Signal power= %11.3e\n%%EbN0[dB] BER\n', sigPow);
else
Ber = Neb/Ntb;
fprintf('EbN0=%3d[dB], BER=%4d/%8d=%11.3e\n', EbN0(i), Neb,Ntb,Ber)
fprintf(fid, '%d\t%11.3e\n', EbN0(i), Ber);
if Ber<1e-6
break;
end
end
end %end for i
if(fid~=0)
fclose(fid);
end
disp('sumualtion is finished');
plot_ber(file_name,Nbps);
%%%%選擇CP或ZP
if Ch == 1
if NgType == 1
a = load(file_name);
save('ofdm_basic_myself3_cp16_rayleigh','a');
elseif NgType == 2
b = load(file_name);
save('ofdm_basic_myself3_zp16_rayleigh','b');
end
else
%%%%%%%%%%%%%%實驗記錄
%%%%2020年12月11日
%%%%CP和ZP都能起到保護間隔的作用,消除了子載波幹擾和符号間幹擾
%%%%在AWGN和瑞利信道下均能畫出正确誤碼率曲線
在上面的代碼中,有以下幾點值得注意:
(1)SNR其實是ES/N0
原書公式snr = EbN0(i) + 10log10(Nbps)+10log10*(Nused/Nfft)),其實是EsN0(i) = EbN0(i) + 10log10(Nbps)+10log10*(Nused/Nfft)) 有10*log10(Nbps)這一項是很好了解的,因為一個調制後的符号能量是Nbps個比特的能量。後面的10*log10*(Nused/Nfft))讓我想了非常久。
由 E b R b = E s R s {E_b}{R_b} = {E_s}{R_s} EbRb=EsRs ,得到 E s N 0 = E b N 0 R b R s \frac{{{E_s}}}{{{N_0}}} = \frac{{{E_b}}}{{{N_0}}}\frac{{{R_b}}}{{{R_s}}} N0Es=N0EbRsRb 。
R b = N u s e d N b p s T s y m + T G I {R_b} = \frac{{{N_{used}}Nbps}}{{{T_{sym}} + {T_{GI}}}} Rb=Tsym+TGINusedNbps ,而 R s = N f f t T s y m + T G I {R_s} = \frac{{{N_{fft}}}}{{{T_{sym}} + {T_{GI}}}} Rs=Tsym+TGINfft ,有了這兩個公式,便可以了解上面EsN0與 EbN0的換算關系了。
而書中給出了時域信噪比和頻域信噪比的概念,這是我第一次聽說這兩名詞。
在這裡沒有考慮我之前的通信有效性與可靠性的衡量,即将保護間隔當做備援處理。
(2)以上的代碼是基帶仿真!基帶仿真!基帶仿真!
有的同學可能覺得經過IFFT之後,信号便被“調制”了。調制的目的是“搬移頻譜”,做IFFT變換隻是在基帶上搬移了。
經過IFFT後的信号當做一個整體,再去乘以coswt,進行上載波,整體的搬移,信号才搬移到帶通信号了。
圖1 CP和ZP對AWGN下OFDM的誤碼率影響
(3)調整NgType、CH的值、不同的調制方式、Ng的長度便可以得到相應的實驗結果。
下面的圖中,AWGN analytic是AWGN信道下的理論誤碼率曲線、Rayleigh fading analytic是多徑瑞利信道下的理論誤碼率曲線,下同。
simulation是根據實驗條件的仿真曲線,比如是加入CP還是ZP、在AWGN信道還是多徑瑞利信道、CP或ZP的長度對實驗的影響等等。
圖2 多徑瑞利信道,CP長為16的誤碼率曲線圖
圖3 多徑瑞利信道,ZP長為16的誤碼率曲線圖
從圖2和圖3,可以看出CP和ZP長度大于最長路徑時延時,且接收端完美知道信道狀态資訊,并能對有信道進行補償後,都可使得兩者的誤碼率曲線接近理論誤碼率曲線,實驗正确。
改變CP和ZP的長度為3:
圖4 多徑瑞利信道,ZP、CP長為3的誤碼率曲線圖
圖5 多徑瑞利信道,ZP或CP為0的誤碼率曲線圖
(4)代碼中還未對基帶信号進行加窗處理,或者升餘弦滾降處理,後續再考慮。
四、總結
OFDM系統中概念确實較多,然通過死記硬背不能充分了解各個知識點的前因後果,便常在腦海中有許多為什麼?
《MIMO-OFDM的無線通信技術及其MATLAB實作》中大量的數學公式和代碼,但較枯燥;
而CSDN的《OFDM專題之子載波間幹擾問題(一)》和《OFDM專題之子載波間幹擾問題(二)》、《給“小白”圖示講解OFDM的原理》,作者會結合圖例與自己的了解,以更加通俗的方式講出來。
以上兩類材料,相得益彰,一起閱讀,效果更好。是以,同一個知識點,看不同的人講,交叉驗證,能幫助學習更紮實。
歡迎你輕按兩下螢幕、點贊、收藏、轉發和分享,關注我的知乎号、CSDN号,也歡迎讀者朋友就相關技術問題與我交流,一起學習,共同進步。請你也别忘了把這篇文章分享給你身邊正在學習通信專業的同學們,也許能夠幫到Ta。
這是《陳老濕·通信MATLAB》仿真的第7章,期待下次更新見!