函数输入:
- EbN0dB:一个列表,表示每比特信噪比(SNR),以分贝(dB)为单位。
- MOD_TYPE:调制类型,可能的值有 ‘BPSK’、‘PSK’、‘QAM’、‘PAM’、‘FSK’。不同的调制方式采用不同的公式来计算符号错误率。
- M:调制方式的级别。对于 PSK、PAM、FSK,M 必须是 2 的幂次方;而对于 QAM,M 必须是 2 的偶数次方(方阵 QAM)。
- COHERENCE:仅对 FSK 调制方式有效,用于指定是否为相干检测:
- ‘coherent’:表示使用相干检测。
- ‘noncoherent’:表示使用非相干检测。
变量计算:
- gamma_b:将 Eb/N0 从 dB 转换为线性值,表示每比特信噪比(SNR)。
gamma_b = 10.^(EbN0dB/10);
- gamma_s:每符号信噪比(SNR)。对于多进制调制,符号错误率(SER)是基于每符号信噪比计算的。公式是:
其中,log2(M) 是每个符号包含的比特数。gamma_s = log2(M) * gamma_b;
SER 计算:
SER
变量初始化为零,并根据调制类型(MOD_TYPE)进行不同的计算。调制方式的处理逻辑如下:
1. BPSK(二进制相位键控):
对于 BPSK,符号错误率(SER)可以通过以下公式计算:
SER = 0.5 * erfc(sqrt(gamma_b));
其中 erfc(x)
是互补误差函数,sqrt(gamma_b)
是每比特信噪比的平方根。
2. PSK(相位键控):
对于 PSK 调制,若 M = 2
则为 BPSK,计算与 BPSK 相同。若 M = 4
,则为 QPSK,符号错误率使用 QPSK 的公式:
Q = 0.5 * erfc(sqrt(gamma_b));
SER = 2 * Q - Q.^2;
对于更高阶的 PSK(如 8-PSK、16-PSK 等),符号错误率通过以下公式计算:
SER = erfc(sqrt(gamma_s) * sin(pi / M));
这里 sin(pi / M)
是调制级别 M
对应的常数。
3. QAM(正交幅度调制):
对于 QAM,符号错误率的计算公式为:
SER = 1 - (1 - (1 - 1 / sqrt(M)) * erfc(sqrt(3 / 2 * gamma_s / (M - 1)))) .^ 2;
这里使用了关于 QAM 的公式,涉及到 gamma_s
和 M
的关系。
4. FSK(频率键控):
对于 FSK 调制,分为相干检测和非相干检测两种情况:
-
相干检测:使用数值积分来计算 SER,代码如下:
fun = @(q) (0.5 * erfc((-q - sqrt(2 * gamma_s(ii))) / sqrt(2))) .^ (M - 1) * 1 / sqrt(2 * pi) * exp(-q.^2 / 2); SER(ii) = 1 - integral(fun, -inf, inf);
该公式通过计算积分来求得符号错误率。
-
非相干检测:使用近似的计算方法来求 SER,代码如下:
for i = 1:M - 1 summ = summ + (-1)^(i + 1) / (i + 1) * prod((n - r + 1 : n) / (1 : r)) * exp(-i / (i + 1) * gamma_s(jj)); end SER(jj) = summ;
5. PAM(脉冲幅度调制):
对于 PAM,符号错误率使用以下公式:
SER = 2 * (1 - 1 / M) * 0.5 * erfc(sqrt(3 * gamma_s / (M^2 - 1)));
错误处理:
如果调制类型不在支持的范围内,代码会显示一个错误消息:
display 'ser_awgn.m: Invalid modulation (MOD_TYPE) selected'