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条件下那么明显
相关推荐
COOCC17 分钟前
激活函数全解析:定义、分类与 17 种常用函数详解
人工智能·深度学习·神经网络·算法·机器学习·计算机视觉·自然语言处理
林下清风~16 分钟前
力扣hot100——347.前K个高频元素(cpp手撕堆)
算法·leetcode·职场和发展
进击的小白菜1 小时前
Java回溯算法解决非递减子序列问题(LeetCode 491)的深度解析
java·算法·leetcode
-一杯为品-2 小时前
【深度学习】#11 优化算法
人工智能·深度学习·算法
-qOVOp-3 小时前
zst-2001 上午题-历年真题 计算机网络(16个内容)
网络·计算机网络·算法
Swift社区3 小时前
涂色不踩雷:如何优雅解决 LeetCode 栅栏涂色问题
算法·leetcode·职场和发展
冠位观测者3 小时前
【Leetcode 每日一题】2900. 最长相邻不相等子序列 I
数据结构·算法·leetcode
真的没有脑袋3 小时前
概率相关问题
算法·面试
pystraf3 小时前
模板分享:网络最小费用流
c++·算法·图论·网络流
GG不是gg3 小时前
排序算法之高效排序:快速排序,归并排序,堆排序详解
数据结构·算法·排序算法