SVD预编码

1️⃣ 介绍

SVD预编码是一种在MIMO系统中广泛应用的信号处理技术。通过奇异值分解(SVD) 将信号分解成多个独立的信号流,从而减少信号间的干扰,优化信号的传输过程


2️⃣ 原理介绍

奇异值分解

在MIMO系统中,信道矩阵通常是一个矩阵 H ∈ C N R x × N T x \mathbf{H} \in \mathbb{C}^{N_{\mathrm{Rx}} \times N_{\mathrm{Tx}} } H∈CNRx×NTx的数量, N R x N_{\mathrm{Rx}} NRx和 N T x N_{\mathrm{Tx}} NTx分别是接收和发射天线的数量。

SVD预编码的基本思想是利用奇异值分解对信道矩阵 H 进行分解,将信号空间转化为多个独立的信号流,并且对每个信号流进行优化处理,从而减少不同发射天线之间的干扰。

SVD将信道矩阵 H 分解为三个矩阵的乘积:
H = U Σ V H \mathbf{H}=\mathbf{U} \Sigma \mathbf{V}^H H=UΣVH

其中:

  • U ∈ C N R x × N R x \mathrm{U} \in \mathbb{C}^{N_{\mathrm{Rx}} \times N_{\mathrm{Rx}}} U∈CNRx×NRx 是左奇异矩阵,包含信道矩阵的左奇异向量。
  • Σ ∈ C N R x × N T x \Sigma \in \mathbb{C}^{N_{\mathrm{Rx}} \times N_{\mathrm{Tx}}} Σ∈CNRx×NTx 是一个对角矩阵,其对角线上的元素是信道的奇异值,这些奇异值是信道的增益。
  • V ∈ C N T x × N T x \mathbf{V} \in \mathbb{C}^{N_{T x} \times N_{\mathrm{Tx}}} V∈CNTx×NTx 是右奇异矩阵,包含信道矩阵的右奇异向量。

信号预编码

在SVD预编码中,发送信号x通过右奇异矩阵V进行预编码:
x p r e = V x \mathbf{x}_{\mathrm{pre}}=\mathbf{V} \mathbf{x} xpre=Vx使得发射信号被映射到一个新的空间,在接收端,这些信号将不再互相干扰。

信号传输

信号通过 MIMO信道 进行传输,接收到的信号 y \mathbf{y} y 为:
y = H x pre + n \mathbf{y}=\mathbf{H} \mathbf{x}_{\text {pre }}+\mathbf{n} y=Hxpre +n其中 n 是噪声, y 是接收到的信号。

接收端解码

接收端使用左奇异矩阵 U \mathbf{U} U 和奇异值矩阵 Σ \Sigma Σ对接收到的信号进行解码。接收到的信号 y \mathbf{y} y 通过以下步骤进行反预编码:
x r e c = Σ − 1 U H y \mathbf{x}_{\mathrm{rec}}=\Sigma^{-1} \mathbf{U}^H \mathbf{y} xrec=Σ−1UHy


3️⃣ 代码

matlab 复制代码
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%SVD预编码%%%%%%%%%%%%%%%%%
clear all;
close all;

%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SNR = 0:1:20;
%每次仿真中使用的符号数
num_symbol = 1000;
%调制方式,16QAM
M = 16;
errors = zeros(1,length(SNR));
%每个信噪比下仿真迭代次数
num_iteration = 1000;
%发射天线数量
Ntx = 4;
%接收天线数量
Nrx = 4;
%%%%%%%%%%%%%%%%%%%%%主循环%%%%%%%%%%%%%%%%%%%%%%%%%
for index_snr = 1:length(SNR)
    %噪声功率
    sigma2 = 1/10^(SNR(index_snr)/10);
    for iteration = 1:num_iteration
        %生成随机比特流
        x = randi([0,M-1],Ntx,num_symbol);
        %16QAM调制
        x_mod = qammod(x,M);
        %生成一个随机的 信道矩阵
        H = sqrt(0.5)*(randn(Nrx,Ntx)+1i*randn(Nrx,Ntx));
        %生成 AWGN 噪声
        N = sqrt(sigma2/2)*(randn(Nrx,num_symbol)+1i*randn(Nrx,num_symbol));
        %对信道矩阵H进行奇异值分解
        [U,S,V] = svd(H);
        %svd预编码:通过右奇异矩阵对调制后的数据x_mod进行预编码,这个步骤可以有效减少多天线之间的干扰
        tx_data = V*x_mod;
        %传输
        y = H*tx_data + N;
        %SVD反预编码
        rx_data = pinv(S)*U'*y;
        %解调
        rx_data_demod = qamdemod(rx_data,M);
        %计算误差
        errors(index_snr) = errors(index_snr)+sum(sum(rx_data_demod~=x));
    end
end
error_rate = errors/(Ntx*num_symbol*num_iteration);
%%%%%%%%%%%%%%%%%%作图分析%%%%%%%%%%%%%%%%%%
semilogy(SNR,error_rate,'r-o');
xlabel('SNR(dB)');
ylabel('BER');
title('不同信噪比下SVD预编码方法的误码率');

结果分析:

  • 在低信噪比条件下,由于信号的质量较差,信号间的干扰较为显著。SVD预编码通过对信道矩阵H进行分解,可以将信号流之间的干扰降到最小,并优化信号的传输,使得 SVD预编码的误码率比无预编码的方法要低
  • 随着SNR增加,信号的质量得到提高,误码率会随着信号增益的增加而减小。此时,SVD预编码的性能优势相对较小,因为信号间的干扰已经显著降低。在高SNR条件下,所有方案的误码率趋于较低的水平,SVD预编码和无预编码之间的差距不如低SNR条件下那么明显
相关推荐
学编程的小程16 分钟前
LeetCode216
算法·深度优先
leeyayai_xixihah16 分钟前
2.21力扣-回溯组合
算法·leetcode·职场和发展
01_18 分钟前
力扣hot100——相交,回文链表
算法·leetcode·链表·双指针
萌の鱼19 分钟前
leetcode 2826. 将三个组排序
数据结构·c++·算法·leetcode
Buling_020 分钟前
算法-哈希表篇08-四数之和
数据结构·算法·散列表
AllowM21 分钟前
【LeetCode Hot100】除自身以外数组的乘积|左右乘积列表,Java实现!图解+代码,小白也能秒懂!
java·算法·leetcode
RAN_PAND1 小时前
STL介绍1:vector、pair、string、queue、map
开发语言·c++·算法
fai厅的秃头姐!3 小时前
C语言03
c语言·数据结构·算法
lisanndesu3 小时前
动态规划
算法·动态规划
myprogramc3 小时前
十大排序算法
数据结构·算法·排序算法