EbN0、SNR换算及误码率公式的理论推导计算


前言

事情的起因源自学长给的MQAM误码率理论曲线,其中有2种曲线,Fig.1 中仿真曲线与理论曲线重合,Fig.2 中在低EbN0的时候出现了不贴合的现象,这让我非常疑惑,于是查找了理论公式的原始推导,网上的命名与定各种各样,非常容易让人混淆,于是在此重新整理出几种理论误码率推导的方法。

Fig.1. BER vs. EbN0 @MQAM Sim,Approx_Theory
Fig.1. BER vs. EbN0 @MQAM Sim,Approx_Theory

在这里插入图片描述
Fig.2. BER vs. EbN0 @MQAM Sim,Theory_2


一、EbN0 、SNR的转换

在下面理论推导中需要用到Es和Eb的转换,先把转换公式列出。
E s = E b × l o g 2 ( M ) S N R = E s N 0 = E b N 0 × B i t R a t e B a u d R a t e S N R _ d B = 10 l o g 10 E b N 0 + 10 l o g 10 B i t R a t e B a u d R a t e = E b N 0 _ d B + 10 l o g 10 ( M ) E_s=E_b×log_2(M) \\ SNR=\frac{E_s}{N_0}=\frac{E_b}{N_0}×\frac{BitRate}{BaudRate} \\SNR\_{dB}=10log_{10}\frac{Eb}{N_0}+10log_{10}\frac{BitRate}{BaudRate}=EbN0\_dB+10log_{10}(M) Es=Eb×log2(M)SNR=N0Es=N0Eb×BaudRateBitRateSNR_dB=10log10N0Eb+10log10BaudRateBitRate=EbN0_dB+10log10(M)
实际应用中要分清

二、理论公式推导

本文推导前提是AWGN信道

1.第一种MQAM的近似公式

这里直接给出第一种理论公式,这种公式的推导比较复杂,这里不作具体研究。
P b ≈ 2 l o g 2 M ⋅ ( 1 − 1 M ) ⋅ e r f c ( 3 S N R 2 ( M − 1 ) ) P_{\mathrm{b}}\approx \frac{2}{log_2M}\cdot \left( 1-\frac{1}{\sqrt{M}} \right) \cdot erfc\left( \sqrt{\frac{3SNR}{2(M-1)}} \right) Pblog2M2(1M 1)erfc(2(M1)3SNR )
特例是,当M=2或4,也就是BPSK和QPSK的情况,上式可以取等号,也就是说此时不是近似公式,而恰好是理想公式。

2.第二种MQAM的近似公式

2.1 BPSK的公式推导


Fig.3. BPSK 高斯噪声分布函数

单个符号错误概率,例如S0误码为S1的概率为
P S 0 = P ( n ≥ d 2 ) = ∫ d 2 ∞ 1 2 π σ 2 e − n 2 2 σ 2 d n = ∫ d 2 σ ∞ 1 2 π e − t 2 2 d t ( n σ = t , d n = σ d t ) = Q ( d 2 σ ) \begin{aligned} P_{S0}=P(n\ge \frac{d}{2})&=\int_{\frac{d}{2}}^{\infty}{\frac{1}{\sqrt{2\pi \sigma ^2}}}e^{-\frac{n^2}{2\sigma ^2}}dn\\ &=\int_{\frac{d}{2\sigma}}^{\infty}{\frac{1}{\sqrt{2\pi}}}e^{\frac{-t^2}{2}}dt\quad (\frac{n}{\sigma}=t,dn=\sigma dt)\\ &=Q(\frac{d}{2\sigma})\\ \end{aligned} PS0=P(n2d)=2d2πσ2 1e2σ2n2dn=2σd2π 1e2t2dt(σn=t,dn=σdt)=Q(2σd)
其中, Q为高斯错误概率函数, 满足等式
Q ( x ) = 1 2 e r f c ( x 2 ) Q\left( x \right) =\frac{1}{2}erfc\left( \frac{x}{\sqrt{2}} \right) Q(x)=21erfc(2 x)
符号的平均能量, 也就是星座图的平均功率Es
E s = 1 2 ( ( d 2 ) 2 + ( d 2 ) 2 ) = d 2 4 E_s=\frac{1}{2}((\frac{d}{2})^2+(\frac{d}{2})^2)=\frac{d^2}{4} Es=21((2d)2+(2d)2)=4d2
推得
d = 2 E s d=2\sqrt{E_s} d=2Es
用概率权重求整体误符号率Ps
P S = 1 2 P S 0 + 1 2 P S 1 = Q ( d 2 σ ) P_S=\frac{1}{2}P_{S0}+\frac{1}{2}P_{S1}=Q\left( \frac{d}{2\sigma} \right) PS=21PS0+21PS1=Q(2σd)
BPSK一个符号对应一个Bit,所以
P b = P S = 1 2 e r f c E b N 0 P_b=P_S=\frac{1}{2}erfc\sqrt{\frac{E_b}{N_0}} Pb=PS=21erfcN0Eb

