傅立叶及其python应用

news/2024/4/29 11:35:00/文章来源:https://blog.csdn.net/yuanzhoulvpi/article/details/126902133

前言

  1. 本文是傅立叶及其python应用系列的第三篇文章
  2. 对应的仓库地址为https://github.com/yuanzhoulvpi2017/tiny_python/tree/main/Fourier_Series

介绍

第二篇主要介绍了傅立叶的核心:“傅里叶级数就是函数在某个函数空间中各个基底的投影和“,然后基于这个核心,我们做了一个数值模拟:如何去拟合一个任意函数。

但是在实际应用的时候,我们并不会去直接的按照原理,写代码去实现。而是直接调用非常稳定的、安全的api,帮助我们解决问题。

在这次第三篇中,将给你展示一个非常神奇的傅立叶应用。而这个应用,也会帮助你进一步了解傅立叶的核心。

那我们直接开始吧。

api介绍

如果你对科学计算感兴趣,你在numpyscipypytorchtensorflow包里面会发现一个叫fft模块。

fft全称为Fast Fourier Transform ,中文翻译的也很直接,就叫快速傅里叶变换

  1. numpy: https://numpy.org/doc/stable/reference/generated/numpy.fft.fft.html
  2. scipy:https://docs.scipy.org/doc/scipy/reference/generated/scipy.fft.fft.html#scipy.fft.fft
  3. pytorch:https://pytorch.org/docs/stable/fft.html
  4. tensorflow: https://www.tensorflow.org/api_docs/python/tf/signal/fft

虽然属于不同的包,但是本质上都差不多,对数据做快速傅立叶变换。从离散数据中提取出信息。

那么到底怎么处理离散的数据,能提取出什么信息?其实这些包的文档里面都没说。那么我接下来将要分享一个案例,带大家打开傅立叶应用的大门。

案例 - 使用傅里叶变换求噪声中隐藏的信号的频率分量

导入包

就暂时使用scipyfft模块来做演示。

import numpy as np
from scipy.fft import fft
import matplotlib.pyplot as plt

创建一个样本数据

  1. 指定信号的参数,采样频率为 1 kHz,信号持续时间为 1.5 秒。
Fs = 1000  #Sampling frequency
T = 1 / Fs  #Sampling period
L = 1500;  #Length of signal
t = np.arange(L) * T  #Time vector
  1. 构造一个信号,其中包含幅值为 0.7 的 50 Hz 正弦、幅值为 1 的 120 Hz 正弦量、幅值为 0.2 的 10 Hz 正弦量(简单的来说就是三个sin函数相加)。
  2. 再添加一点随机值到里面。
S = 0.7 * np.sin(2 * np.pi * 50 * t) + np.sin(2 * np.pi * 120 * t) + 0.2 * np.sin(2 * np.pi * 10 * t)
X = S + 2 * np.random.rand(S.shape[0])
  1. 数据可视化,大概看看数据的前100是啥样子的。
fig, ax = plt.subplots(figsize=(10, 5), dpi=120)
ax.plot(1000 * t[:100], X[:100])
ax.set_title("Signal Corrupted with Zero-Mean Random Noise")
ax.set_xlabel("t (milliseconds)")
ax.set_ylabel("X(t)")

可以看出来,下面什么信息都看不到,杂乱无章的数据而已。

  1. 计算数据的傅立叶变换
  2. 计算双侧频谱 P2。然后基于 P2 和偶数信号长度 L 计算单侧频谱 P1。
Y = fft(X)
P2 = np.abs(Y / L)
P1 = P2[1:np.int32(L / 2 + 1)]
P1[1:] = 2 * P1[1:]
  1. P1数据可视化看一下:
f = Fs * np.arange(L / 2) / L
fig, ax = plt.subplots(figsize=(10, 5), dpi=120)
ax.plot(f, P1)
ax.set_title('Single-Sided Amplitude Spectrum of X(t)')
ax.set_xlabel('f (Hz)')
ax.set_ylabel('|P1(f)|')
# ax.set_xlim([0, 150])


这个图看起来,好像有3个高峰,然后好像有很多噪声。那么我们重点放在三个峰那里,看看能不能从三个峰那里发现有用的信息。

  1. 更新可视化
