快速傅里叶变换(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在信号处理中的强大能力。它不仅可以帮助我们识别信号中的主要频率成分,还可以为进一步的信号处理和分析提供基础。
热门推荐
肿瘤专家:CA199升高不等于患癌,需进一步检查
投资入门必懂:五类资产的特征与配置要点
A 股股票最佳买卖点在一天中何时?八成散户不了解
掌握十大总结技巧,轻松拿奖!
肚子疼时的家庭急救,你get了吗?
劳动合同管理风险防范指南
从“お大事に”到“一日も早く”:日语祝福语全攻略
钱学森与长征一号:中国航天事业的里程碑
黄芪白术甘草:固本益肠片的秘密武器
新手养狗指南,选择最适合你的毛茸茸伙伴
乌镇:从千年文化古镇到世界互联网大会永久会址
立秋习俗有哪些?立秋的寓意和象征
膀胱训练完全攻略:告别尿等待烦恼
IT行业顶级证书盘点:提升职业含金量的必备证书
西昌雷公山避暑攻略:比市区低8℃,玩转瀑布森林
都江堰:2000多年持续使用的水利工程,成就“天府之国”
虎骨禁用后,黑龙江狗骨成新宠?
肝病早期信号:从皮肤到尿液的六大预警
南方最美自然景观:杭州西湖、丽江古城、桂林山水
自制桂花红茶:秋季养生的暖心之选
糖尿病肾病患者的营养管理指南
阿尔山必游景点全攻略:从国家森林公园到通古斯部落
用情绪价值滋养孩子:家庭教育的温柔力量
维萨里:解剖学之父的传奇一生
舟山衢山岛攻略:华东必去的小众海岛
武夷山两日游:山水、文化与茶香的完美融合
巴菲特教你长期持股的财富密码
脑动脉粥样硬化日常护理及饮食调理指南
突发昏睡、感觉丧失…脊髓海绵状血管瘤的他在“和世界失联的边缘”
芦荟不止是盆栽:食用、药用到化妆品,价值超乎想象