初识MIMO(三):天线分集技术及其仿真

初识MIMO(三):天线分集技术及其仿真

零 代码地址

https://github.com/liu-zongxi/MIMO_simulation

请大家看完觉得有用别忘了点赞收藏,github项目给star哦

一. 接收分集(MCR)

概念

首先先来看一下分集的概念,我标黄了的话是很有意思的,他会在我们接下来的仿真中看到

image-20220424102838215

image-20220424103149950

image-20220424103230352

image-20220424103249129

代码

%------------------瑞利信道下MRC分集的性能----------------%
%-----------------------author:lzx-------------------------%
%-----------------------date:22点25分-----------------%
%% 参数设置
clear;clf;
L_frame= 130;   % 帧长度
N_packet = 4000;% 包个数
Nmod = 2;       % 调制阶数
M = 2^Nmod;     % 
SNRs_dB = [0:2:20]; % 信噪比
SNRs = 10.^(SNRs_dB/10);
N_SNR = length(SNRs);
NTRs = [1 1; 1 2; 1 4];   % 天线个数,每一行是一种情况
N_case = size(NTRs, 1);              % 测试不同情况的个数
BERs = zeros(N_case, N_SNR);
BERs_y = zeros(N_case, N_SNR);
gss = ["-kx" "-^" "-ro"];   % 画图图像,注意使用双引号
%% 主函数
for icase = 1:N_case
    NT = NTRs(icase, 1);
    NR = NTRs(icase, 2);
    gs = gss(icase);
    for isnr = 1:N_SNR
        n_biterror = 0;
        SNR = SNRs(isnr);
        sigma = sqrt(0.5/SNR);  % 噪信比,实数虚数各占一半能量,用于噪声幅度
        for ipacket = 1:N_packet
            % 生成数据
            frame_origin = randi([0,1],L_frame,NT*Nmod);
            % QPSK调制
            frame_mod=QPSKMod(frame_origin,L_frame, NT);
            % 生成信道,SIMO有NR个信道
            % 何为瑞利信道?就是乘性的一个瑞利衰落信道
            Hiid = (randn(L_frame,NR)+1j*randn(L_frame,NR))/sqrt(2);
            noise = sigma*(randn(L_frame,NR) +1j * randn(L_frame,NR));
            % 接收信号
            y = Hiid .* frame_mod + noise;  % 这就是公式y=SNR*x+z,但归一化为系数在z之前
            % 进行MRC
            W_mrc = conj(Hiid);
            y_mrc = sum(W_mrc.*y,2);
            % 解调
            frame_demod = QPSKDemod(y_mrc,L_frame,NT);
            % 计算误码率
            n_biterror_tmp = sum(sum(abs(frame_demod - frame_origin)));
            n_biterror = n_biterror + n_biterror_tmp;
        end
        BERs(icase, isnr) = n_biterror/(N_packet*L_frame*Nmod);
        semilogy(SNRs_dB,BERs(icase,:),gs);
        hold on;
        axis([SNRs_dB([1 end]) 1e-6 1e0])
    end
end
title('BER perfoemancde of MRC Scheme');
xlabel('SNR[dB]');
ylabel('BER') 
grid on;
set(gca,'fontsize',9)
legend('SISO','MRC (Tx:1,Rx:2)','MRC (Tx:1,Rx:4)')

一些思考

  1. 什么是瑞利衰落信道

就是噪声变为了一个乘性的高斯复噪声

  1. 接收信号为什么是 y = Hiid .* frame_mod + noise;

这就是本身的公式,不过我们一般是归一化噪声,然后信号乘以信噪比

而这里是归一化信号,噪声乘以噪信比

  1. sigma = sqrt(0.5/SNR); % 噪信比,实数虚数各占一半能量,用于噪声幅度

复信号的实数和虚数各占1/2能量

二.发射分集

概念

首先先来看一下发射分集的目的,希望是把计算量转移到BS而不是MS

image-20220426104020124

然后给出STBC的公式推倒image-20220426104644277

image-20220426104830517

image-20220426104848771

image-20220426104900412

代码展示

