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

Python处理太阳黑子时间序列的傅里叶变换实现问题咨询

问题核心错误与修正方案

  1. 单位选择问题
    采样频率不需要强制转换为秒单位,选择和研究场景匹配的单位即可,你要观测的是11年的周期,直接用年或月作为时间单位会更直观,转换为秒只会得到极小的数值,额外引入浮点精度问题。

  2. 函数参数误用
    你混淆了np.fft.fftfreq的入参定义,该函数的第二个参数d代表两次采样的时间间隔,而非采样频率fs。你把采样频率传入作为间隔参数,相当于告诉函数你的采样间隔是1/2592000秒,和实际每月采样一次的情况完全不符,最终得到的频率轴数值完全错位,自然观测不到预期的峰值。

正确实现示例

我们选择年作为时间单位,每月采样一次的时间间隔就是1/12年,对应代码如下:

import numpy as np
import matplotlib.pyplot as plt

# 采样间隔:单位为年,每月采样对应1/12年
sampling_interval = 1/12
n_samples = sn_value.size

# 计算FFT
fourier = np.fft.fft(sn_value)
# 计算频率轴,此时单位为 1/年(每年的周期数)
freqs = np.fft.fftfreq(n_samples, d=sampling_interval)
power_spectrum = np.abs(fourier)

# 仅保留正频率部分绘图,避免冗余
positive_freq_mask = freqs > 0
positive_freqs = freqs[positive_freq_mask]
positive_power = power_spectrum[positive_freq_mask]

plt.plot(positive_freqs, positive_power)
plt.xlabel('频率 (1/年)')
plt.ylabel('功率谱幅值')
# 11年周期对应频率为1/11≈0.09 1/年,设置x轴范围到0~0.5即可观测到对应峰值
plt.xlim(0, 0.5)
plt.title("太阳黑子数时间序列的功率谱密度")
plt.grid(True)

修正参数后即可在≈0.09 1/年的位置观测到11年周期对应的预期峰值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 17:54:00