m基于OFDM+QPSK和turbo编译码以及MMSE信道估计的无线图像传输matlab仿真

69 阅读1分钟

1.算法仿真效果

matlab2022a仿真结果如下:

 

25022238efc5d62723a7d0106a2e943a_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.jpg

  cea70648e4c19325793dd3e67b543e01_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.jpg

2.算法涉及理论知识概要

       基于OFDM+QPSK和Turbo编码以及MMSE信道估计的无线图像传输是一种高效可靠的无线通信系统,广泛应用于图像传输领域。该系统利用正交频分复用(OFDM)技术,将图像数据分成多个子载波进行传输,利用QPSK调制进行信号调制,通过Turbo编码增强信号容错能力,并使用MMSE(最小均方误差)信道估计技术来减小信道传输误差。

 

3fb37ecfcf4a3e14039ed85c09e8bed1_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

b682e7785b71c0c76f8c4e9a3188af73_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png  

3.MATLAB核心程序 `for iii=1:length(datbin)/Iimage_len

        [i,iii]

       %%

        %以单天线方式产生测试信号

        %msg                            = rand(Len*Nc/4,1)>=0.5;

        msg                            = [datbin(Iimage_len*(iii-1)+1:Iimage_len*iii)]';

        %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);

        %信道估计

        %mmse

        [Sig_Lrmmse,Hs]  = func_mmse_est(fft_out,pilot_space,Pilot_seq,pilot_num,delay_avg/timeval,4e-6/timeval,10^(SNR_dB(i)/10));

        %解调

        Dqpsk            = func_pideMapping(Sig_Lrmmse,fftlen*Nc);

        %turbo解码

        Dqpsk_decode     = [func_turbo_decode(2Dqpsk(1:end-(LenNc-length(seridata1)))-1,N,M)]';

        %计算误码率

        %err_num          = LenNc/4-length(find(msg==Dqpsk_decode(1:LenNc/4)));

        %Error            = Error + err_num;

        Rimages = [Rimages,[Dqpsk_decode(1:Len*Nc/4)]'];

    end`