%------------------Alamouti分集编码的BER性能----------------%
%-----------------------author:lzx-------------------------%
%-----------------------date:22点28分-----------------%
%% 设置参数
clear;clf;
SNRs_dB = 0:2:20;   % 信噪比
SNRs = 10.^(SNRs_dB./10);
N_SNR = length(SNRs_dB);    % 信噪比个数
N_iter = 1000;      % 迭代次数
Nmod = 2;           % 调制阶数
L_frame = 100;      % 帧长度
Niter = 1000;       % 迭代次数
N_case = 6;          % 不同类型
BERs = zeros(N_case, N_SNR);
gss = ["-kx" "-^" "-ro" "-b>" "-g<" "-m+"];   % 画图图像,注意使用双引号
%% 主函数
for icase = 1:N_case
    if icase == 1   % AWGN 信道
        NR = 1;
        NT = 1;
        power_T = 2;
        y_formula = @(Hiid, frame, noise) frame + noise;
    elseif icase == 2   % SISO瑞利衰落信道,可以用MRC代替
        NR = 1;
        NT = 1;
        power_T = 2;
        % y_formula = @(Hiid, frame, noise) frame + noise./Hiid;
        y_formula = @(Hiid, frame, noise) sum(conj(Hiid).*(Hiid.*frame + noise),2);
    elseif icase == 3   % 1*2 MRC瑞利衰落信道
        NR = 2;
        NT = 1;
        power_T = 2;
        % y_formula = @(Hiid, frame, noise) frame + noise./Hiid;
        y_formula = @(Hiid, frame, noise) sum(conj(Hiid).*(Hiid.*frame + noise), 2);
    elseif icase == 4   % 2*1 Alamouti编码
        NR = 1;
        NT = 2;
        power_T = 1;
        y_formula = @(Hiid, frame, noise) frame + [conj(Hiid(:,1)).* noise(:,1)+Hiid(:,2).*conj(noise(:,2)) conj(Hiid(:,2)).*noise(:,2)-Hiid(:, 1).*conj(noise(:,2))]./(sum(abs(Hiid.^2), 2));
    elseif icase == 5
        NR = 2;
        NT = 2;
        power_T = 1;
        y_formula = @(Hiid, frame, noise) frame + [conj(Hiid(:,1)).* noise(:,1)+conj(Hiid(:,2)).*noise(:,2)+Hiid(:,3).*conj(noise(:,3))+Hiid(:, 4).*conj(noise(:,4)) conj(Hiid(:,3)).*noise(:, 1)+conj(Hiid(:,4)).*noise(:, 2)-Hiid(:,1).*conj(noise(:,3))-Hiid(:,2).*conj(noise(:,4))]./(sum(abs(Hiid.^2), 2));
    elseif icase == 6
        NR = 1;
        NT = 4;
        power_T = 1;
        y_formula = @(Hiid, frame, noise) frame + [conj(Hiid(:,1)).* noise(:,1)+conj(Hiid(:,2)).*noise(:,2)+conj(Hiid(:,3)).*noise(:,3)+conj(Hiid(:,4)).*noise(:,4) conj(Hiid(:,2)).*noise(:,1)-conj(Hiid(:, 1)).*noise(:,2)-conj(Hiid(:, 4)).*noise(:,3)+conj(Hiid(:, 3)).*noise(:,4) conj(Hiid(:,3)).*noise(:,1)+conj(Hiid(:, 4)).*noise(:,2)-conj(Hiid(:, 1)).*noise(:,3)-conj(Hiid(:, 2)).*noise(:,4) conj(Hiid(:,4)).*noise(:,1)-conj(Hiid(:, 3)).*noise(:,2)+conj(Hiid(:, 2)).*noise(:,3)-conj(Hiid(:, 1)).*noise(:,4)]./(sum(abs(Hiid.^2), 2));
    end
    gs = gss(icase);
    for isnr = 1:N_SNR
        SNR = SNRs(isnr);
        n_biterror = 0;
        for iiter = 1:N_iter
            % 生成数据,不管几根天线,都发一组数据,因为这是分集而不是MIMO
            frame_origin = randi([0,1],L_frame,Nmod*NT);
            % QPSK调制
            frame_mod=QPSKMod(frame_origin,L_frame, NT);
            % 生成信道,SIMO有NR个信道
            Hiid = (randn(L_frame,NR*NT)+1j*randn(L_frame,NR*NT))/sqrt(2);
            %  AWGN噪声
            sigma = sqrt(1/(2*power_T*SNR));
            noise = sigma*(randn(L_frame, NR*NT) + 1j*randn(L_frame, NR*NT));
            y = y_formula(Hiid, frame_mod, noise);
            % 解调
            frame_demod = QPSKDemod(y,L_frame,NT);
            % 计算误码率
            n_biterror_tmp = sum(sum(abs(frame_demod - frame_origin)))
            n_biterror = n_biterror + n_biterror_tmp;
        end
        BERs(icase, isnr) = n_biterror/(N_iter*L_frame*Nmod*2);
        semilogy(SNRs_dB,BERs(icase,:),gs);
        hold on;
        axis([SNRs_dB([1 end]) 1e-6 1e0])
    end
