%该程序使用的是Alamouti Scheme: [x1 x2;-x2* x1*] R = 3/4
 
%NOTES:
%About entering matrix O:
%-- O is Tp*Nt matrix,as default 4*3 complex orthogonal is defined (rate 3/4).
%for [x1 -x2 -x3;x2* x1* 0;x3* 0 x1*;0 -x3* x2*] -----enter------> O=[1 -2 -3;2+j 1+j 0;3+j 0 1+j;0 -3+j 2+j];
%-- Alamouti Scheme: [x1 x2;-x2* x1*] -----enter------> O=[1 2;-2+j 1+j];
%-- A real orthogonal: [x1 x2;-x2 x1] -----enter------> O=[1 2;-2 1];
%-- For real orthogonal matrices define M_psk=2; as real signal constellation.
%-- O=[1]; is uncoded (no diversity).
%-- In this program entries of O cannot be like "a1*x1[*]+a2*x2[*]+...+an*xn[*]" only they can be like "x1 or -x1 or x1* or -x1*".
%------------------------------------------------------------------------
clear all
O=[1 -2 -3;2+j 1+j 0;3+j 0 1+j;0 -3+j 2+j];                          %Complex or Real Orthogonal Matrix **define this**  
Nt=size(O,2);                                                        %Number of Transmit antennas
co_time=size(O,1);                                                   %Block time length
Nr=1;                                                                %Number of Receive antennas        **define this**
Nit=100000;                                                          %Number of repeates for each snr   **define this**
M_psk=4;                                                             %M-PSK  constellation,M_psk=2^k    **define this**
snr_min=3;                                                           %Min snr range for simulation      **define this**
snr_max=15;                                                          %Max snr rande for simulation      **define this**
graph_inf_bit=zeros(snr_max-snr_min+1,2);                            %Plot information
graph_inf_sym=zeros(snr_max-snr_min+1,2);                            %Plot information
num_X=1;
num_bit_per_sym=log2(M_psk);
for cc_ro=1:co_time
    for cc_co=1:Nt
        num_X=max(num_X,abs(real(O(cc_ro,cc_co))));
    end
end
co_x=zeros(num_X,1);
for con_ro=1:co_time                                                 %Compute delta,epsilon,eta and conj matrices
    for con_co=1:Nt
        if abs(real(O(con_ro,con_co)))~=0
            delta(con_ro,abs(real(O(con_ro,con_co))))=sign(real(O(con_ro,con_co)));
            epsilon(con_ro,abs(real(O(con_ro,con_co))))=con_co;
            co_x(abs(real(O(con_ro,con_co))),1)=co_x(abs(real(O(con_ro,con_co))),1)+1;
            eta(abs(real(O(con_ro,con_co))),co_x(abs(real(O(con_ro,con_co))),1))=con_ro;
            coj_mt(con_ro,abs(real(O(con_ro,con_co))))=imag(O(con_ro,con_co));
        end
    end
