初识MIMO(三):天线分集技术及其仿真
零 代码地址
https://github.com/liu-zongxi/MIMO_simulation
请大家看完觉得有用别忘了点赞收藏,github项目给star哦
一. 接收分集(MCR)
概念
首先先来看一下分集的概念,我标黄了的话是很有意思的,他会在我们接下来的仿真中看到
代码
%------------------瑞利信道下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)')
一些思考
- 什么是瑞利衰落信道
就是噪声变为了一个乘性的高斯复噪声
- 接收信号为什么是 y = Hiid .* frame_mod + noise;
这就是本身的公式,不过我们一般是归一化噪声,然后信号乘以信噪比
而这里是归一化信号,噪声乘以噪信比
- sigma = sqrt(0.5/SNR); % 噪信比,实数虚数各占一半能量,用于噪声幅度
复信号的实数和虚数各占1/2能量
二.发射分集
概念
首先先来看一下发射分集的目的,希望是把计算量转移到BS而不是MS
然后给出STBC的公式推倒
代码展示
%------------------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方案在瑞利衰落信道下的性能')
一些思考
- power_T是个啥?
思考了一下这里我的程序描述是不太严谨的,这可以从书中的
本来两个天线分别发送SNR的能量,现在用SISO作为对照组,当然应该发送2SNR的能量才公平啊
- 代码中为什么只在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上就是代码中的这个样子啦
- 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}
y10y20y1T∗y2T∗=h11x1+h21x2+z1=h12x1+h22x2+z2=−h11∗x2+h21∗x1+z3∗=−h12∗x2+h22∗x1+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}
⎣⎢⎢⎡y10y20y1T∗y2T∗⎦⎥⎥⎤=⎣⎢⎢⎡h11h12h21∗h22∗h21h22−h11∗−h12∗⎦⎥⎥⎤[x1x2]+⎣⎢⎢⎡z1z2z3∗z4∗⎦⎥⎥⎤
左右分别乘
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}
[h11∗h21∗h12∗h22∗h21−h11h22−h12]⎣⎢⎢⎡y10y20y1T∗y2T∗⎦⎥⎥⎤=[h11∗h21∗h12∗h22∗h21−h11h22−h12]⎣⎢⎢⎡h11h12h21∗h22∗h21h22−h11∗−h12∗⎦⎥⎥⎤+[h11∗h21∗h12∗h22∗h21−h11h22−h12]⎣⎢⎢⎡z1z2z3∗z4∗⎦⎥⎥⎤
由此我们得到
[
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
∗⎦⎥⎥⎤=[∑hij200∑hij2][x1x2]+[h11∗h21∗h12∗h22∗h21−h11h22−h12]⎣⎢⎢⎡z1z2z3∗z4∗⎦⎥⎥⎤
写到这里,应该明白我们代码中2*2Alamouti算法是怎么做的了吧
- Alamouti还可以继续拓展吗
当然!书中详细介绍了多发的Alamouti算法,我就不在这里班门弄斧啦
我们这里在icase尝试了4*1的Alamouti,更多的我们就不尝试啦!
- MCR和Alamouti的性能比较?
先上结果
可以看到MCR结果始终比Alamouti好这是因为
三.其他
STTC编码应该是又难又不好用吧,我暂时不做仿真了,后面能用到在学习,这里挖个坑啦