Python(Spyder)绘制ASK信号遇数组形状不匹配报错求解
嘿,我看到你在绘制ASK信号时遇到了维度不匹配的错误,这在信号处理里是很常见的小问题——核心原因就是载波信号our_signal和方波信号pliroforia的长度完全不一致,numpy没法对形状差异这么大的数组做广播相乘。让我帮你拆解问题并修复代码:
错误根源分析
你代码里的时间轴和信号生成顺序出了问题:
- 你先基于
total_samples=250生成了初始时间轴t,并用它生成了长度为250的载波信号our_signal - 之后你重新定义了
t,这次是基于方波信号pliroforia的长度(1440000),但our_signal还是原来的250个采样点,两者形状不匹配,自然无法完成相乘操作。 - 另外还有一个隐藏问题:你计算
Samples_per_bit=int(12/Ts)的逻辑不合理——Ts=0.0001秒,12/Ts会得到120000个采样点/比特,总时间会达到144秒,远超过你设定的Tmax=0.025秒,这完全不符合ASK调制的常规逻辑。
修复后的完整代码
我调整了代码顺序,统一了时间轴,同时修正了比特持续时间的计算逻辑,让信号参数更符合实际调制场景:
import numpy as np from numpy import pi, linspace, sin, array import matplotlib.pyplot as plt from scipy import signal # 载波参数 A = 1 # 载波幅度 f = 1000 # 载波频率(Hz) T = 1/f # 载波周期(秒) Ts = T/10 # 采样间隔(每个载波周期取10个采样点) N = 2 # 每个比特包含的载波周期数(可根据需求调整) T_bit = N * T # 单个比特的持续时间 # 信息序列 word = array([1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1]) bit_count = len(word) Samples_per_bit = int(T_bit / Ts) # 每个比特对应的采样点数 # 生成方波信号(信息信号) pliroforia = [] for bit in word: bit_samples = np.ones(Samples_per_bit) * bit pliroforia = np.concatenate((pliroforia, bit_samples)) # 生成统一的时间轴(匹配方波信号长度) total_samples = len(pliroforia) t = linspace(0, bit_count * T_bit, 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)') plt.title('Πορτοφόρος σήμα') # 绘制方波信号 plt.figure(2) plt.plot(t, pliroforia) plt.xlabel('Χρόνος (sec) ->') plt.ylabel('Πλάτος (V)') plt.title('Σήμα πληροφορίας (καθυστέρηση)') # 生成并绘制ASK信号(现在两个信号长度一致,可以直接相乘) ASK_signal = pliroforia * our_signal plt.figure(3) plt.plot(t, ASK_signal) plt.xlabel('Χρόνος (sec) ->') plt.ylabel('Πλάτος (V)') plt.title('ASK σήμα') plt.show()
关键修改说明
- 统一时间轴:先生成方波信号确定总采样数,再基于这个长度生成时间轴
t,确保载波和方波信号的采样点数量完全匹配。 - 修正比特持续时间:用
N(每个比特包含的载波周期数)来定义比特长度,既符合ASK调制的常规逻辑,也让总时间和载波参数匹配。你可以根据需求调整N的值,比如改成5,每个比特就包含5个载波周期。 - 简化冗余代码:去掉了未用到的
fft_modules导入,让代码更简洁清晰。
内容的提问来源于stack exchange,提问作者george
相关产品推荐
相关产品推荐

