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

如何在Python中对随机列表及波函数列表执行傅里叶变换提取频率

刚好这两个问题我都有实际处理经验,给你详细捋一捋:

1. Python中获取随机列表的傅里叶变换

用numpy的FFT模块就能轻松实现,步骤非常清晰:

  • 先准备数据:不管是你自己生成的随机列表还是现成的,先转成numpy数组方便计算。比如生成一组随机数:

    import numpy as np
    
    # 生成长度为1024的随机样本(替换成你自己的随机列表就行)
    random_data = np.random.randn(1024)
    
  • 执行FFT变换:用np.fft.fft()得到复数形式的变换结果,要是想让频谱中心对齐原点,就用np.fft.fftshift()调整:

    # 计算FFT
    fft_output = np.fft.fft(random_data)
    # 把频谱移到中心,方便观察正负频率
    shifted_fft = np.fft.fftshift(fft_output)
    
  • 计算幅度谱和频率轴:幅度谱是FFT结果的绝对值,频率轴得根据采样间隔来算(如果你的数据没有明确采样率,默认间隔为1就行):

    # 归一化幅度谱(除以数据长度)
    amplitude_spectrum = np.abs(shifted_fft) / len(random_data)
    # 生成对应的频率轴
    freq_axis = np.fft.fftshift(np.fft.fftfreq(len(random_data), d=1))
    
  • 可视化验证(可选):用matplotlib画出来看看效果:

    import matplotlib.pyplot as plt
    
    plt.plot(freq_axis, amplitude_spectrum)
    plt.xlabel("Frequency")
    plt.ylabel("Normalized Amplitude")
    plt.title("FFT of Random Data")
    plt.show()
    
2. 从啁啾状的psi-x数据中提取频率

你说psi-x图像类似啁啾信号,这意味着频率是随空间坐标x变化的——普通的全局FFT只能给出整个信号的平均频率,没法捕捉频率的变化趋势。这时候得用空频分析方法,我给你两种实用方案:

方案一:短时傅里叶变换(STFT)

STFT会把信号切成一个个小窗口,对每个窗口做FFT,这样就能看到频率随x的变化:

  • 先确定采样参数:你的x间隔是0.001,所以采样率fs = 1/0.001 = 1000(单位:1/空间单位)。先把列表转成numpy数组:

    import numpy as np
    from scipy import signal
    import matplotlib.pyplot as plt
    
    # 替换成你自己的x和psi列表
    x = np.array([1, 1.001, 1.002, ..., 4])
    psi = np.array([1.571, 1.579, ..., 1])
    dx = x[1] - x[0]
    fs = 1 / dx
    
  • 执行STFT:调整nperseg(窗口长度)来平衡空间分辨率和频率分辨率——窗口越长,频率分辨率越高,但空间分辨率越低,反之亦然:

    # 窗口长度设为100,重叠50个点(你可以根据数据调整)
    f, spatial_points, Zxx = signal.stft(psi, fs=fs, nperseg=100, noverlap=50)
    # spatial_points是对应x的位置,f是频率轴,Zxx是复数频谱
    
  • 可视化空频分布:用热力图直观展示频率随x的变化:

    plt.pcolormesh(spatial_points + x[0], f, np.abs(Zxx), shading='gouraud')
    plt.xlabel("Spatial Coordinate x")
    plt.ylabel("Frequency")
    plt.title("STFT of Chirp-like Psi-x Signal")
    plt.colorbar(label="Amplitude")
    plt.show()
    

方案二:提取瞬时频率

如果想直接得到每个x点对应的瞬时频率,可以用希尔伯特变换计算解析信号,然后通过相位的导数得到频率:

# 计算解析信号
analytic_signal = signal.hilbert(psi)
# 计算瞬时相位(unwrap避免相位跳变)
instantaneous_phase = np.unwrap(np.angle(analytic_signal))
# 瞬时频率 = 相位对x的导数 / (2π)
instantaneous_frequency = np.diff(instantaneous_phase) / (2 * np.pi * dx)
# 因为diff后长度减1,所以对应x的前n-1个点
plt.plot(x[:-1], instantaneous_frequency)
plt.xlabel("Spatial Coordinate x")
plt.ylabel("Instantaneous Frequency")
plt.title("Instantaneous Frequency of Psi-x Signal")
plt.show()

这个方法能直接给出每个位置的频率值,适合需要定量分析频率变化的场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:54:42