【CRAHNs】CRAHNs网络中多径环境下大规模MIMO接收信道估计均衡技术

1.软件版本

matlab2017b

2.本算法理论知识

对于大规模MIMO,通常情况下,采用3D-MIMO信道来实现。这是由于3D-MIMO一般采用大规模的二维天线阵列,不仅天线端口数较多,而且可以在水平和垂直维度灵活调整波束方向,形成更窄、更精确的指向性波束,从而极大的提升终端接收信号能量并增强小区覆盖。所以采用3DMIMO信道,可以符合大规模MIMO的信道特点。这里,我们设置为h2.。

然后对于随机阵列,则采用如下的方式:

SCM中,天线之间的位置是固定的,而在随机整列中,我们需要将阵元的位置参数进行随机化分布处理。通过随机化处理之后,那么其对应的位置参数,角度参数等都会随机化。

那么,根据上面的分析,我们对信道模型做如下的改进:

网络发送端

以大规模MIMO系统,天线阵列随机分布的方式产生测试信号。

多用户

信道编码(turbo编码)

调制QPSK+OFDM,

信道

这个就是之前的给你的信道模型;  

网络接收端

解调QPSK+OFDM

信道估计,来估算信道的h。

译码

性能评价指标

计算误码率。

3.部分源码

clc;
clear;
close all;
warning off;
addpath 'func\'

%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%网络半径
Radius             = 100; 
%水平方向天线数
Nh                 = 5;  
%垂直方向天线数
Nv                 = 5;  
%天线间距,随机分布
Scale1             = (rand(Nh,1)/2+0.5); 
Scale2             = (rand(Nv,1)/2+0.5); 
%是否加入多径,多径信道H1
%以下根据实际情况进行设置
%速度
v                  = 200;
%载波频率
fc                 = 128e6;
%光速
c                  = 3e8;
fd                 = v*fc/c;
%采样间隔为1us
timeval            = 1e-5;
%多径时延
delay_multi        = [0,1,3,6]*timeval;
%多径增益
Pow_avg            = [0,-20,-40,-60];
%多径个数
Nmultipath         = length(Pow_avg);
%多径平均延迟
delay_avg          = 100e-6; 
%多普勒频偏
Fre_offset         = 0.0001; 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%用户数量
Nc                 = 8;
%多载波
Sub                = Nc;
Len                = 1024;
%信号带宽
BW                 = 180e3;
T                  = 1/BW;
TG                 = T/4;
%间隔
BWs                = 3.75e3;
%信号采样率
Fd                 = 8;
SNR_dB             = [0:7];
%仿真指标保持变量
Err_Rate           = zeros(1,length(SNR_dB));
%PILOT设置
pilot_type         = 1;
%仿真循环次数,循环次数越大,仿真效果越好
nloop              = [40,40,40,40,40,60,60,300];   
%turbo编码参数
N                  = 512;
M                  = 167;
%FFT
fftlen             = 512;
%每个SNR点上仿真若干次
for i=1:length(SNR_dB) 
    i
    Error   = 0;  
    err_all = 0;
    for iii=1:nloop(i)
        iii
        rng(iii);
       %%
        %以单天线方式产生测试信号
        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);
        %信道估计
        %lmmse
        [Sig_Lrmmse,Hs]  = func_lmmse_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(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

%误码率
figure
semilogy(SNR_dB,Err_Rate,'b-o');
grid on
xlabel('SNR');
ylabel('BER');
axis([-0.0001,8,1e-5,1]);

save R1.mat SNR_dB Err_Rate

4.仿真结论

5.参考文献

[1]江爱珍. CRAHNs网络中基于Massive MIMO的资源分配方案研究[D]. 南京邮电大学, 2016.A01-147

猜你喜欢

转载自blog.csdn.net/ccsss22/article/details/125139821