Python 加性高斯白噪声 AWGN

高斯白噪声

概念

加性高斯白噪声(Additive White Gaussian Noise,简写AWGN)
"白"是指功率谱恒定;
高斯指的是概率p (x)满足高斯函数。
在百度百科中的概念是,加性高斯白噪声在通信领域中指的是一种各频谱分量服从均匀分布(即白噪声),且幅度服从高斯分布的噪声信号。

公式推导

matlab的库中有AWGN这个库,如果要使用Python进行实现,要按照信噪比SRN公式进行推导:
在这里插入图片描述
其中x为原始信号,n为噪声信号。
推导可得噪声信号公式,其中N为原始信号长度:
在这里插入图片描述
最后服从高斯分布对噪声信号进行放大,可以得到最终的噪声信号:在这里插入图片描述

代码实现

假设我的原始信号single,与时间t的关系为:
在这里插入图片描述
其中t的取值为{0,1,2,3…,3998,3999},因此一共有4000个信号。得到的信号时域波形图:在这里插入图片描述
假设当前信噪比为10db,那么得到信号加入AWGN的时域波形图为:
在这里插入图片描述

import numpy as np

def awgn(x, snr, seed=7):
    '''
    加入高斯白噪声 Additive White Gaussian Noise
    :param x: 原始信号
    :param snr: 信噪比
    :return: 加入噪声后的信号
    '''
    np.random.seed(seed)  # 设置随机种子
    t_snr = 10 ** (snr / 10.0)
    xpower = np.sum(x ** 2) / len(x)
    npower = xpower / t_snr
    noise = np.random.randn(len(x)) * np.sqrt(npower)
    return x + noise

高斯白噪声AWGN)信道下,2DPSK(二进制差分相移键控)通信系统的仿真可以帮助我们理解该调制方式在噪声环境下的能。以下是一个基本的仿真步骤和注意事项: ### 仿真步骤 1. **生成随机比特流**: - 生成一个随机的二进制比特流,作为待发送的数据。 2. **差分编码**: - 对比特流进行差分编码,以便在接收端进行差分解码。 3. **2DPSK调制**: - 将差分编码后的比特流映射到相位上。通常,0映射到0度相位,1映射到180度相位。 4. **高斯白噪声**: - 在调制后的信号上添高斯白噪声。噪声的功率谱密度通常由信噪比(SNR)决定。 5. **2DPSK解调**: - 对接收到的信号进行解调,恢复出相位信息。 6. **差分解码**: - 对解调后的相位信息进行差分解码,恢复出原始的比特流。 7. **误码率计算**: - 比较原始比特流和解码后的比特流,计算误码率(BER)。 ### 示例代码(Python) ```python import numpy as np import matplotlib.pyplot as plt # 参数设置 num_bits = 10000 snr_db = 10 # 生成随机比特流 bits = np.random.randint(0, 2, num_bits) # 差分编码 diff_bits = np.diff(np.concatenate(([0], bits))) % 2 # 2DPSK调制 phase = np.pi * diff_bits signal = np.exp(1j * phase) # 高斯白噪声 signal_power = np.mean(np.abs(signal)**2) noise_power = signal_power / (10**(snr_db / 10)) noise = np.sqrt(noise_power/2) * (np.random.randn(num_bits) + 1j * np.random.randn(num_bits)) received_signal = signal + noise # 2DPSK解调 received_phase = np.angle(received_signal) received_diff_bits = (received_phase > 0).astype(int) # 差分解码 received_bits = (np.cumsum(received_diff_bits) % 2).astype(int) # 误码率计算 ber = np.mean(np.abs(bits - received_bits)) print(f"误码率 (BER): {ber}") # 绘制误码率 plt.hist(bits - received_bits, bins=2) plt.title("误码率直方图") plt.xlabel("错误比特数") plt.ylabel("频数") plt.show() ``` ### 注意事项 1. **信噪比(SNR)**:不同的SNR值会影响误码率。可以通过调整`snr_db`参数来观察不同噪声水平下的系统能。 2. **仿真长度**:仿真比特流的长度会影响结果的准确。通常,仿真长度越长,结果越准确。 3. **差分编码**:差分编码和解码过程需要确保同步,否则会导致误码率增
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值