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

Python中非均匀时间序列的DFT计算与对应频率数组求解

问题核心原因

你写的DFT函数是标准离散傅里叶变换实现,仅适用于采样间隔固定的均匀时间序列。你的时间数组t采样间隔不固定,不满足标准DFT的应用前提,因此无法得到正确结果。

解决方法

1. 改用非均匀离散傅里叶变换(NUDFT)实现

标准DFT的e指数项基于均匀采样的时间点t_n = n * dt推导,非均匀采样需要直接代入实际采样时间t计算,正确实现如下:

import numpy as np

def nudft(t, x, f):
    """
    非均匀采样信号的离散傅里叶变换实现
    参数:
        t: 实际采样时间数组,长度N
        x: 对应时间点的信号值(这里就是电场E),长度N
        f: 要计算的目标频率数组,长度M
    返回:
        X: 对应频率点的傅里叶变换结果,长度M
    """
    N = len(t)
    M = len(f)
    # 构造e指数项:维度为[M, N]
    e = np.exp(-2j * np.pi * f.reshape((M, 1)) * t.reshape((1, N)))
    X = np.dot(e, x) / N  # 可根据需求决定是否保留除以N的归一化步骤
    return X

2. 构造对应频率数组

你可以按照以下逻辑构造符合需求的频率数组:

  • 总采样时长:T = t[-1] - t[0],默认频率分辨率取df = 1/T
  • 最小采样间隔:dt_min = np.min(np.diff(t)),最高分析频率建议不超过对应奈奎斯特频率f_max = 1/(2*dt_min)
  • 生成频率数组代码:
t = np.array([1, 5, 6, 8.5, 12, 20, 21.5, 22.3, 27, 30])
T = t[-1] - t[0]
df = 1 / T
dt_min = np.min(np.diff(t))
f_max = 1 / (2 * dt_min)
# 生成0到f_max的频率数组,步长为df
f = np.arange(0, f_max, df)

3. 调用示例

# 替换为实际的电场序列E
E = np.array([你的电场测量值])
E_dft = nudft(t, E, f)

内容的提问来源于stack exchange,提问作者Subhadip Saha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:00:02