end
eta=eta.';                                                           %Sort is not necessary
eta=sort(eta);
eta=eta.';
for SNR=snr_min:snr_max                                              %Start simulation
    clc
    disp('Wait until SNR=');disp(snr_max);
    SNR
    n_err_sym=0;
    n_err_bit=0;
    graph_inf_sym(SNR-snr_min+1,1)=SNR;
    graph_inf_bit(SNR-snr_min+1,1)=SNR;
    for con_sym=1:Nit
        bi_data=round(rand(num_X,num_bit_per_sym)>=0.5);                      %Random binary data
        de_data=bi2de(bi_data);                                      %Convert binary data to decimal for use in M-PSK mod.
        data=pskmod(de_data,M_psk,0,'gray');
        H=randn(Nt,Nr)+j*randn(Nt,Nr);                               %Path gains matrix 
        XX=zeros(co_time,Nt);
        for con_r=1:co_time                                          %Start space time coding
            for con_c=1:Nt
                if abs(real(O(con_r,con_c)))~=0
                    if imag(O(con_r,con_c))==0
                        XX(con_r,con_c)=data(abs(real(O(con_r,con_c))),1)*sign(real(O(con_r,con_c)));
                    else
                        XX(con_r,con_c)=conj(data(abs(real(O(con_r,con_c))),1))*sign(real(O(con_r,con_c)));
                    end
                end
            end
        end                                                          %End space time coding
        H=H.';
        XX=XX.';
        snr=10^(SNR/10);
        Noise=(randn(Nr,co_time)+j*randn(Nr,co_time));               %Generate Noise
        Y=(sqrt(snr/Nt)*H*XX+Noise).';                               %Received signal
        H=H.';                                                       %Start decoding with perfect channel estimation
        for co_ii=1:num_X
            for co_tt=1:size(eta,2)
                if eta(co_ii,co_tt)~=0
                    if coj_mt(eta(co_ii,co_tt),co_ii)==0
                        r_til(eta(co_ii,co_tt),:,co_ii)=Y(eta(co_ii,co_tt),:);
                        a_til(eta(co_ii,co_tt),:,co_ii)=conj(H(epsilon(eta(co_ii,co_tt),co_ii),:));
                    else
                        r_til(eta(co_ii,co_tt),:,co_ii)=conj(Y(eta(co_ii,co_tt),:));
                        a_til(eta(co_ii,co_tt),:,co_ii)=H(epsilon(eta(co_ii,co_tt),co_ii),:);
                    end
                end
            end
        end
        RR=zeros(num_X,1);
        for ii=1:num_X                                               %Generate decision statistics for the transmitted signal "xi"
            for tt=1:size(eta,2)
                for jj=1:Nr
                    if eta(ii,tt)~=0
                        RR(ii,1)=RR(ii,1)+r_til(eta(ii,tt),jj,ii)*a_til(eta(ii,tt),jj,ii)*delta(eta(ii,tt),ii);
                    end
                end
            end
        end
        re_met_sym=pskdemod(RR,M_psk,0,'gray');                      % = ML decision for M-PSK
        re_met_bit=de2bi(re_met_sym);
        re_met_bit(1,num_bit_per_sym+1)=0;                           %For correct demension of "re_met_bit"
        for con_dec_ro=1:num_X                                             
            if re_met_sym(con_dec_ro,1)~=de_data(con_dec_ro,1)
                n_err_sym=n_err_sym+1;
                for con_dec_co=1:num_bit_per_sym
                    if re_met_bit(con_dec_ro,con_dec_co)~=bi_data(con_dec_ro,con_dec_co)
                        n_err_bit=n_err_bit+1;
                    end
                end
            end
        end
    end
    Perr_sym=n_err_sym/(num_X*Nit);                                  %Count number of error bits and symbols 
    graph_inf_sym(SNR-snr_min+1,2)=Perr_sym;
    Perr_bit=n_err_bit/(num_X*Nit*num_bit_per_sym);
    graph_inf_bit(SNR-snr_min+1,2)=Perr_bit;
end
x_sym=graph_inf_sym(:,1);                                            %Generate plot
y_sym=graph_inf_sym(:,2);
subplot(2,1,1);
semilogy(x_sym,y_sym,'k-v');
xlabel('SNR, [dB]');
ylabel('Symbol Error Probability');
grid on
x_bit=graph_inf_bit(:,1);
y_bit=graph_inf_bit(:,2);
subplot(2,1,2);
semilogy(x_bit,y_bit,'k-v');
xlabel('SNR, [dB]');
ylabel('Bit Error Probability');
grid on

