其他分享
首页 > 其他分享> > 【通信】OFDM-MIMO通信建模与仿真【Matlab 250期】

【通信】OFDM-MIMO通信建模与仿真【Matlab 250期】

作者:互联网

一、简介

MIMO-OFDM系统的接收信号是多个发射天线发送信号的衰落与加性噪声的线性叠加,若采用通常SISO-OFDM系统或MIMO系统的估计算法估计信道,将会带来很大的估计误差。出于设计实现的考虑,本文主要研究理论相对比较成熟的慢变环境下基于训练序列的MIMO-OFDM系统的信道估计算法。本章将主要讨论MIMO-OFDM系统特殊训练序列的设计和信道估计算法的选择。

多天线系统的信道估计算法同单天线系统的相比具有更大的复杂性,因为接收信号是多个发射信号的叠加信号,这些发射信号同时从多个发射天线上发射出来,几乎同步到达任一接收天线。因此要从一个叠加信号中正确的识别出多个发射信号,需要信道估计算法能估计出各发射天线到同一接收天线之间多个并行信道的信道特性。而任一发射天线到任一接收天线之间的信道估计可参考单天线系统的算法。

信道估计算法主要可以分为两种:盲估计算法和非盲估计算法。盲信道估计算法不需要在发送信息中插入训练序列,节约了带宽。盲估计算法的实现需要利用发送信息内包含的统计信息。这通常需要在接收端对接收信号进行复杂的数学运算,算法的运算量一般都很大,不适合应用于对时延要求比较高的实时系统。非盲估计算法是在发送信号中插入收发两端都事先己知的信息,接收端在接收到该已知信息之后,由该信息的幅度、载频或相位变化来估计信道对发送信息所造成的衰落影响。算法应用广泛,几乎可以应用于所有的无线通信系统。

输入信号经复用器分解成n个长度相同的数据流,然后进行独立地编码和调制,因此它不是基于发射分集的。这些编码器可以是二进制的卷积编码器,也可以是不经过任何编码直接输出。

二、源代码

N_Tx_ant = 2;  %  发送天线数
N_Rx_ant = 2;  %  接收天线数
N_ant_pair = N_Tx_ant*N_Rx_ant;
N_user = 1;    %  用户数
N_sym = 10;    %  每帧中OFDM符号数,不包括两个前缀OFDM符号,LTE中一帧长度为6~7个OFDM符号
N_frame = 10;  %  仿真的帧个数
Eb_NoStart = 0;         %  仿真循环开始的Eb_No,定义为每比特的能量Eb和噪声的单边功率谱密度No的比值, dB值                                                    
Eb_NoInterval = 2;      %  仿真Eb/No的间隔值(dB)
Eb_NoEnd = 20;          %  仿真Eb/No的终止值(dB)   
fs = 15.36e6;                           %  基带抽样频率(Hz) 1024*15KHz=15360000Hz
T_sample = 1/fs;                        %  基带时域样点间隔(s)
N_subc = 1024;                          %  OFDM子载波总数,即FFT点数
Idx_used = [-300:-1 1:300];             %  使用的子载波编号,一共使用600个子载波
Idx_pilot = [-300:25:-25 25:25:300];    %  导频子载波编号,导频间隔为24
N_used = length(Idx_used);              %  使用的子载波数600
N_pilot = length(Idx_pilot);            %  导频的子载波数
N_data = N_used-N_pilot;                %  一个OFDM符号内所有用户发送的数据的子载波数
Idx_data = zeros(1,N_data);             %  得到数据子载波的编号

m = 1; n = 1;
for k = 1:length(Idx_used)        
	if Idx_used(k) ~= Idx_pilot(m);
        Idx_data(n) = Idx_used(k); 
        n = n + 1;
    elseif m ~= N_pilot
            m = m + 1;
    end
end   %  为编程使用方便,调整子载波编号为从1开始,到子载波总数

Idx_used = Idx_used + N_subc/2 +1;    %  使用的子载波坐标   
Idx_pilot = Idx_pilot + N_subc/2 +1;  %  导频子载波坐标                                                  
Idx_data = Idx_data + N_subc/2 +1;    %  数据子载波坐标,坐标0+1024/2+1=513子载波为空,既不是数据,也不是导频
PilotValue = ones(N_pilot,1);         %  导频值为全1
PrefixRatio = 1/4;                    %  循环前缀所占比例     
T_sym = T_sample*((1+PrefixRatio)*N_subc);      %  一个OFDM符号(包含循环前缀)的持续时间
Modulation = 2;                                 %  调制方式选择QPSK调制
Es = 1;                                         %  在QPSK调制方式下,符号能量都被归一化 
Eb = Es/Modulation;                             %  每比特能量

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