2.2 QPSK的公式推导

在这里插入图片描述
Fig.4. QPSK 星座图

与BPSK类似
P S i i ∈ { 0 , 1 , 2 , 3 } = 2 P ( n ≥ d / 2 ) − P 2 ( n ≥ d / 2 ) = 2 Q ( d 2 σ ) − Q 2 ( d 2 σ ) \underset{i\in \left\{ 0,1,2,3 \right\}}{P_{S_i}}=2P(n\ge d/2)-P^2(n\ge d/2)=2Q(\frac{d}{2\sigma})-Q^2(\frac{d}{2\sigma}) i{0,1,2,3}PSi=2P(nd/2)P2(nd/2)=2Q(2σd)Q2(2σd)
E s = 1 4 × 4 × ( 2 d 2 ) 2 = d 2 2 E_s=\frac{1}{4}\times 4\times \left( \frac{\sqrt{2}d}{2} \right) ^2=\frac{d^2}{2} Es=41×4×(22 d)2=2d2
d = 2 E s d=\sqrt{2E_s} d=2Es
P S = 2 Q ( d 2 σ ) − Q 2 ( d 2 σ ) P_S=2Q(\frac{d}{2\sigma})-Q^2(\frac{d}{2\sigma}) PS=2Q(2σd)Q2(2σd)
P S = e r f c E b N 0 − 1 4 e r f c 2 E b N 0 P_S=erfc\sqrt{\frac{E_b}{N_0}}-\frac{1}{4}erfc^2\sqrt{\frac{E_b}{N_0}} PS=erfcN0Eb 41erfc2N0Eb
到这里,前面都与BPSK类似,但是对于二维的信号,Ps与Pb满足下式,该式其实是定义是,是最准确的公式
P s = 1 − ( 1 − P b ) N P_s=1-(1-P_b)^N Ps=1(1Pb)N
其中 N = log ⁡ 2 M N=\log _2M N=log2M
该式泰勒展开,在Pb足够小时,展开到一次项,得到近似关系
P s = P b log ⁡ 2 M P_s=P_b\log _2M Ps=Pblog2M
于是QPSK的误码率可以推到
P b = 1 2 e r f c E b N 0 − 1 8 e r f c 2 E b N 0 P_b=\frac{1}{2}erfc\sqrt{\frac{E_b}{N_0}}-\frac{1}{8}erfc^2\sqrt{\frac{E_b}{N_0}} Pb=21erfcN0Eb 81erfc2N0Eb

2.3 几种推导方式的关系论述

首先从前面的定义式反推出
P b = 1 − 1 − P s N P_b=1-\sqrt[N]{1-P_s} Pb=1N1Ps
这是最准确的关系式,如果在仿真中使用足够长的序列,最后的性能曲线会趋近于该式算出的结果。下表是前面提到的3种理论BER计算方式,Sim代表定义式,也就是仿真所趋近的实际值,Theory-1是2.1节提出的近似式,Theory-2是在2.2节推导出的式子,16QAM不做详细推导,具体可以参考: M-QAM的SER/BER/误码率计算
在这里插入图片描述
三个方式的关系为,Sim是最准确的公式表达,Theory-1是通过积分推导得到的近似公式,Theory-2是泰勒展开得到,但弊端是在高信噪比的时候才更加准确,否则需要展开出更多项来逼近真实值。

三. 仿真结果

在这里插入图片描述
在这里插入图片描述

仿真代码链接:https://download.youkuaiyun.com/download/qq_26157161/88886758

