python:傅里叶分析,傅里叶变换 FFT

news2024/11/19 20:44:21

使用python进行傅里叶分析,傅里叶变换 FFT  的一些关键概念的引入:

1.1.离散傅里叶变换(DFT)
    离散傅里叶变换(discrete Fourier transform) 傅里叶分析方法是信号分析的最基本方法,傅里叶变换是傅里叶分析的核心,经过它把信号从时间域变换到频率域,进而研究信号的频谱结构和变化规律。可是它的致命缺点是:计算量太大,时间复杂度过高,当采样点数过高的时候,计算缓慢,由此出现了DFT的快速实现,即下面的快速傅里叶变换FFT。
1.2.快速傅里叶变换(FFT)
    计算量更小的离散傅里叶的一种实现方法。快速傅氏变换(FFT),是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。
1.3.采样频率以及采样定率
采样频率,也称为采样速度或者采样率,定义了每秒从连续信号中提取并组成离散信号的采样个数,它用赫兹(Hz)来表示。采样频率的倒数是采样周期或者叫做采样时间,它是采样之间的时间间隔。通俗的讲采样频率是指计算机每秒钟采集多少个信号样本。

采样定理 ,又称香农采样定理,奈奎斯特采样定理,是信息论,特别是通信与信号处理学科中的一个重要基本结论。采样定理指出,若是信号是带限的,而且采样频率高于信号带宽的两倍,那么,原来的连续信号能够从采样样本中彻底重建出来。

1.4.如何理解采样定理
    在对连续信号进行离散化的过程当中,不免会损失不少信息,就拿一个简单地正弦波而言,若是我1秒内就选择一个点,很显然,损失的信号太多了,光着一个点我根本不知道这个正弦信号究竟是什么样子的,天然也没有办法根据这一个采样点进行正弦波的还原,很明显,我采样的点越密集,那越接近原来的正弦波原始的样子,天然损失的信息越少,越方便还原正弦波。

采样定理说明采样频率与信号频率之间的关系,是连续信号离散化的基本依据。 它为采样率创建了一个足够的条件,该采样率容许离散采样序列从有限带宽的连续时间信号中捕获全部信息。
编写 test_fft_1.py 如下

# -*- coding: utf-8 -*-
""" 使用scipy包实现快速傅里叶变换 """
import numpy as np
from scipy.fftpack import fft, ifft
import matplotlib.pyplot as plt
from matplotlib.pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
mpl.rcParams['axes.unicode_minus'] = False   #显示负号

# 采样点选择1400个,由于设置的信号频率份量最高为600赫兹,根据采样定理知采样频率要大于信号频率2倍,
# 因此这里设置采样频率为1400赫兹(即一秒内有1400个采样点,同样意思的)
x = np.linspace(0,1,1400)
#设置须要采样的信号,频率份量有200,400和600
y = 7*np.sin(2*np.pi*200*x) + 5*np.sin(2*np.pi*400*x) + 3*np.sin(2*np.pi*600*x)
fft_y = fft(y) #快速傅里叶变换
N= 1400
x = np.arange(N) # 频率个数
half_x = x[range(int(N/2))] #取一半区间
abs_y = np.abs(fft_y) # 取复数的绝对值,即复数的模(双边频谱)
angle_y = np.angle(fft_y) #取复数的角度
normalization_y = abs_y/N #归一化处理(双边频谱)
normalization_half_y = normalization_y[range(int(N/2))] #因为对称性,只取一半区间(单边频谱)
plt.subplot(231)
plt.plot(x,y) 
plt.title('原始波形')
plt.subplot(232)
plt.plot(x,fft_y,'black')
plt.title('双边振幅谱(未求振幅绝对值)',fontsize=9,color='black')
plt.subplot(233)
plt.plot(x,abs_y,'r')
plt.title('双边振幅谱(未归一化)',fontsize=9,color='red')
plt.subplot(234)
plt.plot(x,angle_y,'violet')
plt.title('双边相位谱(未归一化)',fontsize=9,color='violet')
plt.subplot(235)
plt.plot(x,normalization_y,'g')
plt.title('双边振幅谱(归一化)',fontsize=9,color='green')
plt.subplot(236)
plt.plot(half_x,normalization_half_y,'blue')
plt.title('单边振幅谱(归一化)',fontsize=9,color='blue')
plt.show()

运行 python test_fft_1.py


傅里叶定理指出,任何频率为f0的周期信号都可以通过将频率为f0,2f0,3f0,4f0,5f0等的“正弦波”(正弦波)相加而精确地构建。将周期时域信号分割为正弦波称为傅里叶分析。
“傅里叶级数”中的每个正弦曲线的特征在于频率振幅,以及阶段f0被称为基频。
2f0、3f0、4f0等被称为谐波。