snr_idx = 1;
for Eb_No_dB = Eb_NoStart:Eb_NoInterval:Eb_NoEnd  
    Eb_No = 10^(Eb_No_dB/10);       %  线性信噪比
    var_noise = Eb/(2*Eb_No);       %  噪声样点的功率,No为单边功率:No=2*var_noise
     for frame = 1:N_frame          %  逐帧循环计算
        [user_bit, user_bit_cnt] = user_bit_gen(N_user, N_data ,N_sym, Modulation);% 多用户数据生成模块,每个用户一帧的数据
        coded_user_bit = user_bit;  %  无信道编码
        [user_subc_alloc, mod_subc ,pwr_subc, pad_bit_cnt] = adpt_mod_para...
            (coded_user_bit, N_sym, Idx_data);  %  子载波分配  
        mod_sym = modulator(coded_user_bit, user_subc_alloc, mod_subc,...
            pwr_subc, pad_bit_cnt, N_subc, N_sym);   %  按照给定的每用户,每子载波的调制方式,进行调制
        st_coded = st_coding(mod_sym, N_Tx_ant);  %  发送分集,使用空时分组码编码
        pilot_added = pilot_insert(st_coded, Idx_pilot, PilotValue);  %  加导频
        transmit_signal = ofdm_mod(pilot_added, PrefixRatio, N_subc, N_sym, N_Tx_ant);  % OFDM调制,加循环前缀.
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        transmit_signal_power = var(transmit_signal);  %  发送信号功率
        length_noise = size(transmit_signal, 2);
        noise = gausnoise(Eb_No_dB, transmit_signal_power, length_noise);  %  产生复噪声序列
        recv_signal = transmit_signal+noise;  %  接收到的信号加噪声
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        for u = 1:N_user  %  多个用户接收机的循环    
            data_sym = ofdm_demod(recv_signal, PrefixRatio, N_subc, N_sym, N_Rx_ant);  %  OFDM解调,去循环前缀.
            channel_ls = channel_est(data_sym, Idx_pilot, N_pilot, N_sym, N_Tx_ant,N_Rx_ant, N_subc);  %  信道估计
            st_decoded = st_decoding(data_sym, channel_ls, N_Tx_ant, N_Rx_ant, Idx_data);  %  接收机分集处理和空时解码
            demod_user_bit = demodulator(st_decoded, user_subc_alloc{u}, mod_subc{u},...
                pad_bit_cnt(u), N_sym);  %  根据发射端的调制方式进行解调
            decoded_user_bit{u} = demod_user_bit;  %  无信道解码
            bit_err = sum(abs(decoded_user_bit{u}-user_bit{u}));  %  误码率计算
            user_bit_err{u}(frame, snr_idx) = bit_err;
        end  %  多个用户接收机的循环结束

三、运行结果

在这里插入图片描述

四、备注

完整代码或者代写添加QQ912100926
往期回顾>>>>>>
【信号处理】基于GUI界面之处理录音与音频【Matlab 123期】
【信号处理】CDR噪声和混响抑制【含Matlab源码 198期】
【信号处理】最小二乘法解决稀疏信号恢复问题【Matlab 199期】
【信号处理】遗传算法的VST混响【Matlab 200期】
【信号处理】HMM的睡眠状态检测【Matlab 201期】
【信号处理】小波变换的音频水印嵌入提取【Matlab 202期】
【信号处理】ICA算法信号分离【Matlab 203期】
【信号处理】基于GUI界面的脉搏信号之脉率存档【Matlab 204期】
【信号处理】基于GUI界面的虚拟信号发生器(各种波形)【Matlab 205期】
【信号处理】基于GUI界面信号发生器之电子琴【Matlab 206期】
【信号处理】数字电子琴设计与实现【Matlab 207期】
【雷达通信】雷达数字信号处理【Matlab 214期】
【雷达通信】线性调频(LFM)脉冲压缩雷达仿真【Matlab 215期】
【雷达通信】距离多普勒(RD)、CS、RM算法的机载雷达成像【Matlab 216期】
【雷达通信】《现代雷达系统分析与设计》【Matlab 217期】
【语音处理】基于matlab GUI语音信号处理平台【含Matlab源码 218期】
【语音采集】基于GUI语音信号采集【Matlab 219期】
【语音调制】基于GUI语音幅度调制【Matlab 220期】
【语音合成】基于GUI语音合成【Matlab 221期】
【语音识别】基于GUI语音基频识别【Matlab 222期】
【语音加密】基于GUI语音信号加密解密【Matlab 223期】
【信号处理】小波变换的语音增强【Matlab 224期】
【信号处理】基于GUI语音去噪【Matlab 225期】
【语音增强】基于GUI维纳滤波之语音增强【Matlab 226期】
【音频处理】基于GUI语音信号处理【含Matlab 227期】
【雷达通信】基于GUI雷达定位【Matlab 244期】
【雷达通信】基于GUI雷达脉冲压缩【Matlab 245期】
【雷达通信】基于GUI雷达定位模拟【Matlab 246期】
【雷达通信】SVM识别雷达数据【Matlab 247期】
【信息处理】GUI数字波束的算法库【Matlab 249期】

标签:OFDM,Idx,GUI,通信,Eb,user,bit,Matlab
来源: https://blog.csdn.net/m0_54742769/article/details/113881110