m基於深度學習的OFDM+QPSK鏈路通道估計和均衡演算法誤位元速率matlab模擬,對比LS,MMSE及LMMSE傳統演算法

我爱C编程發表於2024-06-25

1.演算法模擬效果

本程式系統是《m基於深度學習的OFDM通道估計和均衡演算法誤位元速率matlab模擬,對比了LS,MMSE以及LMMSE等傳統的通道估計演算法》的的升級。

升級前原文章連結

增加了訓練樣本自動產生功能,演算法複雜度對比功能,演算法抗頻偏效能分析功能。

matlab2022a模擬結果如下:

2.演算法涉及理論知識概要

隨著無線通訊的快速發展,5G正逐漸成長為支撐全社會各行業運作的大型基礎性網際網路絡,其服務範圍的大幅擴充套件對底層技術提出了諸多挑戰,尤其是作為物理層關鍵技術之一的正交分頻多工(Orthogonal Frequency Division Multiplexing,OFDM)。近來,深度學習因其在計算機視覺以及自然語言處理領域中的優異表現而備受關注,其極強的普適性也為傳統通訊提供了新的發展空間。就OFDM系統中的通道估計問題展開深入研究,探索深度學習在該領域的應用可能。

通道估計器是接收機一個很重要的組成部分。在OFDM系統中,通道估計器的設計上要有兩個問題:一是導頻資訊的選擇,由於無線通道的時變特性,需要接收機不斷對通道進行跟蹤,因此導頻資訊也必須不斷的傳送: 二是既有較低的複雜度又有良好的導頻跟蹤能力的通道估計器的設計,在確定導頻傳送方式和通道估計準則條件下,尋找最佳的通道估計器結構。 **在實際設計中,導頻資訊的選擇和最佳估計器的設計通常又是相互關聯的,因為估計器的效能與導頻資訊的傳輸方式有關。

基於OFDM 的通訊系統如下:

基於深度學習的通道估計:

深度學習(英語:deep learning),是一個多層神經網路是一種機器學習方法。在深度學習出現之前,由於諸如區域性最優解和梯度消失之類的技術問題,沒有對具有四層或更多層的深度神經網路進行充分的訓練,並且其效能也不佳。但是,近年來,Hinton等人透過研究多層神經網路,提高學習所需的計算機功能以及透過Web的開發促進培訓資料的採購,使充分學習成為可能。結果,它顯示出高效能,壓倒了其他方法,解決了與語音,影像和自然語言有關的問題,並在2010年代流行。

深度學習(Deep Learning, DL),由Hinton等人於2006年提出,是機器學習(MachineLearning, ML)的一個新領域。深度學習被引入機器學習使其更接近於最初的目標----人工智慧(AI,Artificial Intelligence)。深度學習是學習樣本資料的內在規律和表示層次,這些學習過程中獲得的資訊對諸如文字、影像和聲音等資料的解釋有很大的幫助。它的最終目標是讓機器能夠像人一樣具有分析學習能力,能夠識別文字、影像和聲音等資料。深度學習是一個複雜的機器學習演算法,在語言和影像識別方面取得的效果,遠遠超過先前相關技術。它在搜尋技術、資料探勘、機器學習、機器翻譯、自然語言處理、多媒體學習、語音、推薦和個性化技術,以及其它相關領域都取得了很多成果。深度學習使機器模仿視聽和思考等人類的活動,解決了很多複雜的模式識別難題,使得人工智慧相關技術取得了很大進步。 基於深度學習的引數估計方法DL-CE,採用LS方法獲取導頻位置處的CFR,再透過所設計的深度學習估計網路獲取各個資料符號位置的通道響應。由於在多徑環境下,通道呈現頻域選擇性衰落,傳統的線性插值方法無法跟蹤通道的變化。基於深度學習的通道估計方法,同時估計通道響應與通道的頻域相關係數,可以實時追蹤通道的頻域變化。

3.MATLAB核心程式

load DL_train\dl.mat
for i=1:length(SNR_dB) 
    i
    Error   = 0;  
    err_all = 0;
    for iii=1:nloop(i)
       %%
        %以單天線方式產生測試訊號
        msg                            = rand(Len*Nc/4,1)>=0.5;
        %turbo編碼
        seridata1                      = func_turbo_code(msg,N,M);
        seridata                       = [seridata1,zeros(1,Len*Nc-length(seridata1))]';
        %QPSK對映
        [Qpsk0,Dqpsk_pilot,symbol_bit] = func_piQPSK_mod(seridata);
        %變換為矩陣   
        Qpsk_matrix                    = reshape(Qpsk0,fftlen,Nc);
        [Pilot_in,pilot_num,Pilot_seq,pilot_space] = func_insert_pilot(Dqpsk_pilot,Qpsk_matrix,pilot_type,T,TG);
        Pilot_in                       = fft(Pilot_in);
        %sub carrier mapping
        Pilot_in                       = func_subcarrierMap(Pilot_in); 
        %IFFT transform,產生OFDM訊號
        ifft_out                       = ifft(Pilot_in);
        %插入包含間隔  ,迴圈字首   
        Guard_int                      = ceil(BWs/fftlen);  
        Guard_int_ofdm                 = func_guard_interval_insert(ifft_out,fftlen,Guard_int);   
        %將矩陣資料轉換為序列進行輸出
        Guard_int_ofdm_out             = reshape(Guard_int_ofdm,1,(fftlen+Guard_int)*(Nc+pilot_num));
        
       %%
        %Step1:大規模MIMO通道
        [Hm,Hmmatrix]            = func_mychannels(Radius,Scale1,Scale2,Nh,Nv);       
        %Step2:多徑引數和大規模MIMO引數輸入到通道模型中
        %通道取樣點數,每個調製符號採一個點
        [passchan_ofdm_symbol]   = func_conv_channels(Hmmatrix,Guard_int_ofdm_out,Nmultipath,Pow_avg,delay_multi,Fre_offset,timeval,iii);
        %Step3:噪聲通道 
        Rec_ofdm_symbol          = awgn(passchan_ofdm_symbol,SNR_dB(i),'measured');
        
       %%
        %開始接收
        Guard_int_remove = func_guard_interval_remove(Rec_ofdm_symbol,(fftlen+Guard_int),Guard_int,(Nc+pilot_num));
        %FFT
        fft_out          = fft(Guard_int_remove);
        %sub carrier demapping
        fft_out          = func_desubcarrierMap(fft_out);
        fft_out          = ifft(fft_out);
        %通道估計
        %func_DL_est
        [Sig_Lrmmse,Hs]  = func_DLest(fft_out,pilot_space,Pilot_seq,pilot_num,delay_avg/timeval,4e-6/timeval,10^(SNR_dB(i)/10),Guard_int);
        %解調
        Dqpsk            = func_pideMapping(Sig_Lrmmse,fftlen*Nc);
        %turbo解碼
        Dqpsk_decode     = [func_turbo_decode(2*Dqpsk(1:end-(Len*Nc-length(seridata1)))-1,N,M)]';
        %計算誤位元速率
        err_num          = Len*Nc/4-length(find(msg==Dqpsk_decode(1:Len*Nc/4)));
        Error            = Error + err_num;
    end
    %計算誤位元速率
    err_all       = err_all+Len*Nc/4;
    Err_Rate(i)   = Error/err_all/nloop(i);
end
......................................
0sj_001m

  

相關文章