clc;
clear;
close all;
warning off;
addpath(genpath(pwd));
rng('default')
%fft长度
Len_ifft = 512;
%子载波数
N_subcarrier = 100;
%符号数/载波
sym_carrier = 66;
%循环前缀长度
Len_cp = 10;
Len_all = Len_ifft+Len_cp;
mods = 4;
%位数/符号
bit_sym = log2(mods);
Mod_map = [1 -2 -3;2+j 1+j 0;3+j 0 1+j;0 -3+j 2+j];
Len_map = size(Mod_map,1);
%发射天线数目
N_Tant = size(Mod_map,2);
%接收天线数目
N_Rant = 2;
%发射
X_max = 1;
for ij1=1:Len_map
for ij2=1:N_Tant
X_max = max(X_max,abs(real(Mod_map(ij1,ij2))));
end
end
X0 = zeros(X_max,1);
for ij1=1:Len_map
for ij2=1:N_Tant
if abs(real(Mod_map(ij1,ij2)))~=0
d1(ij1,abs(real(Mod_map(ij1,ij2)))) = sign(real(Mod_map(ij1,ij2)));
d2(ij1,abs(real(Mod_map(ij1,ij2)))) = ij2;
X0(abs(real(Mod_map(ij1,ij2))),1) = X0(abs(real(Mod_map(ij1,ij2))),1)+1;
d3(abs(real(Mod_map(ij1,ij2))),X0(abs(real(Mod_map(ij1,ij2))),1)) = ij1;
d4(ij1,abs(real(Mod_map(ij1,ij2)))) = imag(Mod_map(ij1,ij2));
end
end
end
d3 = d3.';
d3 = sort(d3);
d3 = d3.';
carriers = (1: N_subcarrier) + (floor(Len_ifft/4) - floor(N_subcarrier/2));
Len_conj = Len_ifft-carriers+2;
Pn_symbols = PN_gen(N_Tant,N_subcarrier);
Len_bd = N_subcarrier * sym_carrier;
SNRs = [0:1:20];
ybits=zeros(length(SNRs),2,N_Rant);
ysymb=zeros(length(SNRs),2,N_Rant);
for ij=1:length(SNRs)
ij
Err_sym = zeros(1,N_Rant);
Err_bit = zeros(1,N_Rant);
Perr_sym = zeros(1,N_Rant);
Perr_bit = zeros(1,N_Rant);
tmps_sym = zeros(N_subcarrier,sym_carrier,N_Rant);
tmps_bit = zeros(Len_bd,bit_sym,N_Rant);
%生成随机数用于仿真
msg = round(rand(Len_bd,bit_sym));
%二进制向十进制转换
msg_bit = bi2de(msg);
%QPSK
msg_qpsk = pskmod(msg_bit,mods,0);
msg_matrix = reshape(msg_qpsk,N_subcarrier,sym_carrier);
%STBC
for ijt=1:N_Tant:sym_carrier
data=[];
for ijt4=1:N_Tant
tx_tmps = msg_matrix(:,ijt+ijt4-1);
data = [data;tx_tmps];
end
X1 = zeros(Len_map*N_subcarrier,N_Tant);
%STBC
for ijt1=1:Len_map
for ijt2=1:N_Tant
if abs(real(Mod_map(ijt1,ijt2)))~=0
if imag(Mod_map(ijt1,ijt2))==0
X1((ijt1-1)*N_subcarrier+1:ijt1*N_subcarrier,ijt2)=data((abs(real(Mod_map(ijt1,ijt2)))-1)*N_subcarrier+1:abs(real(Mod_map(ijt1,ijt2)))*N_subcarrier,1)*sign(real(Mod_map(ijt1,ijt2)));
else
X1((ijt1-1)*N_subcarrier+1:ijt1*N_subcarrier,ijt2)=conj(data((abs(real(Mod_map(ijt1,ijt2)))-1)*N_subcarrier+1:abs(real(Mod_map(ijt1,ijt2)))*N_subcarrier,1))*sign(real(Mod_map(ijt1,ijt2)));
end
end
end
end
%加PN
X1 = [Pn_symbols;X1];
Rx_tmps = zeros(1,Len_all*(Len_map+1),N_Rant);
for ijt3=1:N_Rant
for ijt4=1:N_Tant
data_tx = reshape(X1(:,ijt4),N_subcarrier,Len_map+1);
data_ifft = zeros(Len_ifft,Len_map+1);
data_ifft(carriers,:) = data_tx(1:N_subcarrier,:);
data_ifft(Len_conj,:) = conj(data_tx(1:N_subcarrier,:));
data_time = ifft(data_ifft);
data_time = [data_time((Len_ifft-Len_cp+1):Len_ifft,:);data_time];
tx = data_time(:)';
%信道模拟
txch = awgn(tx,SNRs(ij),'measured');
Rx_tmps(1,:,ijt3) = Rx_tmps(1,:,ijt3)+txch;
end
%接收机
Rx_matrix = reshape(Rx_tmps(1,:,ijt3),Len_all,Len_map+1);
Rx_matrix = Rx_matrix(Len_cp+1:Len_all,:);
data_fft = zeros(Len_ifft,Len_map+1);
data_fft = fft(Rx_matrix);
data_fft2 = data_fft(carriers,:);
data_fft2_tmps = (data_fft2(:,2:Len_map+1));
data_fft2_tmps = conj(data_fft2_tmps');
data_fft2_tmps2= data_fft2(:,1);
Wk = exp((-2*pi/N_subcarrier)*sqrt(-1));
L = 10;
p = zeros(L*N_Tant,1);
for ijt6=1:N_Tant
for ijt7=0:L-1
for ijt8=0:N_subcarrier-1
p(ijt7+(ijt6-1)*L+1,1)=p(ijt7+(ijt6-1)*L+1,1)+data_fft2_tmps2(ijt8+1,1)*conj(Pn_symbols(ijt8+1,ijt6))*Wk^(-(ijt8*ijt7));
end
end
end
h=p/N_subcarrier;
H_buf=zeros(N_subcarrier,N_Tant);
for ijt4=1:N_Tant
for ijt8=0:N_subcarrier-1
for ijt7=0:L-1
H_buf(ijt8+1,ijt4)=H_buf(ijt8+1,ijt4)+h(ijt7+(ijt4-1)*L+1,1)*Wk^(ijt8*ijt7);
end
end
end
H_buf = conj(H_buf');
RRR=[];
for ijt8=1:N_subcarrier
Y=data_fft2_tmps(:,ijt8);
H=H_buf(:,ijt8);
for ijt9=1:X_max
for ijt10=1:size(d3,2)
if d3(ijt9,ijt10)~=0
if d4(d3(ijt9,ijt10),ijt9)==0
r_til(d3(ijt9,ijt10),:,ijt9)=Y(d3(ijt9,ijt10),:);
a_til(d3(ijt9,ijt10),:,ijt9)=conj(H(d2(d3(ijt9,ijt10),ijt9),:));
else
r_til(d3(ijt9,ijt10),:,ijt9)=conj(Y(d3(ijt9,ijt10),:));
a_til(d3(ijt9,ijt10),:,ijt9)=H(d2(d3(ijt9,ijt10),ijt9),:);
end
end
end
end
RR=zeros(X_max,1);
%接收数据的判决统计
for iii=1:X_max
for ttt=1:size(d3,2)
if d3(iii,ttt)~=0
RR(iii,1)=RR(iii,1)+r_til(d3(iii,ttt),1,iii)*a_til(d3(iii,ttt),1,iii)*d1(d3(iii,ttt),iii);
end
end
end
RRR=[RRR;conj(RR')];
end
r_sym = pskdemod(RRR,mods,0);
tmps_sym(:,ijt:ijt+N_Tant-1,ijt3)= r_sym;
end
end
re_met_sym=zeros(Len_bd,1,N_Rant);
for ijt3=1:N_Rant
re_met_sym_buf_buf=tmps_sym(:,:,ijt3);
re_met_sym(:,1,ijt3)= re_met_sym_buf_buf(:);
tmps_bit(:,:,ijt3)=de2bi(re_met_sym(:,1,ijt3));
for con_dec_ro=1:Len_bd
if re_met_sym(con_dec_ro,1,ijt3)~=msg_bit(con_dec_ro,1)
Err_sym(1,ijt3)=Err_sym(1,ijt3)+1;
for con_dec_co=1:bit_sym
if tmps_bit(con_dec_ro,con_dec_co,ijt3)~=msg(con_dec_ro,con_dec_co)
Err_bit(1,ijt3)=Err_bit(1,ijt3)+1;
end
end
end
end
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%++++++++++++++++++++++++++误码率计算+++++++++++++++++++++++++++++
Perr_sym(1,ijt3)=Err_sym(1,ijt3)/(Len_bd);
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
1.版本:matlab2022A,包含仿真操作录像和代码中文注释,操作录像使用windows media player播放。 2.领域:MIMO-OFDM-QPSK 3.内容: 基于STBC空时分组码的MIMO-OFDM-QPSK通信链路误码率matlab仿真.STBC是一种多天线通信编码技术,通过在多个发射天线上对数据进行编码,以实现天线分集和空分复用。在STBC中,每个符号会在多个发射天线上发送,以增加信号的可靠性。STBC的一个常见示例是Alamouti编码,其中两个发射天线的数据在不同时间步中交错发送,以在接收端实现分集。 4.注意事项:注意MATLAB左侧当前文件夹路径,必须是程序所在文件夹位置,具体可以参考视频录。
资源推荐
资源详情
资源评论
收起资源包目录
基于STBC空时分组码的MIMO-OFDM-QPSK通信链路误码率matlab仿真.rar (4个子文件)
仿真操作录像0015.avi 30.01MB
untitled.jpg 62KB
code
PN_gen.m 744B
Runme.m 8KB
共 4 条
- 1
资源评论
- Sunny_mandi2024-03-04资源很赞,希望多一些这类资源。
- LIJIAN12392024-04-15支持这个资源,内容详细,主要是能解决当下的问题,感谢大佬分享~
fpga和matlab
- 粉丝: 15w+
- 资源: 2548
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功