Python计算常数信号FFT时触发IndexError元组索引越界报错
问题根因
代码触发报错的原因有两处:
- 笔误:
print(type(t1))中引用了未定义的变量t1,你实际声明的时间数组变量名为t,如果这行是你贴代码时的输入错误、实际运行时不存在该行,那么核心报错来自plt.stem()的参数不匹配:你传入的频率轴参数freq是单个整数值1,但FFT计算得到的结果X是长度为10的数组(时间序列t步长0.1、0到1区间不含端点共10个采样点),stem绘图要求x轴和y轴传入的序列长度完全一致,长度不匹配时matplotlib内部遍历绘图点会访问越界索引,抛出IndexError: tuple index out of range。 - 额外逻辑问题:你构造的频率轴不符合FFT输出规则,硬编码
freq=1完全无法对应FFT实际输出的频点位置;constant_function固定返回标量1,虽然numpy广播机制不会直接报错,但逻辑上不够严谨;FFT结果也没有做幅值归一化,得到的幅值不符合实际物理意义。
修正后可运行代码
import matplotlib.pyplot as plt import numpy as np from scipy.fftpack import fft, ifft def constant_function(x): # 返回和输入长度一致的全1常数信号 return np.ones_like(x) # 采样参数配置 Fs = 10 # 采样频率,对应0.1s的采样间隔 t = np.arange(0.0, 1, 1/Fs) signal = constant_function(t) # 计算FFT N = len(signal) X = fft(signal) # 生成匹配的频率轴,仅保留正频率部分 freq = np.fft.fftfreq(N, 1/Fs)[:N//2] # 幅值归一化,双边谱转单边谱 X_mag = 2 * np.abs(X)[:N//2] / N plt.figure(figsize=(12, 6)) plt.subplot(121) plt.stem(freq, X_mag, 'b', markerfmt=" ", basefmt="-b") plt.xlabel('Freq (Hz)') plt.ylabel('FFT Amplitude |X(freq)|') plt.xlim(-0.1, 1.1) plt.subplot(122) # 取实部消除浮点计算带来的微小虚部误差 plt.plot(t, ifft(X).real, 'r') plt.xlabel('Time (s)') plt.ylabel('Amplitude') plt.tight_layout() plt.show()
运行结果说明
修正后代码运行结果符合常数信号的FFT特性:
- 常数信号属于直流信号,仅在0Hz位置有频率分量,因此幅值谱仅在0Hz处存在值为1的峰值,其余频点幅值为0
- 经过IFFT重构的信号和原始全1常数信号完全一致,无失真
内容的提问来源于stack exchange,提问作者Gunners
相关产品推荐
相关产品推荐