编写 test_sawtooth.py 如下

# -*- coding: utf-8 -*-
"""使用scipy中的 sawtooth()生成了频率为f=200Hz的锯齿信号,持续时间为2秒。"""
import matplotlib.pyplot as plt  # plotting
import seaborn as sns            # styling (uncomment if you want)
import numpy as np
from scipy import signal as sig     # for easy sawtooth signal generation

sns.set()
fs=8000                   # sampling frequency
t = np.arange(0, 2, 1/fs) # time vector
f = 200                   # frequency in Hz for scipy sawtooth
saw_tooth = sig.sawtooth(2 * np.pi * f * t)
# plot first 20 ms (=160 samples at sampling frequency of 8000 Hz)
plt.subplot(1,2,1)
plt.plot(t[0:160], saw_tooth[0:160], '--', label='scipy sawtooth')
plt.xlabel('time $t$ in seconds')
plt.ylabel('$x(t)$')
plt.legend()

# calculate the spectum (frequency domain representation)
FFT_length = 2**15 # take a power of two which is larger than the signal length
f = np.linspace(0, fs/2, num=int(FFT_length/2+1))
spectrum = np.abs(np.fft.rfft(saw_tooth, n=FFT_length))
# plot the spectrum
plt.subplot(1,2,2)
plt.plot(f,spectrum)
plt.xlabel('frequency $f$ in Hz')
plt.ylabel('$x(f)$')
plt.tight_layout() # this allowes for some space for the title text.
plt.show()

运行 pytho test_sawtooth.py

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库设计规范(收藏)

本文的目的是提出针对Oracle数据库的设计规范,使利用Oracle数据库进行设计开发的系统严格遵守本规范的相关约定,建立统一规范、稳定、优化的数据模型。 参照以下原则进行数据库设计: 方便业务功能实现、业务功能扩展;方便设计开发…

爪语言 之 如何处理Java异常?

以小我融入大我,青春献给祖国 目录 1.异常的概念与体系 1.1异常的概念 1.2 异常的体系 1.3 异常的分类 2. 异常的处理 2.1 防御式编程 2.2异常的抛出 2.3 异常的捕获 2.3.1 异常声明throws 2.3.2 try-catch捕获并处理 2.3.3 finally 2.4 异常的处理流程总结 3. 自定…

Jmeter性能综合实战——签到及批量签到

提取性能测试的三个方面:核心、高频、基础功能 签 到 请 求 步 骤 1、准备工作: 签到线程组 n HTTP请求默认值 n HTTP cookie 管理器 n 首页访问请求 n 登录请求 n 查看结果树 n 调试取样器 l HTTP代理服务器 (1)创建线…

h5小游戏--2048

2048 经典2048小游戏,基于JS、Html5改写版 效果预览 点我下载源代码 下载代码解压后,双击index.html即可开始本游戏。 Game Rule 游戏规则 以下为游戏默认规则,若需要修改规则请修改代码。 移动箭头键来移动方块,当两个相同数…

一定要会用selenium的等待,三种等待方式解读

​很多人问,这个下拉框定位不到、那个弹出框定位不到…各种定位不到,其实大多数情况下就是两种问题: 有frame 没有加等待 殊不知,你的代码运行速度是什么量级的,而浏览器加载渲染速度又是什么量级的,就好…

【cf 158 c】

给你一个整数数组 a1,a2,…,an ( )。在一次操作中,你可以选择一个整数 x ( ),并用 ⌊⌋ 替换 ai ( ⌊y⌋ 表示将 y 舍入为最接近的整数)。 来替换从 1 到 n 的所有 i。请注意,每次操作都会影响数组中的所有元素。打印使数组中所有元素相等所…

SparkSQL之Optimized LogicalPlan生成过程

经过Analyzer的处理,Unresolved LogicalPlan已经解析成为Analyzed LogicalPlan。Analyzed LogicalPlan中自底向上节点分别对应Relation、Subquery、Filter和Project算子。   Analyzed LogicalPlan基本上是根据Unresolved LogicalPlan一对一转换过来的,…

小白也能看得懂的Jmeter性能测试中服务端资源监控技术

操作步骤: 1、安装插件管理器 插件管理器的作用:可以提供扩展插件的在线安装升级和卸载。因为我们需要在线安装监控插件,首先我们就要先安装插件管理器。 插件管理器的下载地址:https://jmeter-plugins.org/install/Install/ 如…

