快速傅里叶变换(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在信号处理中的强大能力。它不仅可以帮助我们识别信号中的主要频率成分,还可以为进一步的信号处理和分析提供基础。
热门推荐
左肺小结节是什么意思?一文读懂其定义、检查与治疗
数字人怎么和观众互动
广州天河区免费游玩好去处:天河公园全攻略
户外音箱选购指南:小体积大音质,续航强劲是关键!
电烙铁使用全攻略:温度设置与操作方法详解
平足症系列科普之---平足症的治疗
专业猎头如何评估候选人的能力和潜力?
孤独症早发现!自我检视,看看您的宝宝是否达到发育里程碑?(2-12月龄)
《英雄联盟》世界观中弗雷尔卓德的故事,艾希统一之路
孩子講不聽很故意?兒童心理師教你3招破解溝通障礙
辅酶Q10是智商税吗?一文读懂其真相
如何在Windows 11上设置默认麦克风和相机?这里有详细步骤
合同到期是否符合失业金领取条件?
盐酸多巴胺注射液是什么
如何合法查询户籍信息?有哪些规定?
美国电话号码格式详解及常见问题解析
买前必看!9600X vs 7500F:性能对比与购买建议
五行中的火元素解析与象征意义探讨
琥珀有什么作用
科普|流感重症病例如何识别
房屋质量检测报告:确保房屋安全,为您保驾护航
不同领域翻译中的术语挑战
哪吒获颁推广大使,“跟着电影游中国”启动
高效观展指南:提升艺术鉴赏力的实用技巧与建议
溶血现象实验报告分析
【健康科普】關於抗生素,你需要知道這些
探究翡翠财神佛公雕刻工艺:传统与创新的完美融合
教你挑选排骨:内行人才知道的选购和烹饪秘诀
黄金微针和点阵激光有啥不同?医生教你按皮肤问题选对项目
黄金微针和点阵激光有啥不同?医生教你按皮肤问题选对项目