数组做信号频率分析的核心是用采样周期ts连接时域与频域:ts决定频率分辨率Δf=1/(n·ts)和奈奎斯特频率fnyq=1/(2ts),fft后频率轴fk=k·fs/n,需通过rfftfreq(n,d=ts)验证一致性。

用数组做信号频率分析,核心是把时间序列数据存成一维数组,再通过傅里叶变换映射到频率维度。关键不在数组本身,而在于你如何用它承载采样信息、定义时间轴、并正确关联物理频率——采样周期(即采样间隔)正是连接时域与频域的标尺。
用数组组织采样信号:时间、值、索引三者对齐
信号本质是一组按固定时间间隔采集的数值。用 NumPy 数组存储时,每个元素对应一个采样点,索引代表序号,值代表幅值:
- 设采样周期为 Ts(单位:秒),即相邻两个采样点的时间差;
- 采样率 fs = 1 / Ts(单位:Hz);
- 若数组长度为 N,则信号总时长为 N × Ts;
- 时间数组可直接生成:t = np.arange(N) * T_s 或 t = np.linspace(0, N*T_s, N, endpoint=False);
- 信号数组 x 与 t 必须等长且一一对应,这是后续频率计算不出错的前提。
从数组推导频率轴:采样周期决定分辨率与范围
对信号数组 x 执行 FFT 后,得到复数频谱数组 X。它的每个索引 k 对应一个离散频率:
- 第 k 个频率点的物理值为:fk = k × fs / N(单位:Hz),其中 k = 0, 1, ..., N−1;
- 频率分辨率(即最小可分辨频率差)为:Δf = fs / N = 1 / (N × Ts) —— 它由采样周期和总点数共同决定;
- 奈奎斯特频率(最高可分析频率)为:fnyq = fs / 2 = 1 / (2Ts);
- 实际绘图常用单边幅度谱,取 k = 0 到 N//2,对应频率从 0 到 fnyq。
实战计算变量采样周期:从原始数据反推或主动设定
采样周期不是凭空假设的,它必须来自真实采集条件或明确建模意图:
- 若已知采样率(如音频 44.1 kHz),直接算:Ts = 1 / 44100 ≈ 22.68 μs;
- 若只有时间戳数组 t(如传感器记录的不规则时间),可用 np.diff(t).mean() 估算平均采样周期(注意检查是否均匀);
- 若需对比不同采样密度的影响,可人为构造多组 T_s:例如 T_s_list = [0.001, 0.01, 0.1](对应 1 kHz、100 Hz、10 Hz),分别生成信号数组并观察频谱展宽或混叠;
- 特别注意:改变 T_s 会同步改变频率轴刻度和混叠风险——降低采样率(增大 T_s)可能使高频成分折叠进低频区,图表上出现虚假峰值。
一个不可跳过的检查步骤:验证时间-频率一致性
每次拿到新信号数组,建议立即运行三行代码确认关键参数:
- N = len(x) —— 确认点数;
- T_total = N * T_s —— 确认总时长是否符合预期;
- freqs = np.fft.rfftfreq(N, d=T_s) —— 直接生成匹配的频率轴,比手算更可靠。
只要 T_s 输入正确,rfftfreq 就能给出完全对齐的物理频率数组,避免索引错位导致的“峰值跑偏”问题。










