天天看點

第7章:OFDM 信道估計與均衡(5)一、參考資料二、OFDM相關問題繼續探讨三、CP和ZP對OFDM系統的影響(完整可運作MATLAB代碼及其注意點)四、總結

第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)中,為什麼是不同子載波信号是加到一起再進行發送呢?而不是各自發送?這是受到什麼限制了呢?

第7章:OFDM 信道估計與均衡(5)一、參考資料二、OFDM相關問題繼續探讨三、CP和ZP對OFDM系統的影響(完整可運作MATLAB代碼及其注意點)四、總結

接下來對各個問題依次回答。

1、子載波幹擾(ICI)和符号間幹擾(ISI)是什麼?出現這兩種幹擾後,各自的應對方法是什麼?

在OFDM系統,最基本的傳輸機關是OFDM符号。由于同一信号的不同分量經過不同路徑到達接收端的時間不一樣。

第7章:OFDM 信道估計與均衡(5)一、參考資料二、OFDM相關問題繼續探讨三、CP和ZP對OFDM系統的影響(完整可運作MATLAB代碼及其注意點)四、總結

如圖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不是唯一的方法,但是一種比較好的方法。

第7章:OFDM 信道估計與均衡(5)一、參考資料二、OFDM相關問題繼續探讨三、CP和ZP對OFDM系統的影響(完整可運作MATLAB代碼及其注意點)四、總結
第7章:OFDM 信道估計與均衡(5)一、參考資料二、OFDM相關問題繼續探讨三、CP和ZP對OFDM系統的影響(完整可運作MATLAB代碼及其注意點)四、總結
第7章:OFDM 信道估計與均衡(5)一、參考資料二、OFDM相關問題繼續探讨三、CP和ZP對OFDM系統的影響(完整可運作MATLAB代碼及其注意點)四、總結

孫宇彤《LTE教程:原理和實作》還介紹了OFDM信号的其他生成算法,比如反向離散哈特利變換(IDHT)、離散餘弦變換等等。

第7章:OFDM 信道估計與均衡(5)一、參考資料二、OFDM相關問題繼續探讨三、CP和ZP對OFDM系統的影響(完整可運作MATLAB代碼及其注意點)四、總結
第7章:OFDM 信道估計與均衡(5)一、參考資料二、OFDM相關問題繼續探讨三、CP和ZP對OFDM系統的影響(完整可運作MATLAB代碼及其注意點)四、總結

接下來再舉孫宇彤《LTE教程:原理和實作》中講到IFFT作用,這與我在别的地方看到的不一樣,可做參考。

第7章:OFDM 信道估計與均衡(5)一、參考資料二、OFDM相關問題繼續探讨三、CP和ZP對OFDM系統的影響(完整可運作MATLAB代碼及其注意點)四、總結
第7章:OFDM 信道估計與均衡(5)一、參考資料二、OFDM相關問題繼續探讨三、CP和ZP對OFDM系統的影響(完整可運作MATLAB代碼及其注意點)四、總結

三、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} Eb​Rb​=Es​Rs​ ,得到 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}}} N0​Es​​=N0​Eb​​Rs​Rb​​ 。

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​+TGI​Nused​Nbps​ ,而 R s = N f f t T s y m + T G I {R_s} = \frac{{{N_{fft}}}}{{{T_{sym}} + {T_{GI}}}} Rs​=Tsym​+TGI​Nfft​​ ,有了這兩個公式,便可以了解上面EsN0與 EbN0的換算關系了。

而書中給出了時域信噪比和頻域信噪比的概念,這是我第一次聽說這兩名詞。

第7章:OFDM 信道估計與均衡(5)一、參考資料二、OFDM相關問題繼續探讨三、CP和ZP對OFDM系統的影響(完整可運作MATLAB代碼及其注意點)四、總結

在這裡沒有考慮我之前的通信有效性與可靠性的衡量,即将保護間隔當做備援處理。

(2)以上的代碼是基帶仿真!基帶仿真!基帶仿真!

有的同學可能覺得經過IFFT之後,信号便被“調制”了。調制的目的是“搬移頻譜”,做IFFT變換隻是在基帶上搬移了。

經過IFFT後的信号當做一個整體,再去乘以coswt,進行上載波,整體的搬移,信号才搬移到帶通信号了。

第7章:OFDM 信道估計與均衡(5)一、參考資料二、OFDM相關問題繼續探讨三、CP和ZP對OFDM系統的影響(完整可運作MATLAB代碼及其注意點)四、總結

圖1 CP和ZP對AWGN下OFDM的誤碼率影響

(3)調整NgType、CH的值、不同的調制方式、Ng的長度便可以得到相應的實驗結果。

下面的圖中,AWGN analytic是AWGN信道下的理論誤碼率曲線、Rayleigh fading analytic是多徑瑞利信道下的理論誤碼率曲線,下同。

simulation是根據實驗條件的仿真曲線,比如是加入CP還是ZP、在AWGN信道還是多徑瑞利信道、CP或ZP的長度對實驗的影響等等。

第7章:OFDM 信道估計與均衡(5)一、參考資料二、OFDM相關問題繼續探讨三、CP和ZP對OFDM系統的影響(完整可運作MATLAB代碼及其注意點)四、總結

圖2 多徑瑞利信道,CP長為16的誤碼率曲線圖

第7章:OFDM 信道估計與均衡(5)一、參考資料二、OFDM相關問題繼續探讨三、CP和ZP對OFDM系統的影響(完整可運作MATLAB代碼及其注意點)四、總結

圖3 多徑瑞利信道,ZP長為16的誤碼率曲線圖

從圖2和圖3,可以看出CP和ZP長度大于最長路徑時延時,且接收端完美知道信道狀态資訊,并能對有信道進行補償後,都可使得兩者的誤碼率曲線接近理論誤碼率曲線,實驗正确。

改變CP和ZP的長度為3:

第7章:OFDM 信道估計與均衡(5)一、參考資料二、OFDM相關問題繼續探讨三、CP和ZP對OFDM系統的影響(完整可運作MATLAB代碼及其注意點)四、總結

圖4 多徑瑞利信道,ZP、CP長為3的誤碼率曲線圖

第7章:OFDM 信道估計與均衡(5)一、參考資料二、OFDM相關問題繼續探讨三、CP和ZP對OFDM系統的影響(完整可運作MATLAB代碼及其注意點)四、總結

圖5 多徑瑞利信道,ZP或CP為0的誤碼率曲線圖

(4)代碼中還未對基帶信号進行加窗處理,或者升餘弦滾降處理,後續再考慮。

四、總結

OFDM系統中概念确實較多,然通過死記硬背不能充分了解各個知識點的前因後果,便常在腦海中有許多為什麼?

《MIMO-OFDM的無線通信技術及其MATLAB實作》中大量的數學公式和代碼,但較枯燥;

而CSDN的《OFDM專題之子載波間幹擾問題(一)》和《OFDM專題之子載波間幹擾問題(二)》、《給“小白”圖示講解OFDM的原理》,作者會結合圖例與自己的了解,以更加通俗的方式講出來。

以上兩類材料,相得益彰,一起閱讀,效果更好。是以,同一個知識點,看不同的人講,交叉驗證,能幫助學習更紮實。

歡迎你輕按兩下螢幕、點贊、收藏、轉發和分享,關注我的知乎号、CSDN号,也歡迎讀者朋友就相關技術問題與我交流,一起學習,共同進步。請你也别忘了把這篇文章分享給你身邊正在學習通信專業的同學們,也許能夠幫到Ta。

這是《陳老濕·通信MATLAB》仿真的第7章,期待下次更新見!

繼續閱讀