快速傅里叶变换(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在信号处理中的强大能力。它不仅可以帮助我们识别信号中的主要频率成分,还可以为进一步的信号处理和分析提供基础。
热门推荐
户主能把别人户口迁出吗
英国拍卖殖民时期那加人头骨激怒印度社会
2025年阿尔茨海默病治疗指南:新药物、新方法
吃咸鸭蛋的坏处有哪些
如何在质量管理中优化供应商选择
果茶中的绿色植物:从绿茶到薰衣草的健康益处
揭秘健康饮食:少糖半糖标准糖大不同
世纪审判:从辛普森杀妻案看疑罪从无——法律取舍与平衡的艺术
农贸市场设计新规:优化市场动线提升购物体验
股票中的kdj线如何运用?它在股票分析中的局限性是什么?
各地中小学改进体育教育:让年轻一代在运动中强意志、健身心
大清朝的“半兽人军团”——索伦兵
唾液:比你想象的更重要
提升工作效率的高效汇报技巧与策略
掼蛋大小排序图解:掌握掼蛋游戏的牌型规则
驾驶证补办指南:所需证件和手续详解
马达加斯加的自然保护地体系
《斗破苍穹》动画第136集:龙凰本源果现世,紫妍VS凤清儿,青鳞强势截胡
2025年考研调剂通知:机会未尽,如何抓住最后的希望?
双皮奶为什么叫双皮奶?
土方类别划分标准详解
先3D建模再照着画?《进击的巨人》最终章幕后制作
库克现身北京:探访科技小院,展现苹果在华新动向
DTF 打印机的常见问题及其解决方法
拉斯维加斯15大必去景点攻略
追踪国际气象前沿,2024年国际机构有何动态
2024年中国二次元产业竞争格局及市场份额分析
七里香花语是什么?七里香的寓意是什么?
黄金ETF的投资策略如何制定?这些策略有哪些潜在的风险和收益?
计算机专业留学:最佳国家选择指南及注意事项