f = Fs * np.arange(L / 2) / L
fig, ax = plt.subplots(figsize=(10, 5), dpi=120)
ax.plot(f, P1)
ax.set_title('Single-Sided Amplitude Spectrum of X(t)')
ax.set_xlabel('f (Hz)')
ax.set_ylabel('|P1(f)|')
ax.set_xlim([0, 150])
for temp_y in [0.2, 0.7, 1.0]:ax.hlines(temp_y, xmin=0, xmax=150, colors='gray', linestyles='-.')for temp_x in [10, 50, 120]:ax.vlines(x=temp_x, ymin=0, ymax=1,colors='red', linestyles='-.' )

从上面图可以看到:

  1. 三个峰的x轴的位置都是在10,50,120附近。
  2. 三个峰的y轴的位置都是在0.2,0.7,1.0附近。

这三个数值到底是什么意思?

其实你只要把文章翻到最前面就可以看到了。在文字最前面的构建样本数据的时候,写了这样的话:“其中包含幅值为 0.7 的 50 Hz 正弦、幅值为 1 的 120 Hz 正弦量、幅值为 0.2 的 10 Hz 正弦量”

可以得出来了:x轴的位置对应的是频率部分,y轴对应的是震幅部分。

是不是破案了!!
我们通过傅立叶变换,然后对数据简单做了计算,竟然能求出来原始数据的参数!!!

在最后,牢记这句话:傅里叶级数就是函数在某个函数空间中各个基底的投影和

end

那么这就是本期的全部内容,如果想看更多,点击下方的代码链接和文章list,下期再见!

代码

傅立叶及其python应用所有的代码和数据全部都免费共享!

  1. 代码所在文件夹为:https://github.com/yuanzhoulvpi2017/tiny_python/tree/main/Fourier_Series
  2. 代码文件为03开头的ipynb格式文件

参考链接

  1. 主要参考了Matlab文档,翻译成python版本的代码 https://ww2.mathworks.cn/help/matlab/ref/fft.html
  2. https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.find_peaks_cwt.html

本系列文章

list

相关文章

list

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_9321.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Day27、使用DQL命令查询数据

1、DQL语言 1.1、DQL(Data Query Language,数据查询语言) 1)查询数据库数据,如SELECT语句 2)简单的单表查询或多表的复杂查询和嵌套查询 3)数据库语言中最核心、最重要的语句 4)使用频率最高的语句 1.2、SE…

Linux小白学习

Linux学习 虚拟机 安装Linux镜像下载简单命令含义 一、虚拟机安装 参考视频:https://www.bilibili.com/video/BV1dS4y1e7rH?share_sourcecopy_web&vd_source0d57c2e2317ebb16893c37677d1b8931 二、Linux镜像下载 网盘下载地址: 链接:h…

如何设计一个可扩展的登录功能

本文主要分享了如何设计一个可扩展的登录功能。 一、多种登录方式(需要有一个唯一值来绑定各种登录方式,目前业界用的比较多的是手机号) 1.用户名密码登录 最原始的登录方式,这种登录方式与注册功能是分开的,业界慢慢…

网课查题公众号搭建教程(内附接口、源码)

网课查题公众号搭建教程(内附接口、源码) 本平台优点:免费查题接口搭建 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库:题库后台http://daili.j…

Windows11+Ubuntu 3系统如何安全地删掉最后一个Ubuntu系统?

文章目录Windows11Ubuntu 3系统如何安全地删掉最后一个Ubuntu系统?3系统是什么?第一步:删掉Ub16第二步:重启进入grub命令行第三步:从grub命令行中手动启动ubuntu20第四步:进入Windows11更新开机启动项grub配…

LeetCode 0304. 二维区域和检索 - 矩阵不可变

【LetMeFly】304.二维区域和检索 - 矩阵不可变 力扣题目链接:https://leetcode.cn/problems/range-sum-query-2d-immutable/ 给定一个二维矩阵 matrix,以下类型的多个请求: 计算其子矩形范围内元素的总和,该子矩阵的 左上角 为…

3、Android 活动Activity(4)(为活动补充附加信息)

在意图之外给活动添加额外的信息, 首先可以把字符串参数放到字符串资源文件中,待App运行之时再从资源文件读取字符串值; 接着还能在AndroidManifest.xml中给指定活动配置专门的元数据,App运行时即可获取对应活动的元数据信息&…

C#使用winform做一个开关小游戏

成品展示 游戏原理: 游戏时,任意点击一个格子,其自身状态改变,且上下左右四个格子的状态也进行变化,即:原来是开的变成关的,原来是关的变成开的。 制作过程 1.建项目会的吧。 2.设置游戏窗…

TCP重传,滑动窗口,流量控制,拥塞控制

