傅里叶变换的python实现

news2024/9/28 12:02:46

周期信号的频谱
  为了能既方便又明白地表示一个信号在不同频率下的幅值和相位,可以采用成为频谱图的表示方法。
  在傅里叶分析中,把各个分量的幅度|Fn|或 Cn 随着频率nω1的变化称为信号的幅度谱。
  而把各个分量的相位 φn 随角频率 nω1 变化称为信号的相位谱。
  幅度谱和相位谱通称为信号的频谱。
  三角形式的傅里叶级数频率为非负的,对应的频谱一般称为单边谱;指数形式的傅里叶级数频率为整个实轴,所以称为双边谱。
  下面以周期信号函数作为示范,看看傅里叶级别函数应该怎么画相位谱和幅度谱
  周期函数:
  在这里插入图片描述

函数相应的分量幅度:
在这里插入图片描述

最终傅里叶级数函数的单边图、双边图、相位谱、幅度谱,如下图所示:
这里写图片描述
在Python中,fft(快速傅里叶变换)算法是在NumPy库中实现的。要使用fft函数,需要首先导入NumPy库。以下是示例代码:

import numpy as np

# 创建一个测试信号
t = np.arange(0, 1, 0.001)  # 时间轴
f = 5  # 频率
x = np.sin(2 * np.pi * f * t)

# 进行快速傅里叶变换
X = np.fft.fft(x)

# 获取频谱信息
frequencies = np.fft.fftfreq(len(t), 1/1000)  # 获取频率轴
amplitudes = np.abs(X)  # 获取振幅谱

# 输出结果
for freq, amp in zip(frequencies, amplitudes):
    print(“频率: {:.2f} Hz, 振幅: {:.2f}.format(freq, amp))

在上述代码中,我们首先导入numpy库,并创建一个测试信号(正弦波)。然后,使用np.fft.fft函数对信号进行快速傅里叶变换,得到频谱信息。最后,我们通过np.fft.fftfreq函数获取频率轴,并使用np.abs函数获取振幅谱。在输出结果时,我们遍历频率和振幅,并将其格式化输出。

值得注意的是,如果需要进行逆变换,可以使用np.fft.ifft函数。此外,还可以使用np.fft.fftshift函数将频谱进行频移,以方便在频率轴上显示。
Python的FFT(快速傅立叶变换)函数可以在SciPy包中找到。SciPy是一个基于Python的科学计算库,提供了许多数值计算、优化、插值和统计函数。FFT是其中一个核心功能之一。

下面是关于Python的FFT的一些详细信息:

  1. 导入包:要使用Python中的FFT函数,首先需要导入相关的包。可以使用以下代码导入SciPy包中的FFT函数:
  from scipy.fft import fft

上述代码将从SciPy包中导入FFT函数,该函数是基于FFTPACK库实现的。

  1. FFT函数:scipy.fft.fft函数用于计算一维实输入序列的傅立叶变换。FFT函数采用一个一维数组作为输入,并返回一个包含频率分量的复数数组。以下是FFT函数的基本语法:
   scipy.fft.fft(x, n=None, axis=-1, norm=None)