end
legend('AWGN信道','SISO瑞利衰落信道', '1发2收MCR方案', '2发1收Alamouti方案', '2发2收Alamouti方案')
xlabel('信噪比Eb/N0')
ylabel('误比特率(BER)')
title('2发2收Alamouti方案在瑞利衰落信道下的性能')

一些思考

  1. power_T是个啥?

思考了一下这里我的程序描述是不太严谨的,这可以从书中的

image-20220426144427791

本来两个天线分别发送SNR的能量,现在用SISO作为对照组,当然应该发送2SNR的能量才公平啊

  1. 代码中为什么只在noise上做文章?这样的写法合理吗

在我看来,这样仅仅是一个巧合

  • 先来看AWGN信道, y = x + n y=x+n y=x+n这没有什么好说的
  • 再来看SISO的瑞利衰落信道原本是 y = H i i d . ∗ x + n y=Hiid.*x+n y=Hiid.x+n,对他解调,得到的就是 y = x + n . / H i i d y=x+n./Hiid y=x+n./Hiid
  • 当使用MCR时,这就不是简单的可以只对noise做文章就可以的了,因此可以看到MCR在代码中也没有使用这样的表示方法
  • 当时用Alamouti的时候,根据上文中的推倒,x前面的系数又是很容易化简的,而对应到noise上就是代码中的这个样子啦
  1. 2*2的Alamouti是如何做到的?

这个问题也是听困扰我的,手中并没有给出明确的推导过程,我这里自己推导了一下,如有错误还希望指出

首先假设 h i j hij hij表示发射天线i到接受天线j的信道, y i 0 , y i T yi0,yiT yi0,yiT分别表示当前时间和T时刻后收到的信号那么
y 10 = h 11 x 1 + h 21 x 2 + z 1 y 20 = h 12 x 1 + h 22 x 2 + z 2 y 1 T ∗ = − h 11 ∗ x 2 + h 21 ∗ x 1 + z 3 ∗ y 2 T ∗ = − h 12 ∗ x 2 + h 22 ∗ x 1 + z 4 ∗ \begin{aligned} y_{10} &= h_{11}x_1+h_{21}x_2+z_1\\ y_{20} & =h_{12}x_1+h_{22}x_2+z_2\\ y_{1T}^*&=-h_{11}^*x_2+h_{21}^*x_1+z_3^*\\ y_{2T}^*&=-h_{12}^*x_2+h_{22}^*x_1+z_4^* \end{aligned} y10y20y1Ty2T=h11x1+h21x2+z1=h12x1+h22x2+z2=h11x2+h21x1+z3=h12x2+h22x1+z4