【STBC】Alamouti,STBC误码率仿真相关推荐

  1. 2ASK和2FSK相干解调误码率仿真matlab

    本文结构 2ASK误码率仿真 2FSK误码率仿真 2ASK误码率仿真 2ASK相干解调法: 图片来源:郭心悦 发送端发送信号经过信道:经过信道后的波形通过带通滤波器,带通滤波器会有输出波形y(t)y( ...

  2. 分别对比SVD和GMD非码本的预编码以及DFT和TxAA码本预编码的MIMO系统matlab误码率仿真

    up目录 一.理论基础 二.核心程序 三.测试结果 一.理论基础 对比SVD和GMD非码本的预编码以及DFT和TxAA码本预编码的MIMO系统matlab误码率仿真 二.核心程序 function V ...

  3. 4PAM的误码率仿真

    1.问题描述: 4PAM的误码率仿真 2.部分程序: %BER of 4PAM clear all;clc; Nb=10000; %the number of data bits EbN0dB=1:3 ...

  4. 初识OFDM(六):从零开始的OFDM误码率仿真

    文章目录 初识OFDM(六):从零开始的OFDM误码率仿真 零.代码地址 一. 加性高斯白噪声对OFDM误码率的影响 1. 代码展示 2. 代码分析 fftshift和ifftshift 能量和信噪比 ...

  5. msk 频偏_msk 误码率仿真

    QAM误码率仿真_信息与通信_工程科技_专业资料.%M元QAM调制误码率计算及仿... BPSK误码率仿真_基础医学_医药卫生_专业资料.精品文档 实验报告 实验目的 ... 基于Ds-FH/MSK信 ...

  6. 码长6075的qc-ldpc编译码的MATLAB误码率仿真

    1.算法简介 为满足高的数据需求,提出一种新的QC-LDPC码.该校验矩阵的校验部分为近似下三角结构,上对角线下面的非零元素可以任意放置,因此是一种半确定的结构.这种结构的码设计灵活,性能也极高.通过 ...

  7. ofdm误码率仿真代码_共享源代码之MSK仿真(1)

    直接来干货!同学们一看就知道这个代码的分量了!!! %%%%%%%%%%%%%%%         MSK相干解调符号同步仿真程序             %%%%%%%%%%%%% %%%%%%%% ...

  8. m基于matlab的polar码误码率仿真,译码算法采用SC算法

    目录 1.算法仿真效果 2.MATLAB核心程序 3.算法涉及理论知识概要 4.完整MATLAB 1.算法仿真效果 matlab2022a仿真结果如下: 2.MATLAB核心程序 .......... ...

  9. 基于matlab的MRC最大合并比误码率仿真,包括维特比译码,MRC,中继

    目录 1.算法概述 2.仿真效果预览 3.核心MATLAB代码预览 4.完整MATLAB程序 1.算法概述 最大比合并(Maximal Ratio Combining,MRC)是分集合并技术中的最优选 ...

最新文章

  1. Horticulture Research 模式图的手稿
  2. Java程序员面试如何超常发挥?
  3. Spark读取Parquet格式的数据为Dataframe
  4. POI的入门:单元格样式处理
  5. IOS UISwitch 组件的使用
  6. 功率曲线k值_特性曲线在参数计算中的应用
  7. snprintf()返回值的陷阱
  8. 谷歌浏览器不兼容小于12px的字体,在做网页的时候怎么解决
  9. oracle plsql 命令,Oracle PlSQL常用命令
  10. Mybatis学习教程②
  11. 有没有不用加班的程序员?如何衡量程序员的工作量?
  12. bluetooth 驱动 Makefile
  13. Win11系统桌面状态栏电池图标不显示怎么办?
  14. Python基础之面向对象知识创建一个游戏角色
  15. 【公告】博客专家4月发布原创/翻译奖励发放
  16. C#-获取当前程序集Assembly的文件名
  17. php操作主从mysql_PHP 操作MySQL数据库
  18. 学不下去时坚持的方法
  19. 自定义边框的制作与换色(canvas与css3)
  20. Pygame合集】回忆杀-“童年游戏”,看看你中几枪?(附五款源码自取)

热门文章

  1. web.py 0.3 新手指南 - 安装
  2. 在Linux下使用screen使用退出远程终端后程序依然自动进行
  3. C# switch嵌套语法
  4. C# 9.0中的新增功能 - 译
  5. Windows驱动开发 - 内核模式下的字符串操作
  6. 补课系列:最小生成树
  7. 《区块链100问》笔记整理——23~41问
  8. js中bind、call、apply函数的用法
  9. java 12-3 StringBuffer的添加和删除功能
  10. QT中个数据类型的转换