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条件下那么明显
相关推荐
想跑步的小弱鸡2 小时前
Leetcode hot 100(day 3)
算法·leetcode·职场和发展
xyliiiiiL3 小时前
ZGC初步了解
java·jvm·算法
爱的叹息4 小时前
RedisTemplate 的 6 个可配置序列化器属性对比
算法·哈希算法
独好紫罗兰4 小时前
洛谷题单2-P5713 【深基3.例5】洛谷团队系统-python-流程图重构
开发语言·python·算法
每次的天空5 小时前
Android学习总结之算法篇四(字符串)
android·学习·算法
请来次降维打击!!!5 小时前
优选算法系列(5.位运算)
java·前端·c++·算法
qystca5 小时前
蓝桥云客 刷题统计
算法·模拟
别NULL6 小时前
机试题——统计最少媒体包发送源个数
c++·算法·媒体
weisian1516 小时前
Java常用工具算法-3--加密算法2--非对称加密算法(RSA常用,ECC,DSA)
java·开发语言·算法
程序员黄同学7 小时前
贪心算法,其优缺点是什么?
算法·贪心算法