<think>嗯,用户让我介绍一下BPSK无编码时的BER性能,重复码的BER性能曲线,还有CRC编码校验,并且要用C语言编写程序输出曲线。首先,我需要分步骤处理这些问题,确保每个部分都解释清楚,同时代码也要正确。 首先,BPSK无编码的BER性能。我记得BPSK的误码率公式应该是Q函数,具体是0.5*erfc(sqrt(Eb/N0)),或者用Q(sqrt(2Eb/N0)),对吗?需要确认一下公式的正确性,别搞错了。然后可能需要解释一下Eb/N0信噪比的关系,以及如何转换成分贝值。这部分的理论基础应该没问题,但得用中文简单明了地讲出来。 接下来是重复码,比如每个比特重复三次的简单编码。这时候的BER性能会比无编码差,但通过多数判决解码可以改善。需要推导重复码的BER公式,可能要考虑比如三中取二的情况,使用二项式分布计算错误概率。这里可能会有用户提问,为什么重复码反而在高SNR时性能更好,但实际可能因为编码率的问题,Eb/N0需要调整。可能需要提到编码率的影响,比如重复码的编码率是1/3,所以实际Eb会降低,换算成Eb/N0的时候需要考虑进去。这部分容易出错,需要仔细核对公式是否正确。 然后是CRC编码校验。需要解释CRC的原理,比如生成多项式,校验位的添加,以及如何检测错误。用户可能想知道如何用C语言实现CRC,所以需要提供一个示例代码,包括计算CRC的函数,以及如何应用到数据包上。同时,可能需要模拟传输过程中的错误,计算未检测到的错误概率。不过CRC本身不纠正错误,只是检测,所以BER可能未检测的错误有关?或者用户可能希望比较CRC编码后的系统性能,但通常CRC会ARQ等重传机制结合使用,单独的话可能只是检测错误,不影响BER,但影响数据包的可靠性。这部分需要明确说明,避免误解。 接下来是C语言程序部分。需要编写三个程序:BPSK的BER计算,重复码的BER,以及CRC的模拟。对于BPSK重复码,可能需要用蒙特卡洛仿真,生成随机比特,加噪声,解调,统计错误。但用户可能希望直接计算理论曲线,或者同时有理论仿真结果?用户提到“输出相应的曲线”,所以可能需要生成数据点,然后用绘图工具如Python的matplotlib或Gnuplot来画图。但用户要求用C语言编写程序,所以可能需要在C中计算数据并输出到文件,再用其他工具绘图。需要确保代码正确,特别是噪声的生成,使用AWGN信道,以及解码部分。 对于重复码的仿真,比如每个比特重复三次,接收端用多数判决,需要考虑编码率的影响。例如,发送三个符号表示一个比特,所以每个符号的能量是Eb/3,这样在相同的Eb/N0下,噪声的影响更大。或者,是否应该保持符号能量不变,从而Eb是原来的三倍?这里容易混淆,需要正确应用编码率对Eb/N0的影响。例如,如果编码率是1/3,那么对于同样的传输能量,Eb实际上是原来的三倍,所以Eb/N0需要调整。这部分在仿真时要特别注意,否则结果会不正确。 对于CRC的程序,需要实现CRC计算,比如CRC-8或者CRC-16,生成多项式,然后模拟添加错误,计算未检测的错误概率。例如,生成随机数据,加CRC,然后随机添加错误,检查CRC是否检测到。统计未检测到的错误比例。但CRC的检错能力取决于生成多项式的选择,不同的多项式有不同的检错能力,比如是否能检测所有奇数个错误,或一定长度内的突发错误。用户可能需要一个简单的例子,比如使用CRC-8,多项式0x07,然后演示如何计算校验。 现在,代码部分需要注意效率,但因为是示例,可能不需要优化。例如,BPSK的仿真需要生成高斯噪声,可以用Box-Muller变换。重复码的仿真需要重复每个比特,加噪声,然后多数判决。CRC部分需要实现移位寄存器的方式计算余数。 可能的错误点:在计算噪声方差时,Eb/N0转换为线性值,然后计算噪声功率。例如,如果符号能量是Es,则噪声功率是N0/2,但需要根据仿真的采样方式是否正确处理。对于BPSK,每个符号的能量Es = Eb(无编码时),但重复码的Es = Eb * R,其中R是编码率。例如,重复三次的话,R=1/3,所以Es = Eb * 1/3。因此,在计算噪声时,需要考虑编码率的影响,调整Eb/N0的值。这点非常重要,否则仿真结果会与理论不符。 总结步骤: 1. 理论解释每个部分的BER性能。 2. 提供C代码框架,包括理论计算蒙特卡洛仿真。 3. 确保代码中的参数转换正确,特别是Eb/N0的处理。 4. 输出数据文件,用其他工具画图。 用户可能需要了解如何从理论公式到仿真实现,所以需要详细注释代码,并说明如何编译运行。此外,需要提醒用户安装必要的绘图工具,或者将数据导入Excel等软件绘图。 最后,检查所有LaTeX公式是否正确使用$...$$$...$$格式,避免语法错误。例如,BPSK的BER公式是否正确,重复码的公式是否正确应用了二项式分布,以及CRC的生成多项式是否正确表示。 现在,将这些思路整理成结构化的回答,分步骤解释,并提供相应的代码示例。</think>### 一、BPSK无编码的BER性能 1. **理论公式** BPSK的误码率(BER)理论公式为: $$ P_b = Q\left(\sqrt{\frac{2E_b}{N_0}}\right) = \frac{1}{2} \text{erfc}\left(\sqrt{\frac{E_b}{N_0}}\right) $$ 其中 $E_b/N_0$ 是信噪比,$Q(\cdot)$ 是高斯Q函数,$\text{erfc}(\cdot)$ 是互补误差函数。 2. **仿真方法** - 生成随机比特序列。 - 调制为BPSK信号(0→-1,1→+1)。 - 添加高斯噪声。 - 解调并统计误码率。 --- ### 二、重复码的BER性能曲线 1. **重复码原理** - 每个比特重复 $n$ 次(例如 $n=3$),解码采用多数判决。 - 编码率 $R = 1/n$,实际有效信噪比降低为 $E_b/N_0 \cdot R$。 2. **理论公式** 误码率通过二项分布计算: $$ P_b = \sum_{k=\lceil n/2 \rceil}^n \binom{n}{k} p^k (1-p)^{n-k} $$ 其中 $p = Q\left(\sqrt{2R \cdot E_b/N_0}\right)$ 是单个符号的误码率。 --- ### 三、CRC编码与校验 1. **CRC原理** - 生成多项式(如CRC-8:$x^8 + x^2 + x + 1$,对应十六进制 `0x07`)。 - 发送端计算校验码并附加到数据末尾。 - 接收端重新计算校验码,验证一致性。 2. **性能分析** CRC不直接改善BER,但能检测传输错误,降低未检错概率。 --- ### 四、C语言程序示例 #### 1. BPSK无编码BER仿真 ```c #include <stdio.h> #include <stdlib.h> #include <math.h> double awgn(double x, double snr) { double noise = sqrt(0.5 / snr) * (rand() / (double)RAND_MAX - 0.5); return x + noise; } int main() { const int N = 1000000; const double EbN0_dB = 6.0; double EbN0 = pow(10.0, EbN0_dB / 10.0); int errors = 0; for (int i = 0; i < N; i++) { int bit = rand() % 2; double tx = (bit == 0) ? -1.0 : 1.0; double rx = awgn(tx, EbN0); int decoded = (rx > 0) ? 1 : 0; if (decoded != bit) errors++; } printf("BER = %.6f\n", (double)errors / N); return 0; } ``` #### 2. 重复码BER仿真(n=3) ```c // ...(包含awgn函数) int decode(int *rx_bits, int n) { int sum = 0; for (int i = 0; i < n; i++) sum += rx_bits[i]; return (sum > n/2) ? 1 : 0; } int main() { const int n = 3, N = 100000; double EbN0_dB = 6.0; double EbN0 = pow(10.0, EbN0_dB / 10.0) / n; // 编码率修正 int errors = 0; for (int i = 0; i < N; i++) { int bit = rand() % 2; int rx_bits[n]; for (int j = 0; j < n; j++) { double tx = (bit == 0) ? -1.0 : 1.0; rx_bits[j] = (awgn(tx, EbN0) > 0) ? 1 : 0; } if (decode(rx_bits, n) != bit) errors++; } printf("BER = %.6f\n", (double)errors / N); return 0; } ``` #### 3. CRC-8校验实现 ```c #include <stdint.h> uint8_t crc8(const uint8_t *data, int len) { uint8_t crc = 0x00; const uint8_t poly = 0x07; for (int i = 0; i < len; i++) { crc ^= data[i]; for (int j = 0; j < 8; j++) { if (crc & 0x80) crc = (crc << 1) ^ poly; else crc <<= 1; } } return crc; } int main() { uint8_t data[] = {0x01, 0x02, 0x03}; uint8_t checksum = crc8(data, 3); printf("CRC: 0x%02X\n", checksum); return 0; } ``` --- ### 五、曲线绘制方法 1. 编译运行程序,输出不同 $E_b/N_0$ 下的BER数据。 2. 将数据导入绘图工具(如Python Matplotlib): ```python import matplotlib.pyplot as plt import numpy as np EbN0_dB = np.arange(0, 11, 1) ber_bpsk = [...] # 仿真数据 ber_repetition = [...] plt.semilogy(EbN0_dB, ber_bpsk, 'o-', label='BPSK') plt.semilogy(EbN0_dB, ber_repetition, 's-', label='Repetition(n=3)') plt.xlabel('Eb/N0 (dB)') plt.ylabel('BER') plt.legend() plt.grid() plt.show() ``` --- ### 六、性能对比分析 1. **BPSK无编码**:BER随信噪比指数下降。 2. **重复码**:低信噪比时性能改善,但高信噪比时因编码率损失劣于BPSK。 3. **CRC**:不直接改变BER,但能显著降低未检错概率(典型CRC-8可检测99%以上错误)。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨滴不停跑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值