如何在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
相关产品推荐
相关产品推荐

