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

如何在Julia中提取任意函数的频率分量?

在Julia中用FFT提取函数频率分量的正确姿势

1. 准备工作:安装并导入依赖包

Julia里做FFT主要用FFTW包,搭配Plots可以直观查看结果,第一次使用先安装:

using Pkg
Pkg.add("FFTW")
Pkg.add("Plots")

导入包:

using FFTW, Plots

2. 构造测试正弦信号

以5Hz的纯正弦波为例,先明确几个核心参数(必须符合奈奎斯特采样准则:采样频率≥2倍信号最高频率):

fs = 100.0               # 采样频率(Hz),远大于2*5Hz
t = 0:1/fs:2-1/fs        # 时间序列,从0到2秒,步长为采样间隔
f0 = 5.0                 # 目标正弦波频率
x = sin.(2π * f0 * t)    # 生成正弦信号

3. 计算FFT并处理结果

直接调用fft()得到的是复数数组,需要转换为可解读的幅度谱,并生成对应的频率轴:

X = fft(x)               # 计算FFT
N = length(x)            # 采样点数
freqs = fftfreq(N, fs)   # 生成频率轴,范围是 -fs/2 到 fs/2

接下来做幅度归一化(修正FFT结果的幅度与采样点数的关联):

amp = abs.(X) / N        # 基础归一化
amp[2:end-1] .*= 2       # 非直流分量乘以2,因为实信号的FFT结果是共轭对称的

4. 可视化验证结果

画幅度谱就能清晰看到5Hz的峰值:

plot(freqs, amp, xlabel="频率(Hz)", ylabel="幅度", title="正弦波FFT幅度谱", xlim=(-10,10))

运行后会在5Hz和-5Hz位置看到明显峰值,这就是信号的频率分量。

你可能踩过的坑

  • 没生成频率轴:直接看fft()输出的数组,不知道每个元素对应哪个频率,fftfreq()是关键
  • 未做幅度归一化:原始FFT结果的幅度和采样点数挂钩,归一化后才能得到真实信号幅度
  • 采样频率不达标:如果采样频率低于2倍信号频率,会发生混叠,看不到正确峰值
  • 忽略FFT对称性:实信号的FFT结果对称,非直流分量必须乘以2才能还原真实幅度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 07:39:58