如何用Python生成固定时长的随机方波信号?
生成固定电平持续时长的随机方波信号
问题需求
需要生成每个电平固定持续5分钟的随机方波信号,振幅在0到1之间随机,到达时长后切换新振幅;同时叠加正弦波动并将值限制在0-1范围内,使用NumPy和Matplotlib实现仿真与可视化。现有代码无法保证电平时长固定,需修正。
原代码问题分析
原代码的核心问题在于:
- 错误使用
i % (square_duration + 1) == 0的判断逻辑,搭配随机的square_change变量,导致电平持续时间随机,无法固定为5分钟 - 循环内逻辑冗余混乱,没有严格按照固定时长填充电平值
修改后的实现代码
import numpy as np import matplotlib.pyplot as plt # 参数定义 min_value = 0.0 max_value = 1.0 square_duration = 5 * 60 # 每个电平持续5分钟(秒) max_sim = 1 * 60 * 60 # 总仿真时长1小时(秒) # 计算总共有多少个完整电平段 num_segments = max_sim // square_duration # 处理总时长不能被5分钟整除的剩余样本 remaining_samples = max_sim % square_duration # 生成每个电平段的随机振幅 segment_values = np.random.uniform(min_value, max_value, size=num_segments) # 若有剩余样本,用最后一个电平值填充 if remaining_samples > 0: segment_values = np.append(segment_values, segment_values[-1]) # 生成方波信号:重复每个电平值对应次数,截断到总仿真时长 pl = np.repeat(segment_values, square_duration)[:max_sim] # 叠加正弦波动 pl += np.sin(np.arange(max_sim) / max_sim * 2 * np.pi) * 0.15 # 将值限制在0-1范围内 pl = np.clip(pl, min_value, max_value) # 可视化 plt.figure(figsize=(12, 6)) plt.plot(np.arange(max_sim), pl) plt.xlabel('时间(秒)') plt.ylabel('振幅') plt.title('固定5分钟电平时长的随机方波(叠加正弦波动)') plt.grid(True) plt.show()
代码说明
- 固定电平时长:通过
np.repeat直接将每个随机生成的振幅重复square_duration次,确保每个电平严格持续5分钟 - 剩余样本处理:如果总仿真时长不是5分钟的整数倍,用最后一个电平值填充剩余样本,避免信号截断
- 高效生成:使用NumPy向量化操作替代循环,逻辑更清晰且运行效率更高
- 波动与限幅:按需求叠加正弦波动后,用
np.clip确保所有值严格落在0-1区间内
内容的提问来源于stack exchange,提问作者K. Rincon
相关产品推荐
相关产品推荐