参数x是输入数据序列,n是输出FFT序列的长度(默认为x的长度),axis是作用的轴(默认为最后一个维度),norm是归一化方式(默认为不归一化)。

  1. FFT输出:FFT函数将计算出的FFT序列作为输出,其中包含了输入序列在不同频率下的振幅和相位信息。输出的数据类型是复数数组,由于FFT对称性,输出数组中的前半部分表示正频率分量,后半部分表示负频率分量。

  2. 频谱分析:使用FFT函数可以进行频谱分析,从而提取信号的频率信息。频率分量对应于FFT输出数组的索引位置,可以通过计算频率分辨率(采样频率除以FFT长度)确定频率轴上的单位。可以使用如下代码使用FFT进行简单的频谱分析:

  import numpy as np
   import matplotlib.pyplot as plt

   # 生成信号
   fs = 1000  # 采样频率
   t = np.arange(0, 1, 1/fs)  # 时间轴
   f = 10  # 信号频率
   x = np.sin(2*np.pi*f*t)  # 输入信号

   # 计算FFT
   X = fft(x)

   # 绘制频谱图
   freq = np.fft.fftfreq(len(x), 1/fs)  # 计算频率轴
   plt.plot(freq, np.abs(X))  # 绘制频率谱
   plt.xlabel(‘Frequency [Hz])
   plt.ylabel(‘Amplitude’)
   plt.show()
  1. 高级FFT功能:除了基本的FFT函数外,SciPy还提供了其他一些与FFT相关的函数,包括rfft函数(用于计算实输入序列的傅立叶变换)、fftshift函数(用于将FFT输出移动到中心)、ifft函数(用于计算逆傅立叶变换)等。这些函数可根据具体需求进行使用。

在实际应用中,FFT的应用非常广泛,包括音频信号处理、图像处理、信号滤波、频谱分析、信号合成等领域。Python的FFT函数提供了简单而高效的FFT实现,可以方便地进行频率域分析和信号处理。

在Python中,FFT(快速傅里叶变换)算法通常位于科学计算库的NumPy包或者SciPy包中。

NumPy是一个基于Python的科学计算库,提供了强大的多维数组对象和广播功能,以及用于快速操作数组的工具。在NumPy中,FFT算法被实现在numpy.fft模块中。

SciPy是一个基于NumPy的库,提供了许多科学计算的函数和工具。在SciPy中,FFT算法也被实现在scipy.fftpack子模块中。

在使用FFT算法之前,需要先安装相应的库。可以通过以下命令在命令行中安装NumPy和SciPy:

pip install numpy
pip install scipy

下面,我们来看一下在实际代码中如何使用FFT算法。

首先,导入所需的库:

import numpy as np
from scipy.fft import fft

接下来,准备输入数据。FFT算法要求输入的数据是一个一维数组,通常表示为复数形式。假设我们有一个实数序列x,我们可以使用NumPy的array函数将其转换为合适的形式:

x = np.array([1.0, 2.0, 1.0, -1.0, 3.0, 0.5])
x_complex = x.astype(complex)

然后,我们可以使用FFT算法对输入数据进行变换:

X = fft(x_complex)

得到的结果X也是一个一维数组,表示了输入数据的频域表示。我们可以使用NumPy的abs函数来计算幅度谱(频域中对应频率的振幅):

X_mag = np.abs(X)

如果我们只对输入数据的一部分进行变换,可以使用NumPy的切片操作:

N = len(x_complex)  # 输入数据的长度
n = 3  # 变换数据的数量
X_partial = fft(x_complex[:n])

除了正向变换之外,我们还可以进行逆变换以恢复原始数据。逆变换的结果将是复数形式的,但实部可以近似等于原始数据。我们可以使用NumPy的real函数来提取实部:

x_recovered = np.real(ifft(X))

以上就是在Python中使用FFT算法的一般步骤和操作流程。根据实际需求,可能还需要进行一些额外的处理和操作,如频域滤波、频谱绘制等。不过,掌握了以上基本方法,就能够在Python中使用FFT算法进行快速傅里叶变换了。

import numpy as np
from scipy.fftpack import fft, fftshift
 
# 创建一个简单的1秒钟的正弦波信号,采样率为44.1kHz
sample_rate = 44100
t = np.linspace(0, 1, sample_rate)
frequency = 440  # 音调的频率为440Hz
 
# 生成正弦波信号
signal = np.sin(2 * np.pi * frequency * t)
 
# 执行傅里叶变换
fft_signal = fft(signal)
 
# 将DC分量移动到频谱的中心
fft_shifted = fftshift(fft_signal)
 
# 计算幅度谱和相位谱
magnitude = np.abs(fft_shifted)
phase = np.angle(fft_shifted)
 
