You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 16:36:43