如何用Python随机移动坐标点(模拟无线通信星座图噪声)
实现星座图的随机方向噪声模拟
核心思路
要实现随机方向的点偏移,最贴合无线通信场景的方式是添加二维高斯白噪声(AWGN)——这是模拟无线信道噪声的标准做法;同时要让部分点落在原坐标之间,可通过随机选取原坐标对做线性插值,再叠加小噪声实现。
具体实现代码
import pandas as pd import matplotlib.pyplot as plt import numpy as np # 原坐标数据 data = {'x': [-0.3162277660168379967, -0.3162277660168379967, -0.9486832980505139901, 0.3162277660168379967, 0.9486832980505139901, -0.3162277660168379967, -0.3162277660168379967, -0.9486832980505139901, 0.9486832980505139901, 0.3162277660168379967, 0.3162277660168379967, 0.3162277660168379967, 0.9486832980505139901, -0.9486832980505139901, -0.9486832980505139901, 0.9486832980505139901], 'y': [-0.9486832980505139901, 0.3162277660168379967, 0.9486832980505139901, 0.3162277660168379967, -0.3162277660168379967, 0.9486832980505139901, -0.3162277660168379967, -0.3162277660168379967, 0.3162277660168379967, -0.9486832980505139901, -0.3162277660168379967, 0.9486832980505139901, -0.9486832980505139901, 0.3162277660168379967, -0.9486832980505139901, 0.9486832980505139901] } df = pd.DataFrame(data) # 1. 生成二维高斯白噪声,实现全方向随机偏移 noise_std = 0.1 # 噪声强度,值越大偏移越明显 noise_x = np.random.normal(0, noise_std, size=len(df)) noise_y = np.random.normal(0, noise_std, size=len(df)) # 添加噪声得到基础偏移后的点集 df_noisy = df.copy() df_noisy['x'] += noise_x df_noisy['y'] += noise_y # 2. 随机选择部分点,让它们落在两个原坐标点之间 interp_ratio = 0.2 # 设定落在两点之间的点比例(20%) num_interp_points = int(len(df) * interp_ratio) interp_indices = np.random.choice(len(df), num_interp_points, replace=False) for idx in interp_indices: # 随机选取另一个不同的原坐标点 other_idx = np.random.choice([i for i in range(len(df)) if i != idx]) # 生成0-1之间的随机插值系数 alpha = np.random.uniform(0, 1) # 线性插值计算新坐标,叠加小噪声避免完全在直线上 new_x = alpha * df.loc[idx, 'x'] + (1 - alpha) * df.loc[other_idx, 'x'] + np.random.normal(0, noise_std/2) new_y = alpha * df.loc[idx, 'y'] + (1 - alpha) * df.loc[other_idx, 'y'] + np.random.normal(0, noise_std/2) # 更新该点坐标 df_noisy.loc[idx, 'x'] = new_x df_noisy.loc[idx, 'y'] = new_y # 对比绘制原星座图和加噪后的星座图 fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5)) df.plot(x='x', y='y', kind='scatter', ax=ax1, title='原星座图') df_noisy.plot(x='x', y='y', kind='scatter', ax=ax2, title='加噪后星座图') plt.show()
关键细节说明
- 二维高斯噪声:
np.random.normal生成的x、y方向噪声相互独立,叠加后会形成全方向的随机偏移,彻底解决固定方向加减的局限,噪声标准差noise_std可根据需求调整偏移幅度。 - 插值点处理:通过随机选取原坐标对,用线性插值得到两点间的点,再叠加小噪声,让这些点自然分布在原星座点之间,模拟更严重的噪声干扰或信号失真。
- 参数可调:可修改
noise_std控制整体偏移程度,修改interp_ratio调整落在两点之间的点数量比例。
内容的提问来源于stack exchange,提问作者Rupak
相关产品推荐
相关产品推荐

