1️⃣ 介绍
虽然线性检测方法ZF检测和MMSE检测的硬件实现复杂度更低,但性能较差。本文章介绍性能更好但复杂度高的非线性检测方法——ML信号检测。
2️⃣ 原理介绍
最大似然(ML)检测的基本目的是通过接收的信号估计最有可能的发射信号。在通信系统中,发射端和接收端之间通常会受到信道的影响(比如噪声和衰减等),接收的信号通常会与原始发射的信号有所不同。ML检测就是一种方法,用来从接收到的信号中“猜测”发射端到底发送了什么信号。
假设发射信号向量为
x
\boldsymbol{x}
x。接收端的信号向量是
y
\boldsymbol{y}
y ,但由于信道的干扰,接收到的信号和发射的信号会有所不同。信道的影响可以用一个矩阵
H
\boldsymbol{H}
H 来描述,这个矩阵表示信号通过信道后是如何变化的。接收端接收到的信号可以表示为:
y
=
H
x
+
n
\boldsymbol{y}=\boldsymbol{H} \boldsymbol{x}+\boldsymbol{n}
y=Hx+n
接收端的任务就是从接收到的信号 y \boldsymbol{y} y 中"反推"发射端发送的信号 x \boldsymbol{x} x 。
最大似然检测的思路的具体步骤:
- 对于每一种可能的发射信号 x \boldsymbol{x} x ,通过信道矩阵 H \boldsymbol{H} H 计算它经过信道后的接收信号 H x \boldsymbol{H} \boldsymbol{x} Hx 。
- 计算接收信号 y \boldsymbol{y} y 与每个假设的信号 H x \boldsymbol{H} \boldsymbol{x} Hx 之间的差异,使用欧氏距离来度量: ∥ y − H x ∥ 2 \|\boldsymbol{y}-\boldsymbol{H} \boldsymbol{x}\|^2 ∥y−Hx∥2 。
- 找出最小欧氏距离对应的发射信号
x ^ ML \hat{x}_{\text {ML }} x^ML 是估计的发射信号,表示为:
x ^ M L = arg min x ∈ C N T X ∥ y − H x ∥ 2 \hat{\boldsymbol{x}}_{\mathrm{ML}}=\underset{\boldsymbol{x} \in C^{N_{\mathrm{TX}}}}{\arg \min }\|\boldsymbol{y}-\boldsymbol{H} \boldsymbol{x}\|^2 x^ML=x∈CNTXargmin∥y−Hx∥2
这表示当 x = x ^ ML \boldsymbol{x}=\hat{x}_{\text {ML }} x=x^ML 时, ∥ y − H x ∥ 2 \|\boldsymbol{y}-\boldsymbol{H} \boldsymbol{x}\|^2 ∥y−Hx∥2最小
复杂度分析:
复杂度与调制阶数C和发射天线数量有关。总共需要计算
∣
C
∣
N
T
x
|C|^{N_{\mathrm{Tx}}}
∣C∣NTx 个 ML 度量,也就是说计算度量的复杂度随着天线数呈指数上升。
3️⃣ 代码
%%%%%%%%%%%%%%%%%%%%%%%%%ML信号检测%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all;
close all;
%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%%%
Nrx = 8;
Ntx = 2;
num_symbol = 1000;
num_iteration = 100;
SNR = 0:1:15;
errors = zeros(1,length(SNR));
%QPSK调制
M = 4;
qpsk_symbol = [1+0i,0+1i,-0-1i,-1-0i];
%%%%%%%%%%%%%%%%%%%%%%%主循环%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for index_snr = 1:length(SNR)
snr = SNR(index_snr);
%噪声的方差也就是功率
sigma2 = 1/10^(snr/10);
for iteration = 1:num_iteration
%随机生成一个发射符号矩阵 x,其大小为 Ntx x num_symbol。每个符号是从QPSK的符号集合中随机选择的
x = randi([0,M-1],Ntx,num_symbol);
%对符号进行QPSK调制,x_mod 是调制后的信号
x_mod = pskmod(x,M);
%生成一个复高斯随机信道矩阵 H,表示发射信号与接收信号之间的关系。randn 是生成正态分布的随机数,sqrt(0.5) 是为了保证信道矩阵的方差为1
H = sqrt(0.5)*(randn(Nrx,Ntx)+1i*randn(Nrx,Ntx));
%生成复高斯噪声 N,每个噪声分量的方差为sigma^2
N = sqrt(sigma2/2)*(randn(Nrx,num_symbol)+1i*randn(Nrx,num_symbol));
%计算接收信号 y
y = H*x_mod+N;
%估计的发射符号矩阵 x_hat,它的大小和原始的发射符号矩阵 x 一样
x_hat = zeros(Ntx,num_symbol);
%最小二乘法估计x_hat
for index_symbol = 1:num_symbol
%初始化最小值为无穷大
MIN = inf;
for i = 1:M
for j = 1:M
temp = norm(y(:,index_symbol)-H*[qpsk_symbol(i);qpsk_symbol(j)])^2;
if temp<MIN
x_hat(:,index_symbol) = [qpsk_symbol(i);qpsk_symbol(j)];
MIN = temp;
end
end
end
end
%对估计的发射符号 x_hat 进行解调,得到解调后的符号
x_demod = pskdemod(x_hat,M);
%计算误码数
errors(index_snr) = errors(index_snr) + sum(sum(x_demod~=x));
end
end
error_rate = errors/(num_symbol*num_iteration*Ntx);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%作图比较%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
plot(SNR,error_rate,'b-o');
xlabel('SNR(dB)');
ylabel('BER');
title('ML信号检测误码率');
结果分析:
- 误码率巨小,几乎趋于零
4️⃣ 知识点
- ML信号检测性能好但复杂度高,总共需要计算 ∣ C ∣ N T x |C|^{N_{\mathrm{Tx}}} ∣C∣NTx 个 ML 度量