写成矩阵形式
[ y 10 y 20 y 1 T ∗ y 2 T ∗ ] = [ h 11 h 21 h 12 h 22 h 21 ∗ − h 11 ∗ h 22 ∗ − h 12 ∗ ] [ x 1 x 2 ] + [ z 1 z 2 z 3 ∗ z 4 ∗ ] \begin{bmatrix} y_{10}\\ y_{20}\\ y_{1T}^*\\ y_{2T}^* \end{bmatrix}=\begin{bmatrix} h_{11}& h_{21}\\ h_{12}& h_{22}\\ h_{21}^*&-h_{11}^* \\ h_{22}^*&-h_{12}^* \end{bmatrix} \begin{bmatrix} x_1&x_2 \end{bmatrix}+\begin{bmatrix} z_{1}\\ z_{2}\\ z_{3}^*\\ z_{4}^* \end{bmatrix} y10y20y1Ty2T=h11h12h21h22h21h22h11h12[x1x2]+z1z2z3z4
左右分别乘 H H H^H HH
[ h 11 ∗ h 12 ∗ h 21 h 22 h 21 ∗ h 22 ∗ − h 11 − h 12 ] [ y 10 y 20 y 1 T ∗ y 2 T ∗ ] = [ h 11 ∗ h 12 ∗ h 21 h 22 h 21 ∗ h 22 ∗ − h 11 − h 12 ] [ h 11 h 21 h 12 h 22 h 21 ∗ − h 11 ∗ h 22 ∗ − h 12 ∗ ] + [ h 11 ∗ h 12 ∗ h 21 h 22 h 21 ∗ h 22 ∗ − h 11 − h 12 ] [ z 1 z 2 z 3 ∗ z 4 ∗ ] \begin{aligned}\begin{bmatrix} h_{11}^*&h_{12}^* &h_{21} &h_{22} \\ h_{21}^*&h_{22}^* &-h_{11} &-h_{12} \end{bmatrix}\begin{bmatrix} y_{10}\\ y_{20}\\ y_{1T}^*\\ y_{2T}^* \end{bmatrix}=\begin{bmatrix} h_{11}^*&h_{12}^* &h_{21} &h_{22} \\ h_{21}^*&h_{22}^* &-h_{11} &-h_{12} \end{bmatrix}\begin{bmatrix} h_{11}& h_{21}\\ h_{12}& h_{22}\\ h_{21}^*&-h_{11}^* \\ h_{22}^*&-h_{12}^* \end{bmatrix}+\\ \begin{bmatrix} h_{11}^*&h_{12}^* &h_{21} &h_{22} \\ h_{21}^*&h_{22}^* &-h_{11} &-h_{12} \end{bmatrix}\begin{bmatrix} z_{1}\\ z_{2}\\ z_{3}^*\\ z_{4}^* \end{bmatrix} \end{aligned} [h11h21h12h22h21h11h22h12]y10y20y1Ty2T=[h11h21h12h22h21h11h22h12]h11h12h21h22h21h22h11h12+[h11h21h12h22h21h11h22h12]z1z2z3z4
由此我们得到
[ y 10 ~ y 20 ~ y 1 T ~ ∗ y 2 T ~ ∗ ] = [ ∑ h i j 2 0 0 ∑ h i j 2 ] [ x 1 x 2 ] + [ h 11 ∗ h 12 ∗ h 21 h 22 h 21 ∗ h 22 ∗ − h 11 − h 12 ] [ z 1 z 2 z 3 ∗ z 4 ∗ ] \begin{bmatrix} \widetilde{y_{10}}\\ \widetilde{y_{20}}\\ \widetilde{y_{1T}}^*\\ \widetilde{y_{2T}}^* \end{bmatrix}=\begin{bmatrix} \sum h_{ij}^2& 0\\ 0&\sum h_{ij}^2 \end{bmatrix} \begin{bmatrix} x_1&x_2 \end{bmatrix}+\begin{bmatrix} h_{11}^*&h_{12}^* &h_{21} &h_{22} \\ h_{21}^*&h_{22}^* &-h_{11} &-h_{12} \end{bmatrix}\begin{bmatrix} z_{1}\\ z_{2}\\ z_{3}^*\\ z_{4}^* \end{bmatrix} y10 y20 y1T y2T =[hij200hij2][x1x2]+[h11h21h12h22h21h11h22h12]z1z2z3z4
写到这里,应该明白我们代码中2*2Alamouti算法是怎么做的了吧

  1. Alamouti还可以继续拓展吗

当然!书中详细介绍了多发的Alamouti算法,我就不在这里班门弄斧啦

我们这里在icase尝试了4*1的Alamouti,更多的我们就不尝试啦!

image-20220426201904692

  1. MCR和Alamouti的性能比较?

先上结果

image-20220426204236889

可以看到MCR结果始终比Alamouti好这是因为

image-20220426204327598

三.其他

STTC编码应该是又难又不好用吧,我暂时不做仿真了,后面能用到在学习,这里挖个坑啦

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值