# 计算频率轴
frequency_axis = np.fft.fftfreq(sample_rate, 1 / sample_rate)
 
# 打印结果
print("频率轴:", frequency_axis[:len(frequency_axis) // 2 + 1])
print("幅度谱:", magnitude[:len(magnitude) // 2 + 1])
print("相位谱:", phase[:len(phase) // 2 + 1])

在这个例子中,我们首先创建了一个简单的正弦波信号,然后使用scipy.fftpack中的fft函数进行傅里叶变换。fftshift用于将频谱的直流分量移动到频谱的中心,以便于更好地观察频率成分。然后,我们计算幅度谱和相位谱,并且生成频率轴。

参考文献:
https://blog.csdn.net/u014792561/article/details/78662381
https://worktile.com/kb/ask/93595.html

附录:

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

# 示例信号生成
def generate_signal(freq1, freq2, duration, sample_rate):
    t = np.linspace(0, duration, int(sample_rate * duration), endpoint=False)
    signal = (np.sin(2 * np.pi * freq1 * t) + 0.5 * np.sin(2 * np.pi * freq2 * t))
    return t, signal

# 拉普拉斯变换的定义
def laplace_transform(func, t):
    result, _ = quad(lambda s: func(s) * np.exp(-s * t), 0, np.inf)
    return result

# 生成信号
duration = 1.0  # 持续时间1秒
sample_rate = 1000  # 采样率1000Hz
freq1 = 5  # 频率1
freq2 = 50  # 频率2

t, signal = generate_signal(freq1, freq2, duration, sample_rate)

# 傅里叶变换
N = len(signal)
yf = fft(signal)
xf = np.fft.fftfreq(N, 1/sample_rate)[:N//2]
amplitude_spectrum = 2.0/N * np.abs(yf[:N//2])
power_spectrum = amplitude_spectrum**2
phase_spectrum = np.angle(yf[:N//2])

# 拉普拉斯变换示例
t_values = np.linspace(0, duration, 100)
laplace_results = []
for t_val in t_values:
    index = int(t_val * sample_rate)
    if index < N:  # 确保索引不超出范围
        laplace_results.append(laplace_transform(lambda s: signal[index], t_val))
    else:
        laplace_results.append(0)  # 超出范围时设为0或其他处理

image_path = f'filter_image_data2/傅里叶变换+拉普拉斯变换-功率谱.png'
# 可视化
plt.figure(figsize=(15, 15))

# 原始信号
plt.subplot(5, 1, 1)
plt.plot(t, signal)
plt.title('Original Signal')
plt.xlabel('Time [s]')
plt.ylabel('Amplitude')
plt.grid()

# 傅里叶变换结果
plt.subplot(5, 1, 2)
plt.plot(xf, amplitude_spectrum)
plt.title('Magnitude Spectrum')
plt.xlabel('Frequency [Hz]')
plt.ylabel('Magnitude')
plt.grid()

# 功率谱
plt.subplot(5, 1, 3)
plt.plot(xf, power_spectrum)
plt.title('Power Spectrum')
plt.xlabel('Frequency [Hz]')
plt.ylabel('Power')
plt.grid()

# 相位谱
plt.subplot(5, 1, 4)
plt.plot(xf, phase_spectrum)
plt.title('Phase Spectrum')
plt.xlabel('Frequency [Hz]')
plt.ylabel('Phase [radians]')
plt.grid()

# 拉普拉斯变换结果
plt.subplot(5, 1, 5)
plt.plot(t_values, laplace_results)
plt.title('Laplace Transform of the Signal')
plt.xlabel('t')
plt.ylabel('Laplace Transform Value')
plt.grid()

plt.tight_layout()
plt.savefig(image_path)
plt.close()

在这里插入图片描述

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

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

相关文章

ZUploader 之 文件上传

文件上传是前端开发很常用的一个功能, 通常文件上传都是异于表单提交, 使用起来配置繁多, 校验不统一, 展示不统一。 效果对比 特点 简化使用数据双向绑定样式统一带预览和下载功能 依赖 封装的组件 FileViewDialog (文件预览与下载,不需要此功能的话,可删除) 文件返回接口…

用户体验分享 | YashanDB V23.2.3安装部署

近期崖山新版体验过程中&#xff0c;总能看到用户提问&#xff1a;openssl版本问题、monit命令找不到问题、yashan用户权限问题、数据库重装问题 今日整理了多位用户的安装经验&#xff0c;希望能够帮助到大家~ 1.Lucifer三思而后行 &#xff1a;YashanDB 个人版数据库安装部…

稳居赛道销量前三的制造业巨头:数据安全建设的高效实践

作为一家迅速扩展的全球化制造企业&#xff0c;我们的分支和业务遍布国内多个城市及海外&#xff0c;员工流动频繁&#xff0c;终端设备多样&#xff0c;研发流程复杂。因此&#xff0c;我们需要一个灵活且强大的数据安全策略。经过深入的市场调研和严格POC测试&#xff0c;我们…

使用Postman搞定各种接口token实战

现在许多项目都使用jwt来实现用户登录和数据权限&#xff0c;校验过用户的用户名和密码后&#xff0c;会向用户响应一段经过加密的token&#xff0c;在这段token中可能储存了数据权限等&#xff0c;在后期的访问中&#xff0c;需要携带这段token&#xff0c;后台解析这段token才…

虚拟机的安装和使用

一、虚拟机的简单介绍 虚拟机可以使你在一台机器上同时运行二个或更多Windows、LINUX等系统&#xff0c;它可以模拟一个标准PC环境。这个环境和真实的计算机一样&#xff0c;都有芯片组、CPU、内存、显卡、声卡、网卡、软驱、硬盘、光驱、串口、并口、USB控制器等。 二、虚拟机…

案例|高动态厘米级监测!广东这些长大桥有了北斗“守护者”

随着桥梁交通流量快速提升&#xff0c;加上受到恶劣使用环境、荷载作用、年限过长等因素影响&#xff0c;近年来&#xff0c;因桥梁损害引发的安全事故时有发生。伴随着传感设备、数字通讯网络、数据分析方法等新技术和新设备的发展&#xff0c;为桥梁管养提供了更多有效的检测…

09_行级锁的加锁流程

MySQL 的加锁流程 文章目录 MySQL 的加锁流程简介记录锁、间隙锁和临键锁概述行级锁加锁流程示例流程两个原则&#xff0c;两个优化&#xff0c;一个 BUG两个原则两个优化一个 BUG示例1-主键&#xff08;唯一&#xff09;索引示例 2-普通索引 总结 简介 在 MySQL InnoDB 存储引…

理解C语言之深入理解指针(三)

目录 1. 字符指针变量 2. 数组指针变量 2.1 数组指针变量是什么&#xff1f; 2.2 数组指针变量怎么初始化 3. ⼆维数组传参的本质 4. 函数指针变量 4.1 函数指针变量的创建 4.2 函数指针变量的使⽤ 4.3 两段有趣的代码 4.3.1 typedef 关键字 5. 函数指针数组 6. 转移…

Linux递归找出目录下最近被修改文件(最近一段时间内被修改过的最新文件)(最近修改文件、最新文件、查找文件)(监控目录、监控mysql文件)

文章目录 命令1&#xff1a;找出目录下最近60分钟内修改的最新文件命令解析&#xff1a; 命令2&#xff1a;找出目录下最近60分钟内修改的最新n个文件 命令1&#xff1a;找出目录下最近60分钟内修改的最新文件 find /ky_data/mysql -type f -mmin -60 -exec ls -ltr {} | tai…

【LeetCode每日一题】——LCP 51.烹饪料理

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 回溯 二【题目难度】 简单 三【题目编号】 LCP 51.烹饪料理 四【题目描述】 欢迎各位勇者来…

【工具分享】NoWay勒索病毒解密工具

前言 NoWay勒索软件首次出现在2023年&#xff0c;并迅速引起了网络安全领域的关注。它是一种典型的加密勒索软件&#xff0c;主要通过恶意电子邮件附件或不安全的下载链接传播。一旦成功感染系统&#xff0c;NoWay会加密受害者的文件&#xff0c;并要求支付赎金以恢复文件访问…

Redis(初步认识和安装)

初识Redis 认识NoSQLSQL结构化&#xff1a;structure关联的&#xff1a;RelationalSQL查询ACID NoSQL非结构化无关联的非SQLBASE 认识Redis安装Redis 认识NoSQL SQL和NoSQL比较 SQL 结构化&#xff1a;structure 数据库中表的字段都有固定的结构 关联的&#xff1a;Relati…

【c语言数据结构】栈的详解! 超级详细!(模拟实现,OJ练习题)

栈的概念&#xff1a; 栈&#xff1a;像是一种容器&#xff0c;东西只能从一个地方进&#xff0c;一个地方出&#xff0c;且后进先出&#xff01;这是其和队列&#xff08;先进先出&#xff0c;像排队一样&#xff0c;先到先得&#xff09;的本质区别 ⼀种特殊的线性表&#…

“JY901传感器“学习笔记

目录 一、产品概述 二、产品功能介绍 2.1、轴向说明 2.2、模块校准 2.3、姿态角 2.4、大地坐标系、地心地固坐标系、站心坐标系 三、参考文献 一、产品概述 模块集成高精度的陀螺仪、加速度计、地磁场传感器&#xff0c;采用高性能的微处理器和先进的动力解算与卡尔曼动…

两种不同方式实现交换机路由器的登录Console+Telnet的实现

一、背景及原理 1.Telnet 作为一种远程登录协议,1969年发明诞生于美国国防部高级研究计划局网络工作小组的研究员,Tenlet的出现为后续相关技术的发展奠定了基础。 2.Telnet通常用于远程登录应用中,对本地和远端进行网络设备配置、监控、维护,可以通过Telnet方式在一台设备…

博睿数据受邀亮相NebulaGraph Meetup北京站

9 月 21 日&#xff0c;北京站 nMeetup 如期而至&#xff0c;一场以 GraphRAG 和人工智能技术融合为主题的开发者聚会&#xff0c;在金秋的首都拉开帷幕。8 位讲师和 140 多位来自五湖四海的行业伙伴们相聚一堂&#xff0c;共同探讨 GraphRAG & AI 的最新发展和应用实践&am…

卷轴模式:一种新型的电子商务营销策略

随着电子商务行业的蓬勃发展&#xff0c;各类创新营销策略层出不穷&#xff0c;旨在吸引更多消费者并提升销售额。在这之中&#xff0c;卷轴模式以其独特的优势和可观的收益逐渐受到业界renxb001的关注。本文将深入探讨卷轴模式的概念、优势、应用场景以及如何参与其中。 卷轴…

关联式容器——map与set

map与set map与set的使用序列式容器与关联式容器概念序列式容器 (Sequence Containers)常见的序列式容器&#xff1a; 关联式容器 (Associative Containers)常见的关联式容器&#xff1a; set的定义与使用set类的介绍set的构造和迭代器set的增删查&#xff08;无改&#xff09;…

Ego微商小程序项目实战4.0【环境搭建】

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/cat…

自动化测试框架集成:将Selenium集成到pytest与unittest中

目录 引言 一、Selenium简介 二、Selenium与pytest的集成 1. 安装pytest和Selenium 2. 编写测试用例 3. 运行测试 三、Selenium与unittest的集成 1. 编写测试类 2. 运行测试 四、Selenium自动化测试的最佳实践 1. 使用Page Object模式 2. 合理利用等待机制 3. 跨浏…