ESP32网络开发实例-远程Web串口监视器

远程Web串口监视器 文章目录 远程Web串口监视器1、应用介绍2、软件准备3、硬件准备4、代码实现在本文中,我们将构建一个 ESP32 网络服务器,用作远程串行监视器。 基于 Web 的串行监视器的工作方式与通常用于调试目的的 Arduino IDE 串行监视器的工作方式相同。 1、应用介绍 …

信息检索策略和技巧

指定检索策略并检索 确定检索词 检索课题:查找与“新型冠状病毒疫苗研制进展”有关的学术论文 检索式(2019-nCoV or 2019新型冠状病毒 or nCov-2019 or SARS-CoV-2 or COVID-19) and (疫苗 or 预防针 or 防疫针 or vaccin or vaccine) 扩展检索词的方式 同义词…

人工智能轨道交通行业周刊-第66期(2023.11.20-11.26)

本期关键词:智能铁鞋、TFDS、道岔密贴检查、Agent、Q*假说 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro轨道世界铁路那些事铁路…

JVM字节码文件的相关概述解读

Java全能学习面试指南:https://javaxiaobear.cn 1、字节码文件 从下面这个图就可以看出,字节码文件是可以跨平台使用的 想要让一个Java程序正确地运行在JVM中,Java源码就必须要被编译为符合JVM规范的字节码。 https://docs.oracle.com/java…

【Leetcode合集】1457. 二叉树中的伪回文路径

1457. 二叉树中的伪回文路径 1457. 二叉树中的伪回文路径 代码仓库地址: https://github.com/slience-me/Leetcode 个人博客 :https://slienceme.xyz 给你一棵二叉树,每个节点的值为 1 到 9 。我们称二叉树中的一条路径是 「伪回文」的&am…

Nodejs 第二十章(fs 上)

概述 在 Node.js 中,fs 模块是文件系统模块(File System module)的缩写,它提供了与文件系统进行交互的各种功能。通过 fs 模块,你可以执行诸如读取文件、写入文件、更改文件权限、创建目录等操作,Node.js …

【腾讯云云上实验室】向量数据库相亲社交应用实践

快速入口 👉向量数据库_大模型知识库_向量数据存储_向量数据检索- 腾讯云 (tencent.com) 文章目录 前言1. 向量数据库概念及原理1.1 向量数据库概念1.2 向量数据库核心原理1.3 向量数据库优缺点1.4 向量数据库与传统数据库的区别 2. 腾讯云向量数据库的基本特性及优…

为什么,word文件在只读模式下,仍然能编辑?

Word文档设置了只读模式,是可以编辑的,但是当我们进行保存的时候就会发现,word提示需要重命名并选择新路径才能够保存。 这种操作,即使可以编辑文字,但是原文件是不会受到影响的,编辑之后的word文件会保存到…

竞赛选题 题目:基于卷积神经网络的手写字符识别 - 深度学习

文章目录 0 前言1 简介2 LeNet-5 模型的介绍2.1 结构解析2.2 C1层2.3 S2层S2层和C3层连接 2.4 F6与C5层 3 写数字识别算法模型的构建3.1 输入层设计3.2 激活函数的选取3.3 卷积层设计3.4 降采样层3.5 输出层设计 4 网络模型的总体结构5 部分实现代码6 在线手写识别7 最后 0 前言…

Spring 拾枝杂谈—Spring原生容器结构剖析(通俗易懂)

目录 一、前言 二、Spring快速入门 1.简介 : 2. 入门实例 : 三、Spring容器结构分析 1.bean配置信息的存储 : 2.bean对象的存储 : 3.bean-id的快捷访问 : 四、总结 一、前言 开门见山,11.25日开始我们正式进入Java框架—Spring的学习,此前&…

midjourney过时了?如何使用基于LCM的绘图技术画出你心中的画卷。

生成 AI 艺术在近年来迅速发展,吸引了数百万用户。然而,传统的生成 AI 艺术需要等待几秒钟或几分钟才能生成,这对于快节奏的现代社会来说并不理想。 近日,中国清华大学和 AI 代码共享平台 HuggingFace 联合开发了一项新的机器学习…

群晖NAS基础设置

群晖NAS基础设置 最近一直在玩群晖NAS系统,有一些基础的配置跟大家分享一下 开启ssh登录 1.开启方法 控制面板—>终端和SNMP—>终端机 2.使用ssh软件登录 这里我用SecureCRT登录 进入ssh 3.进入root用户 starstar-nas:~$ sudo su -l root Password: ro…