Python: FFT

  • 目的
  • 数据生成
  • FFT
  • 分辨率
  • 总结
  • 引用

目的

本文简述如何使用numpy的fft lib进行快速傅里叶变换,以及对fft变换后结果的分析。由于水平有限,不当之处望指正。

数据生成

使用如下代码生成仿吉他C和弦声音片段,如下代码所示。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inlineimport librosa
import IPython.display as ipdsr = 8000
l = 3t = sr * l
t = np.array(range(0, t)) / sr
x = np.sin(2 * np.pi * 130.81 * t) + 0.8 * np.sin(2 * np.pi * 164.81 * t) + 1.2 * np.sin(2 * np.pi * 196.00 * t)
x = x / max(x)ipd.Audio(x, rate=sr)

上述代码中:

  • 和声的C和弦由C3(130.81HZ), E3(164.81HZ), G3(196.00HZ)组成。
  • G3的音量(1.2)>C3的音量(1.0)>E3(0.8)的音量。
  • 声音的总长度为3秒钟(l变量)。
  • 声音的采样率为8000HZ(sr变量)。
  • 合成的声音进行归一化处理。

FFT

numpy的FFT变换非常简单,使用fft()函数即可。

y = np.fft.fft(x)

所以,如何读懂FFT的返回结果y呢?使用如下代码将FFT的返回结果y映射到频率上即可:

fr = np.array(range(0, len(x))) / l
region = (int)(len(fr) / 2)
plt.plot(fr[0:region], abs(y)[0:region])

  • 首先,type(y)的结果是numpy.darray,由于fft输出的对称性,y[0:1/2] 与y[1/2:1]的数据是冗余的。因此只取结果的前半部分即可。
  • 其次,type(y[0])的结果是numpy.complex128的复数。实部(real)和虚部(imaginary)通过计算可以得到y[0]频率下的振幅(Magnitude)和相位(Phase)[2]。
  • y[0]频率是频率为[ 0, 8000 / len(fr) )的频率范围。以此类推,y[1]频率为[ 8000 / len(y), 2 * 8000 / len(y) )的频率范围。
  • 如果将上图放大看,或者只打印fr, abs(y)中的一部分数据,则上图中的突起部分正好落在C3, E3以及G3频率处。
  • abs(y)只打印复数数组y中的实部。

分辨率

上述使用3秒的数据(24000个点)分析频率特征比较消耗计算时间,也可以通过更少的数据来分析,如下述代码使用1024个采样点。由于采样点变少,而分析的频率范围(0 ~ 8000HZ)不变,因此输出结果的精度降低了。

xslice = x[0:1024]
frslice = np.array(range(0, len(xslice))) / (1024 / 8000)yslice = np.fft.fft(xslice)
cslice = abs(yslice)
plt.plot(frslice[0:100], cslice[0:100])

总结

  • numpy的fft使用很方便,输入一维数组,输出同样大小的一维复数数组。
  • t数组是信号x的时域范围,上例中是0 ~ 3秒。
  • fr数组是变换结果y的频率范围,上例中是0 ~ 8000HZ。

引用

[1] https://www.youtube.com/watch?v=HEcdmDSVHsE&list=PL6rD7wR_ngfnpLFdhbjCTTwRY8PNk6qph&index=3
[2] https://stackoverflow.com/questions/25624548/fft-real-imaginary-abs-parts-interpretation

