numpy的快速傅里叶变换
快速傅里叶变换(fft)
什么是傅里叶变换?
傅里叶定理: 任何一条周期曲线, 无论多么跳跃或不规则, 都能表示成一组光滑正弦曲线叠加之和. 傅里叶变换即是把这条周期曲线拆解成一组光滑正弦曲线的过程.
傅里叶变换的目的是将时域(时间域)上的信号转变为频域(频率域)上的信号, 随着域的不同,对同一个事物的了解角度也随之改变. 因此在时域中某些不好处理的地方, 放在频域中就可以较为简单的处理. 这样可以大量减少处理的数据量.
傅里叶定理:
y=A1sin(ω1x+ϕ1)+A2sin(ω2x+ϕ2)+..+Cy = A_1sin(\omega_1x+\phi_1) + A_2sin(\omega_2x+\phi_2) + .. +C y=A1sin(ω1x+ϕ1)+A2sin(ω2x+ϕ2)+..+C
快速傅里叶变换相关API:
import numpy.fft as nf
# 通过采样数与采样周期,得到fft分解所得曲线的频率数组
# 采样周期: x轴相邻两点的距离
freqs = nf.fftfreq(采样数量, 采样周期)# 通过原函数值序列, 经过fft后, 得到复数数组
# 复数数组的长度即是拆解出正弦函数的个数
# 复数数组每个元素的模,代表每个正弦曲线的振幅
# 复数数组每个元素的辅角,代表每个正弦曲线的相位角
复数序列 = nf.fft(原函数值序列)# 逆向傅里叶变换
原函数值序列 = nf.ifft(复数序列)
案例: 基于傅里叶变换, 拆解方波.
"""
demo04_fft.py 傅里叶变换
"""
import numpy as np
import matplotlib.pyplot as mp
import numpy.fft as nfx = np.linspace(-2*np.pi, 2*np.pi, 1000)# 叠加1000条曲线
y = np.zeros(x.size)
for i in range(1, 1000):y += 4/(2*i-1)*np.pi * np.sin((2*i-1)*x)# 对y做傅里叶变换, 绘制频域图像
ffts = nf.fft(y)
# 获取傅里叶变换的频率序列
freqs = nf.fftfreq(x.size, x[1]-x[0])
pows = np.abs(ffts)mp.figure('FFT', facecolor='lightgray')
mp.subplot(121)
mp.grid(linestyle=':')
mp.plot(x, y,linewidth=2)
mp.subplot(122)
mp.grid(linestyle=':')
mp.plot(freqs[freqs>0], pows[freqs>0], c='orangered')
# 通过复数数组,经过ifft操作, 得到原函数
y2 = nf.ifft(ffts)
mp.subplot(121)
mp.plot(x, y2, linewidth=7, alpha=0.5)mp.show()
基于傅里叶变换的频域滤波
含噪信号是高能信号与低能噪声叠加的信号, 可以通过傅里叶变换的频域滤波实现简单降噪.
通过FFT使含噪信号转换为含噪频谱, 手动取出低能噪声, 留下高能频谱后,再通过IFFT生成高能信号.
- 读取音频文件, 获取音频的基本信息: 采样个数/采样周期/每个采样点的声音值. 绘制音频的时域: 时间/位移图像.
sample_rate, noised_sigs = \wf.read('../da_data/noised.wav')
print(noised_sigs.shape)
times = np.arange(len(noised_sigs))/sample_ratemp.figure('Filter', facecolor='lightgray')
mp.subplot(2,2,1)
mp.title('Time Domain', fontsize=16)
mp.ylabel('Signal', fontsize=12)
mp.tick_params(labelsize=8)
mp.grid(linestyle=':')
mp.plot(times[:178], noised_sigs[:178], c='dodgerblue', label='Noised Sigs')
mp.legend()
mp.show()
- 基于傅里叶变换, 获取音频频域信息, 绘制频域: 频率/能量图像.
freqs = nf.fftfreq(times.size, 1/sample_rate)
noised_ffts = nf.fft(noised_sigs)
noised_pows = np.abs(noised_ffts)
mp.subplot(222)
mp.title('Frequency Domain', fontsize=16)
mp.ylabel('Power', fontsize=12)
mp.tick_params(labelsize=8)
mp.grid(linestyle=":")
mp.semilogy(freqs[freqs>0], noised_pows[freqs>0],c='orangered', label='Noised')
mp.legend()
- 将低频噪声去除后绘制音频频域: 频率/能量图像.
noised_inds = np.where(freqs != fund_freq)
filter_ffts = noised_ffts.copy()
filter_ffts[noised_inds] = 0
filter_pows = np.abs(filter_ffts)
mp.subplot(224)
mp.title('Frequency Domain', fontsize=16)
mp.ylabel('Power', fontsize=12)
mp.tick_params(labelsize=8)
mp.grid(linestyle=":")
mp.plot(freqs[freqs>0], filter_pows[freqs>0],c='orangered', label='Filter')
mp.legend()
- 基于逆向傅里叶变换,生成时域的音频信号, 绘制时域: 时间/位移图像.
filter_sigs = nf.ifft(filter_ffts)
mp.subplot(2,2,3)
mp.title('Time Domain', fontsize=16)
mp.ylabel('Signal', fontsize=12)
mp.tick_params(labelsize=8)
mp.grid(linestyle=':')
mp.plot(times[:178], filter_sigs[:178], c='dodgerblue', label='Filter Sigs')
mp.legend()
- 生成音频文件
wf.write('../da_data/filter.wav', sample_rate, filter_sigs.astype(np.int16))
numpy的快速傅里叶变换相关推荐
- OpenCV快速傅里叶变换(FFT)用于图像和视讯流的模糊检测
OpenCV快速傅里叶变换(FFT)用于图像和视频流的模糊检测 翻译自[OpenCV Fast Fourier Transform (FFT) for blur detection in images ...
- numpy教程:快速傅里叶变换模块numpy.fft
http://blog.csdn.net/pipisorry/article/details/51050297 快速傅里叶变换 NumPy中,fft模块提供了快速傅里叶变换的功能.在这个模块中,许多函 ...
- numpy基础(part12)--快速傅里叶变换模块
学习笔记,这个笔记以例子为主. 开发工具:Spyder 文章目录 快速傅里叶变换模块(fft) 傅里叶变换相关函数 案例 快速傅里叶变换模块(fft) 傅里叶变换在处理信号时效果较好,比如音频,心电波 ...
- 快速傅里叶变换(FFT)算法【详解】
快速傅里叶变换(Fast Fourier Transform)是信号处理与数据分析领域里最重要的算法之一.我打开一本老旧的算法书,欣赏了JW Cooley 和 John Tukey 在1965年的文章 ...
- 基于python的快速傅里叶变换FFT(二)
基于python的快速傅里叶变换FFT(二) 本文在上一篇博客的基础上进一步探究正弦函数及其FFT变换. 知识点 FFT变换,其实就是快速离散傅里叶变换,傅立叶变换是数字信号处理领域一种很重要的算 ...
- 基于python的快速傅里叶变换FFT(一)
基于python的快速傅里叶变换FFT(一) FFT可以将一个信号变换到频域.有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了.这就是很多信号分析采用FFT变换的原因. ...
- Python实现快速傅里叶变换(FFT)
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Thu May 24 21:00:47 201 ...
- 数字信号处理学习笔记(二)|快速傅里叶变换
快速傅里叶变换(FFT) 一.FFT出现的原因 对x(n)进行N点DFT计算,一共有N2 次乘法,N2次加法 如果N=1024,则有2*1048576次计算,计算量过于庞大. FFT的思想就是:不断把 ...
- 快速傅里叶变换及python代码实现
文章来源:https://www.cnblogs.com/LXP-Never/p/11558302.html 快速傅里叶变换及python代码实现 目录 一.前言 傅里叶变换相关函数 基于傅里 ...
最新文章
- 2022-2028年中国生物类似药产业深度调研及前瞻分析报告
- 图像技术在上亿规模实拍图片中的应用(算法好文)
- 什么是DevOps的基石?为什么顶级公司都离不开它?
- RStudio中为R创建Notebook文件
- 一加7充电_夜话丨一加7超级快充明天见
- 华为平板电脑_华为MatePad Pro 5G:云游戏、云电脑加持,这台平板不只是平板
- Slam中几种变换的理解
- ubuntu下oracle数据的导入,Ubuntu下Oracle10g的导入与导出
- 数据库中单个表数据备份
- python:安装pycaret2.2.3(pytorch版本为1.7.1)
- matlab阶乘函数、排列组合函数、数组求和、未定义变量带入计算,简化结果值
- java_SSD3_实验报告_面向对象——多态
- Android日常整理(一)---android返回键、Fragment、android分割线、button图片间距的设置
- 职业病 颈椎肩膀 马步、摇肩、通背劲(转载)
- windows10系统-12-WPS文档编辑排版
- 《数据之美》读书笔记
- 十二个“一”的大五人格分析
- 微软首席数字官亲述微软自己的数字化转型故事
- 剑三游戏总是显示服务器繁忙,剑网三缘起:终究低估了老玩家的热情,服务器被挤爆...
- LTE协议之用户面与控制面UE侧协议结构
热门文章
- 解读《关于开展不良贷款转让试点工作的通知(征求意见稿)》
- 复合类型与with关键字
- word表格如何设置重复表头
- 控制台接收信息转发_Chrome 控制台不完全指南(转)
- c和python混合编程ctypes不是有效的win32应用_Ctypes抛出“WindowsError:[Error 193]%1不是有效的Win32应用程序”,但它不是32/64位问题...
- 风信子网络工作室——邀您加盟——保定
- java支付宝网页授权登录界面_网页版的支付宝授权登录(vue+java)
- 04.一语详解SpringBoot全局配置文件
- 电脑是自动获取ip,VMware安装linux时候,设置固定ip并且能访问外网
- 有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。