快速傅里叶变换(fft)

什么是傅里叶变换?

傅里叶定理: 任何一条周期曲线, 无论多么跳跃或不规则, 都能表示成一组光滑正弦曲线叠加之和. 傅里叶变换即是把这条周期曲线拆解成一组光滑正弦曲线的过程.

傅里叶变换的目的是将时域(时间域)上的信号转变为频域(频率域)上的信号, 随着域的不同,对同一个事物的了解角度也随之改变. 因此在时域中某些不好处理的地方, 放在频域中就可以较为简单的处理. 这样可以大量减少处理的数据量.

傅里叶定理:
y=A1sin(ω1x+ϕ1)+A2sin(ω2x+ϕ2)+..+Cy = A_1sin(\omega_1x+\phi_1) + A_2sin(\omega_2x+\phi_2) + .. +C y=A1​sin(ω1​x+ϕ1​)+A2​sin(ω2​x+ϕ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生成高能信号.

  1. 读取音频文件, 获取音频的基本信息: 采样个数/采样周期/每个采样点的声音值. 绘制音频的时域: 时间/位移图像.
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()
  1. 基于傅里叶变换, 获取音频频域信息, 绘制频域: 频率/能量图像.
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()
  1. 将低频噪声去除后绘制音频频域: 频率/能量图像.
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()
  1. 基于逆向傅里叶变换,生成时域的音频信号, 绘制时域: 时间/位移图像.
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()
  1. 生成音频文件
wf.write('../da_data/filter.wav', sample_rate, filter_sigs.astype(np.int16))

numpy的快速傅里叶变换相关推荐

  1. OpenCV快速傅里叶变换(FFT)用于图像和视讯流的模糊检测

    OpenCV快速傅里叶变换(FFT)用于图像和视频流的模糊检测 翻译自[OpenCV Fast Fourier Transform (FFT) for blur detection in images ...

  2. numpy教程:快速傅里叶变换模块numpy.fft

    http://blog.csdn.net/pipisorry/article/details/51050297 快速傅里叶变换 NumPy中,fft模块提供了快速傅里叶变换的功能.在这个模块中,许多函 ...

  3. numpy基础(part12)--快速傅里叶变换模块

    学习笔记,这个笔记以例子为主. 开发工具:Spyder 文章目录 快速傅里叶变换模块(fft) 傅里叶变换相关函数 案例 快速傅里叶变换模块(fft) 傅里叶变换在处理信号时效果较好,比如音频,心电波 ...

  4. 快速傅里叶变换(FFT)算法【详解】

    快速傅里叶变换(Fast Fourier Transform)是信号处理与数据分析领域里最重要的算法之一.我打开一本老旧的算法书,欣赏了JW Cooley 和 John Tukey 在1965年的文章 ...

  5. 基于python的快速傅里叶变换FFT(二)

    基于python的快速傅里叶变换FFT(二) 本文在上一篇博客的基础上进一步探究正弦函数及其FFT变换. 知识点   FFT变换,其实就是快速离散傅里叶变换,傅立叶变换是数字信号处理领域一种很重要的算 ...

  6. 基于python的快速傅里叶变换FFT(一)

    基于python的快速傅里叶变换FFT(一) FFT可以将一个信号变换到频域.有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了.这就是很多信号分析采用FFT变换的原因. ...

  7. Python实现快速傅里叶变换(FFT)

    #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Thu May 24 21:00:47 201 ...

  8. 数字信号处理学习笔记(二)|快速傅里叶变换

    快速傅里叶变换(FFT) 一.FFT出现的原因 对x(n)进行N点DFT计算,一共有N2 次乘法,N2次加法 如果N=1024,则有2*1048576次计算,计算量过于庞大. FFT的思想就是:不断把 ...

  9. 快速傅里叶变换及python代码实现

    文章来源:https://www.cnblogs.com/LXP-Never/p/11558302.html 快速傅里叶变换及python代码实现 目录 一.前言   傅里叶变换相关函数   基于傅里 ...

最新文章

  1. 2022-2028年中国生物类似药产业深度调研及前瞻分析报告
  2. 图像技术在上亿规模实拍图片中的应用(算法好文)
  3. 什么是DevOps的基石?为什么顶级公司都离不开它?
  4. RStudio中为R创建Notebook文件
  5. 一加7充电_夜话丨一加7超级快充明天见
  6. 华为平板电脑_华为MatePad Pro 5G:云游戏、云电脑加持,这台平板不只是平板
  7. Slam中几种变换的理解
  8. ubuntu下oracle数据的导入,Ubuntu下Oracle10g的导入与导出
  9. 数据库中单个表数据备份
  10. python:安装pycaret2.2.3(pytorch版本为1.7.1)
  11. matlab阶乘函数、排列组合函数、数组求和、未定义变量带入计算,简化结果值
  12. java_SSD3_实验报告_面向对象——多态
  13. Android日常整理(一)---android返回键、Fragment、android分割线、button图片间距的设置
  14. 职业病 颈椎肩膀 马步、摇肩、通背劲(转载)
  15. windows10系统-12-WPS文档编辑排版
  16. 《数据之美》读书笔记
  17. 十二个“一”的大五人格分析
  18. 微软首席数字官亲述微软自己的数字化转型故事
  19. 剑三游戏总是显示服务器繁忙,剑网三缘起:终究低估了老玩家的热情,服务器被挤爆...
  20. LTE协议之用户面与控制面UE侧协议结构

热门文章

  1. 解读《关于开展不良贷款转让试点工作的通知(征求意见稿)》
  2. 复合类型与with关键字
  3. word表格如何设置重复表头
  4. 控制台接收信息转发_Chrome 控制台不完全指南(转)
  5. c和python混合编程ctypes不是有效的win32应用_Ctypes抛出“WindowsError:[Error 193]%1不是有效的Win32应用程序”,但它不是32/64位问题...
  6. 风信子网络工作室——邀您加盟——保定
  7. java支付宝网页授权登录界面_网页版的支付宝授权登录(vue+java)
  8. 04.一语详解SpringBoot全局配置文件
  9. 电脑是自动获取ip,VMware安装linux时候,设置固定ip并且能访问外网
  10. 有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。