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

使用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 generationsns.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.hqwc.cn/news/217994.html

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

相关文章

计算机中由于找不到vcruntime140.dll无法继续执行代码无法打开软件怎么解决分享

关于如何解决vcruntime140.dll无法继续执行代码的6个教程。在这个科技日新月异的时代,电脑已经是我们日常和工作中必不可少的电子产品,然后我们在使用过程中经常会遇到不一样的问题,比如vcruntime140.dll文件丢失,那么vcruntime14…

2017年4月10日 Go生态洞察:开发者体验工作组介绍

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

Yakit工具篇:WebFuzzer模块之热加载技术

简介 官方定义: 什么是热加载? 广义上来说,热加载是一种允许在不停止或重启应用程序的情况下,动态加载或更新特定组件或模块的功能。这种技术常用于开发过程中,提高开发效率和用户体验。 在Yakit 的Web Fuzzer中&…

Unity机器学习 ML-Agents第一个例子

上一节我们安装了机器学习mlagents的开发环境,本节我们创建第一个例子,了解什么是机器学习。 我们的例子很简单,就是让机器人自主移动到目标位置,不能移动到地板范围外。 首先我们来简单的了解以下机器学习的过程。 机器学习的过…

Nodejs 第二十章(fs 上)

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

【Flutter】设置顶部状态栏的显示、隐藏、半透明灰色显示

【Flutter】设置顶部状态栏的显示、隐藏、半透明灰色显示 设置方法: // 这种模式不现实状态栏 SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky); // 这种模式显示状态栏 SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge); // 修…

鸿蒙(HarmonyOS)应用开发——生命周期、渲染控制、状态管理装饰器

生命周期 任何程序都是有一定的生命周期的。生命周期是记录从产生到销毁的过程;如果熟悉前端vue.js的话,就可以很好的理解生命周期。 自定义组件生命周期 ArkTS中,自定义组件提供了两个生命周期函数:aboutToAppear() 和aboutTo…

JVM虚拟机:G1垃圾回收器的日志分析

本文重点 本文我们将学习G1垃圾回收器的日志 使用 执行命令 java -Xms20M -Xmx20M -XX:PrintGCDetails -XX:UseG1GC 类名 分析 前面我们学习了G1垃圾回收器,它的回收有三种可能: YGC FGC MixedGC GC pause表示STW,Evacuation表示复制对象,…

DBeaver连接Oracle时报错:Undefined Error

连接信息检查了很多遍,应该是没问题的,而且驱动也正常下载了,但是就是连不上。 找了好久,终于找到一个可用的方式了,记录一下。 在安装目录修改dbeave.ini文件,最后一行添加 -Duser.nameTest。重启就可以…

物联网后端个人第十二周总结

学习工作进度 物联网方面 1.模拟设备通过规则引擎将数据通过mqtt进行转发 在物联网平台上实现模拟设备通过规则引擎将数据通过mqtt进行转发已经全部完成了,所使用的物联网平台在这方面有不少的问题和bug,也可能是没有按照开发者的想法对平台进行使用才导…

上手 Promethus - 开源监控、报警工具包

名词解释 Promethus 是什么 开源的【系统监控和警报】工具包 专注于: 1)可靠的实时监控 2)收集时间序列数据 3)提供强大的查询语言(PromQL),用于分析这些数据 功能: 1&#xff0…

Linux学习记录

Linux 文章目录 LinuxLinux发行版Debian 分支Red Hat 分支Arch Linux 分支 服务器基础操作lscat和less设置权限删除文件和目录搜索文件 cmake使用文件 Linux发行版 一个典型的 Linux 发行版除了 Linux 内核以外,通常还会包括一系列 GNU 工具和库、一些附带的软件、…