如何在Python(Spyder)中绘制二进制数组对应的方波信号?
解决基于数组生成方波信号的绘图问题
看起来你遇到的核心问题是生成的方波信号数组pliroforia和时间轴t的长度不匹配,导致无法正常绘图。我来帮你一步步修正代码:
问题分析
你的现有代码里存在几个关键问题:
t的总长度对应25*T,但你计算Samples_per_bit=int(12/Ts)的逻辑完全错误,这个值和bit数量、总时间毫无关联,直接导致pliroforia的长度和t对不上- 循环拼接数组的方式不仅低效,还容易引入长度误差
- 没有处理采样数整除时的微小偏差,进一步加剧了长度不匹配问题
修正后的代码
import numpy as np from numpy import pi, linspace, sin, array import matplotlib.pyplot as plt from scipy import signal A=1 f=1000 T=1/f B=f Nyquist_Fs=2*B Fs=100*Nyquist_Fs Ts=T/10 Tmax=25*T # 直接计算总采样数,逻辑更清晰 total_samples = int(Tmax / Ts) t = linspace(0, Tmax, total_samples, endpoint=True) # 绘制已成功的正弦波信号 our_signal = A*sin(2*pi*f*t) plt.figure(1) plt.plot(t, our_signal) plt.xlabel('Χρόνος (sec) ->') plt.ylabel ('Πλάτος (V)') # 生成基于word数组的方波信号 word = array([1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1]) num_bits = len(word) # 将总时间平均分配给每个bit,保证时长匹配 bit_duration = Tmax / num_bits # 计算每个bit对应的采样数,确保总长度和t一致 samples_per_bit = int(total_samples / num_bits) # 用np.repeat高效生成方波,替代繁琐的循环拼接 pliroforia = np.repeat(word, samples_per_bit) # 处理整除时的微小长度偏差,保证和t的长度完全一致 if len(pliroforia) < total_samples: pliroforia = np.append(pliroforia, [pliroforia[-1]]*(total_samples - len(pliroforia))) # 绘制方波信号并优化显示 plt.figure(2) plt.plot(t, pliroforia) plt.xlabel('Χρόνος (sec) ->') plt.ylabel ('Πλάτος (V)') plt.ylim(-0.2, 1.2) # 调整y轴范围,让方波边缘更清晰 plt.grid(True) plt.show()
关键修改说明
- 采样数逻辑优化:用
total_samples = int(Tmax / Ts)替代原来的复杂计算,更直观且不易出错 - bit时长合理分配:把总时间
Tmax平均分给12个bit,确保方波总时长和时间轴t完全匹配 - 高效生成方波:用
np.repeat替代循环拼接,代码更简洁,运行效率也更高 - 长度补全处理:解决采样数无法整除时的微小长度差异,保证
pliroforia和t长度完全一致 - 显示效果优化:添加y轴范围限制和网格,让方波信号的显示更清晰直观
这样修改后,你就能成功绘制出对应word数组的方波信号了。
内容的提问来源于stack exchange,提问作者george
相关产品推荐
相关产品推荐

