快速傅里叶变换(FFT)的简单应用:提取信号中的主频率
创作时间:
作者:
@小白创作中心
快速傅里叶变换(FFT)的简单应用:提取信号中的主频率
引用
CSDN
1.
https://blog.csdn.net/weixin_40146921/article/details/122006305
快速傅里叶变换(FFT)是数字信号处理中的重要工具,可以用来分析信号的频率成分。本文将通过一个简单的例子,展示如何使用FFT来提取信号中的主频率。
测试信号生成
首先,我们生成一个含有大量噪声的测试信号。信号由两个不同频率的正弦波叠加而成,并添加了高斯白噪声。
import numpy as np
import matplotlib.pyplot as plt
t = np.arange(-10, 10, 1 / 1e4) # 时间序列
f1, f2 = 0.1, 200 # 两个信号的频率
noise = 10 * np.random.randn(len(t)) # 噪声信号
# 生成测试信号
y = 1.3 * np.sin(2 * np.pi * f1 * t) + 2.5 * np.cos(2 * np.pi * f2 * t) + noise
plt.figure()
plt.plot(t, y)
plt.xlabel("t")
plt.ylabel("y")
plt.show()
由于噪声很大,从时域图上几乎看不出信号的具体形态:
利用FFT提取主频率
接下来,我们使用FFT来分析信号的频率成分。具体实现如下:
from scipy.fft import fft, fftfreq
def analyse_freq_and_amp(x: np.ndarray, y: np.ndarray):
"""
分析不同频率谐波的幅值
:param x: 时间序列
:param y: 信号序列
:return: 频率序列,幅值序列
"""
n = len(x)
sample_freq = (n - 1) / (x[-1] - x[0]) # 采样频率
freqs = fftfreq(n, 1. / sample_freq)[:n // 2]
amplitudes = 2. / n * np.abs(fft(y)[:n // 2])
return freqs, amplitudes
freqs, amps = analyse_freq_and_amp(t, y)
plt.figure()
plt.plot(freqs, amps)
plt.xlabel("Freq./Hz")
plt.ylabel("Amplitude")
plt.show()
从频域图上可以看出,信号中有两个频率成分的幅值明显高于其他频率:
进一步放大观察,可以发现这两个频率成分分别位于0.1Hz和200Hz附近,对应的幅值约为1.3和2.5,这与我们生成信号时设置的参数完全一致。
完整代码
以下是完整的Python代码,包含了信号生成、FFT分析以及结果可视化:
import numpy as np
import matplotlib.pyplot as plt
from scipy.fft import fft, fftfreq
def analyse_freq_and_amp(x: np.ndarray, y: np.ndarray):
"""
分析不同频率谐波的幅值
:param x: 时间序列
:param y: 信号序列
:return: 频率序列,幅值序列
"""
n = len(x)
sample_freq = (n - 1) / (x[-1] - x[0]) # 采样频率
freqs = fftfreq(n, 1. / sample_freq)[:n // 2]
amplitudes = 2. / n * np.abs(fft(y)[:n // 2])
return freqs, amplitudes
if __name__ == "__main__":
t = np.arange(-10, 10, 1 / 1e4)
f1, f2 = 0.1, 200
noise = 10 * np.random.randn(len(t)) # 噪声信号
# 生成测试信号
y = 1.3 * np.sin(2 * np.pi * f1 * t) + 2.5 * np.cos(2 * np.pi * f2 * t) + noise
freqs, amps = analyse_freq_and_amp(t, y)
plt.figure()
plt.plot(t, y)
plt.xlabel("t")
plt.ylabel("y")
plt.figure()
plt.plot(freqs, amps)
plt.xlabel("Freq./Hz")
plt.ylabel("Amplitude")
plt.show()
通过这个简单的例子,我们可以看到FFT在信号处理中的强大能力。它不仅可以帮助我们识别信号中的主要频率成分,还可以为进一步的信号处理和分析提供基础。
热门推荐
鲤鱼跳龙门:从文化传承到生态守护
揭秘鲤鱼繁殖季:从生态意义到保护行动
剪映视频无声全攻略:从原因分析到故障排查
剪映录屏没声音怎么办?5个实用技巧帮你轻松解决
孙俪亲述《甄嬛传》:惊鸿舞不用替身,配音因怀孕
香蕉的隐藏价值:从果皮到果肉的全方位养生指南
斯科特9部历史片排名:《角斗士》登顶,《拿破仑》垫底
陈敏正团队如何让《甄嬛传》服饰引领时尚潮流
“搭子社交”:失恋后重建社交圈的新选择
基于“21天效应”,30天四阶段走出失恋阴影
小学放学后,如何高效安排英语学习?
“基建狂魔”背后的科技力量:钱七虎院士谈中国基建创新
从中药到艾灸:中医五疗法破解齿痕舌难题
从《甄嬛传》看职场生存:角色类比与台词智慧
春节"捡钱",就在周三!国债逆回购最佳时点来了!如何躺赚11天利息?来看操作攻略
身份证的编程是什么规律
冬日美景:雨雪霏霏的诗意打卡
尿蛋白与肌酐比值检测,及早预警肾病风险
从纯真到权谋:甄嬛的宫廷生存与人性蜕变
谁是油老虎?自动挡中型轿车油耗榜公布,排名你意外吗
蜈支洲岛亲子游必备健康安全小贴士
胃炎患者使用阿莫西林需谨慎,医生建议饭后服用并配合胃黏膜保护剂
车厘子虽营养但需适量,肾病患者等7类人慎食
蜈支洲岛亲子游:这些特色项目不容错过
王者荣耀社交优势明显,英魂之刃创新玩法更胜一筹
世界最大直径盾构隧道在济南开建,已突破千米大关
唐山河头老街:两次升级打造文旅新地标,中秋迎客12万
三亚蜈支洲岛亲子游必打卡景点推荐
正阳门考古新发现揭秘中轴线奥秘
一文详解伦敦留学:学校申请、生活成本全知道