Python: FFT的输入与输出分析相关推荐

  1. Python 黑箱 :输入与输出-day4

    Python "黑箱" :输入与输出 文章目录 Python "黑箱" :输入与输出 输入输出基础 文件输入与输出 JSON序列化与实战 写在后面 世纪之交的论 ...

  2. python起步输入-Python编程起步——输入与输出

    Python编程起步--输入与输出 通常,任何计算机程序都是为了执行一个特定的任务,比如:统计一个班同学的平均英语成绩,在显示器上画出一个半径为100个像素的红色圆圈,或者在视频播放器上播放一段指定的 ...

  3. Python数据结构与算法(1.3)——Python基础之输入、输出与高阶赋值

    Python数据结构与算法(1.3)--Python基础之输入.输出与高阶赋值 0. 学习目标 1. 输入.输出与注释 1.1 获取用户输入 1.2 格式化输出 1.2.1 基本方法 1.2.2 fo ...

  4. python 字符串的输入和输出

    python 字符串的输入和输出 1.字符串的输入 python中提供了input()函数可以用于接收字符串的输入,默认的标准输入是键盘,并且会将输入内容转化为字符串类型,如需将其转化为整型等数据类型 ...

  5. (入门)python的基本输入和输出

    今天主要为大家详细介绍了python的基本输入和输出,文中示例代码介绍的非常详细,具有一定的参考价值,这也是我们学习python最基本的一步.想要了解更多关于python知识的,请点击这个 目录 Py ...

  6. 【Python核心】输入与输出

    由浅及深讲讲Python的输入和输出 一.输入输出基础 最简单直接的输入来自键盘操作,比如下面这个例子 name = input('your name:') gender = input('you a ...

  7. python编程输入标准-Python中的输入与输出

    一.计算机核心 1.计算机的三大核心为 输入.计算.输出: 2.程序就是指令的集合: 二.python输入与输出 1.简单的来说python作为一种语言,可以编写脚本和程序,那么python就具备输入 ...

  8. python在windows 输入和输出文件_Python文件、目录和输入输出操作

    读取键盘的输入 Python提供了input()内置函数从标准输入读入一行文本,默认的标准输入是键盘.input可以接收一个Python表达式作为输入,并将运算结果返回,如下所示: biotest@b ...

  9. python输入名字-Python基础篇--输入与输出

    在任何语言中,输入和输出都是代码最基础的开始, so,先来聊一聊输入和输出 输出 在python中,我们一般用print() 输出,在括号里输入你想输出的信息,用引号包裹起来(单双三都可以),例如我们 ...

最新文章

  1. entity、model和domain三者区别
  2. 深度学习(三)转-可视化理解卷积神经网络 直接查看卷积神经网络的过程特征...
  3. 查看服务器文件夹,远程查看服务器文件夹内的文件夹
  4. ubuntu安装软件
  5. time(null)的用法
  6. 成都女学霸高考 692 分想当“程序媛”,网友:快劝劝孩子
  7. UITableView的cell重用优化
  8. 诺顿企业版Symantec AntiVirus病毒库更新慢的解决办法
  9. C语言求n的阶乘(n!)
  10. flask_web 蓝本基模板继承问题
  11. python面向对象实验一之烤地瓜
  12. 失传千年AE特效真经(二)
  13. APP开发者如何来实现视频聊天室功能
  14. 对全文检索引擎xapian的学习(一)---索引
  15. stm32C8t6 通用定时器输出PWM+定时中断控制板载LED
  16. 排序之路:快速排序和木桶排序
  17. android端蓝牙控制单片机,android 蓝牙控制继电器——单片机控制端
  18. 沃谈小知识丨通俗科普4G、5G CPE
  19. JEE项目分层结构与MVC
  20. Python求出0-100之间的素数

热门文章

  1. 两个镂空三角形图案输出
  2. 水经微图下载与安装教程
  3. 甜品烘焙店用什么收银软件好
  4. pycharm安装Open3D库失败解决小全笔记--Could not find a version that satisfies the requirement
  5. realme v3 怎么样
  6. 机器学习评估指标汇总:准确率(Precision)、召回率(Recall)、F值(F-Measure)、ROC曲线、PR曲线
  7. Linux-解决tar解压文件时报错“gzip: stdin: not in gzip format”
  8. css 文字垂直居中
  9. 大可乐android 4.3刷机包,4.2系统+高实用性可乐OS界面_大可乐 大可乐3(3GB RAM/移动4G)_手机Android频道-中关村在线...
  10. ThinkPHP5生成支付二维码