重传机制 超时重传快速重传SACKD-SACK 超时重传 RTT 就是 数据从网络一端传送到另一端所需要的时间,也就是包的往返时间。 超时重传时间以 RTO 表示,应该略大于RTT。 如果超时重发的数据,再次超时时有需要重传,TCP的策略是超…

[需求管理-2]:什么是需求以及需求的收集与识别

目录 第1章 什么是需求识别 第2章 需求的来源 2.1 外部需求(收集) 2.2 内部需求(开发) 第3章 需求的层次 第4章 需求的形式 4.1 提问题(针对业务层次需求、原始性需求):第一性原理 4.2 …

视觉SLAM十四讲_4李群与李代数

本文为b站视频的一个笔记 在SLAM中,我们经常要解下面一个问题 FminJ(T)Σi1N∣∣zi−Tpi∣∣2F minJ(T) \Sigma_{i1}^N||z_i - Tp_i||^2FminJ(T)Σi1N​∣∣zi​−Tpi​∣∣2 这个问题中, T是位姿变量。对于求最小值问题,我们第一步就要求函数对于变量…

Java小白踩坑录上

文章目录1、Java小白踩坑录 - String和char2、Java小白踩坑录 - Random 揭秘3、Java小白踩坑录 - B计划之Java资源如何释放?4、Java小白踩坑录 - 反射到底有多慢?5、Java小白踩坑录 - 数组 & List6、Java小白踩坑录 - Java类型的七十二变揭秘7、Java…

IDEA生成带参数和返回值注解

文章目录步骤说明打开IDEA进入 - 设置 - 编辑器 - 活动模板现象一:IDEA提示悬空的注解现象二:IDEA提示标签说明已丢失使用范围设置注解使用步骤说明 打开IDEA进入点击左上角 - 文件 - 设置 - 编辑器 - 活动模板 新建活动模板 填写模板文本 编辑变量 …

2.canal服务器配置及java客户端

【README】 1.本文总结自 B站《尚硅谷-canal》; 2.canal 介绍,可以参考 GitHub - alibaba/canal: 阿里巴巴 MySQL binlog 增量订阅&消费组件 3. canal服务器配置包括 mysql配置,canal配置等; 4.mysql服务器,ca…

完美且简要,如此输出风控中的重要数据指标曲线(如KS等)

先前,我们用excel给大家演示过一个KS的计算方式。 ks值是在模型中用于区分预测正负样本分隔程度的评价指标。每个样本的预测结果化对应的一个个分数,从最低分到最高分,输出为正负样本的累积分布。Ks值为这个两个正负样本中,最大差…

听吧音乐项目测试

听吧音乐项目 听吧音乐测试1.项目背景2.需求分析2.1 用户需求2.2 软件需求3. 测试点分析及测试用例4. 自动化测试代码4.1 注册登录注销模块自动化测试代码4.2 专辑播放自动化测试代码5. 测试报告1.项目背景 听吧音乐是一个在线听歌网站,游客通过首页可以在线收听其…

WinUI 3 踩坑记:第一个窗口

本文是 WinUI 3 踩坑记 的一部分,该系列发布于 GitHub@Scighost/WinUI3Keng,文中的代码也在此仓库中,若内容出现冲突以 GitHub 上的为准。WinUI 3 应用的入口和 UWP 类似,也是继承自 Application 的一个类,略有不同的是没有 UWP 那么多的启动方式可供重写,只有一个 OnLau…

python计算离散积分

前言 本文是傅立叶及其python应用系列的第一篇文章对应的仓库地址为https://github.com/yuanzhoulvpi2017/tiny_python/tree/main/Fourier_Series 介绍 本篇文章将要介绍一个非常小众的scipy函数:simpson. 这个函数的一大功能就是可以对离散数据积分。之所以要介…

P39 事件处理

P39 事件处理1.事件模型的流程2.事件监听器2.1 动作监听器(ActionListener)2.2 焦点监听器(FocusListener)2.3 鼠标监听器(MouseListener)2.4 鼠标移动/拖动监听器(MouseMotionListener&#xf…

SpringAOP的概述与实现

目录 SpringAOP的概述 什么是AOP AOP能干什么 AOP的特点 AOP底层实现 AOP基本概念 连接点 切入点 通知 切面 目标对象 织入 引入 谈谈你对AOP的理解? SpringAOP的实现 依赖引用 spring.xml配置 注解实现 1.定义切面 设置通知 2.开启aop 3.测试 …