LLR 是常用于数字通信系统中的信号检测与解码的量,尤其在**信道解码(例如LDPC或Turbo码解码)**中非常重要。函数 compute_llr
的作用是计算一个信号的对数似然比(LLR)和概率值 p1
,用于评估每个比特的值。
函数头
function [llr, p1] = compute_llr(obj, y, n_0)
-
输入参数:
obj
: 包含该函数所属对象的属性(可能是调制解调相关的对象,如调制星座、比特映射等)。y
: 一个向量,表示接收的信号(通常是经过噪声污染的接收信号)。n_0
: 一个标量或向量,表示噪声方差(在MIMO或多路复用系统中,可能是不同接收符号的噪声方差)。
-
输出参数:
llr
: 对数似然比(Log-Likelihood Ratio),用于评估接收信号在不同状态下的可能性。p1
: 概率值,表示接收符号属于某个状态的概率。
变量初始化
p0 = zeros(length(y) * obj.n_bits, 1);
p1 = zeros(length(y) * obj.n_bits, 1);
p0
和p1
初始化为长度为length(y) * obj.n_bits
的零向量。这些向量将用于存储每个比特位置的概率值。obj.n_bits
表示每个符号包含的比特数,length(y)
表示接收信号的符号数。
外层循环:遍历每个接收符号
for y_index = 1 : length(y)
- 外层循环遍历接收到的每一个符号
y(y_index)
,y_index
是接收符号的索引。
内层循环:遍历所有可能的符号组合
for sym_index = 1 : 2^obj.n_bits
- 内层循环遍历所有可能的符号组合。
2^obj.n_bits
表示每个符号可以表示的所有比特组合的数量。例如,如果每个符号代表 2 个比特,那么该循环将遍历 4 个符号(sym_index = 1, 2, 3, 4
)。
计算每个符号的概率 p_sym
if length(n_0) == 1
p_sym = exp(-abs(y(y_index) - obj.constellation_points(sym_index))^2 / 2 / n_0);
else
p_sym = exp(-abs(y(y_index) - obj.constellation_points(sym_index))^2 / 2 / n_0(y_index));
end
p_sym
是计算当前接收符号与可能的调制星座点obj.constellation_points(sym_index)
之间的距离,并根据该距离和噪声方差n_0
计算符号的概率。符号的概率是通过高斯分布公式计算的,表示在给定噪声条件下,接收符号y(y_index)
发生的可能性。- 如果
n_0
是标量,那么所有符号使用相同的噪声方差; - 如果
n_0
是向量,则为每个接收符号使用不同的噪声方差。
- 如果
比特的概率更新
for m_index = 1 : obj.n_bits
if obj.bit_sym_map(sym_index, m_index) == 0
p0((y_index-1) * obj.n_bits + m_index) = p0((y_index-1) * obj.n_bits + m_index) + p_sym;
else
p1((y_index-1) * obj.n_bits + m_index) = p1((y_index-1) * obj.n_bits + m_index) + p_sym;
end
end
- 对于每个符号,计算其对应的比特在
p0
和p1
中的概率值。obj.bit_sym_map
是一个映射表,用于确定每个符号中的每个比特位置。如果某个比特为 0,则将p_sym
加到p0
中;如果某个比特为 1,则将p_sym
加到p1
中。
计算对数似然比(LLR)
llr = log(p0 ./ p1);
- LLR的计算是通过
p0
和p1
来得到的,llr
表示接收符号属于比特值 0 与 1 的对数似然比。LLR 可以用于软判决解码,它表示比特值为 1 的可能性与比特值为 0 的可能性的比值的对数。
归一化 p1
p1 = p1 ./ (p0 + p1);
p1
被归一化到 [0, 1] 的范围,表示比特为 1 的概率。计算方式为:p1
除以p0
和p1
的总和。
总结
该函数 compute_llr
的核心功能是通过接收信号和已知的调制星座点,计算出每个比特的对数似然比(LLR)以及每个比特为 1 的概率 p1
。这些计算结果可用于进一步的信道解码过程,尤其是在软判决解码算法中(例如 LDPC 或 Turbo 解码)。