Python使用scipy.fft进行大学经典的傅立叶变换

傅里叶变换是在高数是一个很重要的知识点,今天将结合Python代码实现傅立叶变换。

傅立叶变换

我们平时是如何去分解一个复杂的问题呢?一个经典的方法就是把这个复杂的问题分解成为多个简单的可操作的子问题, 傅立叶变换也是基于这个思想。

傅里叶分析是研究如何将数学函数分解为一系列更简单的三角函数的领域。傅里叶变换是该领域的一种工具,用于将函数分解为其分量频率。

在本教程中,傅立叶变换是一种工具,可以获取信号并查看其中每个频率的功率。看一看该傅立叶变换中的重要术语:

  • 信号:信号是随时间变化的信息。例如,音频,视频和电压走线都是信号的示例。
  • 频率:频率是某物重复的速度。例如,时钟以1赫兹(Hz)的频率滴答,或每秒重复1次。
  • 功率:功率表示每个频率的强度。

下图是一些正弦波的频率和功率的直观演示:

第一个是低频正弦波,第二个是高频正弦波,第三个是低频低功率正弦波,因此低功率正弦波比其它两个正弦波的峰较小。

时域与频域

时域与频域是查看信号的两种不同方式,即信号的组成频率或随时间变化的信息。

在时域中,信号是随时间(x轴)幅度(y轴)变化的波。您最有可能在时域中查看图表,例如:

这是一些音频的图像,它是一个时域信号。横轴表示时间,纵轴表示振幅。

在频域中,信号表示为一系列频率(x轴),每个频率都具有关联的功率(y轴)。下图是经过傅立叶变换后的上述音频信号:

代码实现正弦波

音频本质上是正弦波。

下面是产生正弦波的代码:

import numpy as np
from matplotlib import pyplot as plt

SAMPLE_RATE = 44100  # 赫兹
DURATION = 5  # 秒

def generate_sine_wave(freq, sample_rate, duration):
    x = np.linspace(0, duration, sample_rate * duration, endpoint=False)
    frequencies = x * freq

    y = np.sin((2 * np.pi) * frequencies)
    return x, y

# 产生持续5秒的2赫兹正弦波
x, y = generate_sine_wave(2, SAMPLE_RATE, DURATION)
plt.plot(x, y)
plt.show()

x轴以秒为单位表示时间,并且由于每秒钟的时间都有两个峰值,因此可以看到正弦波每秒振荡两次。

混合音频

下面将两个正弦波,混合音频信号仅包括两个步骤:

将正弦波加在一起,然后进行归一化的操作。

具体实现的代码如下。

_, nice_tone = generate_sine_wave(400, SAMPLE_RATE, DURATION)
_, noise_tone = generate_sine_wave(4000, SAMPLE_RATE, DURATION)
noise_tone = noise_tone * 0.3

mixed_tone = nice_tone + noise_tone

下一步是归一化,或缩放信号以适合目标格式。由于以后将如何存储音频,目标格式为16位整数,范围为-32768到32767:

normalized_tone = np.int16((mixed_tone / mixed_tone.max()) * 32767)

plt.plot(normalized_tone[:1000])
plt.show()

看到的正弦波是生成的400 Hz音调,将上面的正弦波转化为音频,最简单的方法是使用SciPywavfile.write方法将其存储在WAV文件中。16位整数是WAV文件的标准数据类型,因此需要将信号标准化为16位整数:

from scipy.io.wavfile import write

# 记住,采样率=44100赫兹是我们的播放率
write("mysinewave.wav", SAMPLE_RATE, normalized_tone)

这个音频听起来音调很高。

完成此步骤后,就当作音频样本了。下一步是使用傅立叶变换消除高音调!

傅立叶变换

现在对生成的音频上使用FFT了。FFT是一种算法,可实现傅立叶变换并可以在时域中为信号计算频谱。

from scipy.fft import fft, fftfreq

# 标准化音调中的样本数
N = SAMPLE_RATE * DURATION

yf = fft(normalized_tone)
xf = fftfreq(N, 1 / SAMPLE_RATE)

plt.plot(xf, np.abs(yf))
plt.show()


我们可以在正频率中看到两个峰值,正频率峰值位于400 Hz和4000 Hz,与之前生成的音频的频率相对应。

计算傅里叶变换

yf = fft(normalized_tone)
xf = fftfreq(N, 1 / SAMPLE_RATE)

上面代码的功能

  • fft() 计算转换本身。
  • fftfreq()计算的输出中每个仓中心的频率fft()。没有这个,就无法在频谱上绘制x轴

fft()输出的频谱围绕y轴反射,因此负半部分是正半部分的镜像,我们一般只需计算一半对称值,即可更快地进行傅立叶变换。scipy.fft以的形式实施此速度骇客rfft()。

from scipy.fft import rfft, rfftfreq

# 注意前面多余的“r”
yf = rfft(normalized_tone)
xf = rfftfreq(N, 1 / SAMPLE_RATE)

plt.plot(xf, np.abs(yf))
plt.show()

过滤信号

傅里叶变换的一大优点是它是可逆的,我们可以利用此优势来过滤音频并摆脱高音调频率。

# 最大频率为采样率的一半
points_per_freq = len(xf) / (SAMPLE_RATE / 2)

# 我们的目标频率是4000赫兹 将44100变成4000
target_idx = int(points_per_freq * 4000)

然后,您可以将其设置yf为0目标频率附近的index来摆脱它:

yf[target_idx - 1 : target_idx + 2] = 0

plt.plot(xf, np.abs(yf))
plt.show()

由于只有一个高峰,下面应用傅立叶逆变换返回时域。

应用逆FFT与应用FFT相似:

from scipy.fft import irfft

new_sig = irfft(yf)

plt.plot(new_sig[:1000])
plt.show()

由于您正在使用rfft(),因此需要使用irfft()来应用反函数。但是,如果您使用过fft(),则反函数将是ifft()。现在,您的绘图应如下所示:

现在有一个以400 Hz振荡的正弦波,并且您已经成功地消除了4000 Hz的噪声。

对信号进行归一化,然后再将其写入文件。

norm_new_sig = np.int16(new_sig * (32767 / new_sig.max()))

write("clean.wav", SAMPLE_RATE, norm_new_sig)

到此这篇关于Python使用scipy.fft进行大学经典的傅立叶变换的文章就介绍到这了,更多相关Python 傅立叶变换内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python 图像的离散傅立叶变换实例

    图像(MxN)的二维离散傅立叶变换可以将图像由空间域变换到频域中去,空间域中用x,y来表示空间坐标,频域由u,v来表示频率,二维离散傅立叶变换的公式如下: 在python中,numpy库的fft模块有实现好了的二维离散傅立叶变换函数,函数是fft2,输入一张灰度图,输出经过二维离散傅立叶变换后的结果,但是具体实现并不是直接用上述公式,而是用快速傅立叶变换.结果需要通过使用abs求绝对值才可以进行可视化,但是视觉效果并不理想,因为傅立叶频谱范围很大,所以要用log对数变换来改善视觉效果. 在使用l

  • Python使用scipy.fft进行大学经典的傅立叶变换

    傅里叶变换是在高数是一个很重要的知识点,今天将结合Python代码实现傅立叶变换. 傅立叶变换 我们平时是如何去分解一个复杂的问题呢?一个经典的方法就是把这个复杂的问题分解成为多个简单的可操作的子问题, 傅立叶变换也是基于这个思想. 傅里叶分析是研究如何将数学函数分解为一系列更简单的三角函数的领域.傅里叶变换是该领域的一种工具,用于将函数分解为其分量频率. 在本教程中,傅立叶变换是一种工具,可以获取信号并查看其中每个频率的功率.看一看该傅立叶变换中的重要术语: 信号:信号是随时间变化的信息.例如

  • Python基于scipy实现信号滤波功能

    ​ 1.背景介绍 在深度学习中,有时会使用Matlab进行滤波处理,再将处理过的数据送入神经网络中.这样是一般的处理方法,但是处理起来却有些繁琐,并且有时系统难以运行Matlab.Python作为一种十分强大的语言,是支持信号滤波滤波处理的. 本文将以实战的形式基于scipy模块使用Python实现简单滤波处理,包括内容有1.低通滤波,2.高通滤波,3.带通滤波,4.带阻滤波器.具体的含义大家可以查阅大学课程,信号与系统.简单的理解就是低通滤波指的是去除高于某一阈值频率的信号:高通滤波去除低于某

  • Python使用scipy模块实现一维卷积运算示例

    本文实例讲述了Python使用scipy模块实现一维卷积运算.分享给大家供大家参考,具体如下: 一 介绍 signal模块包含大量滤波函数.B样条插值算法等等.下面的代码演示了一维信号的卷积运算. 二 代码 import numpy as np import scipy.signal x = np.array([1,2,3]) h = np.array([4,5,6]) print(scipy.signal.convolve(x, h))#一维卷积运算 三 运行结果 [ 4 13 28 27 1

  • 浅谈python中scipy.misc.logsumexp函数的运用场景

    scipy.misc.logsumexp函数的输入参数有(a, axis=None, b=None, keepdims=False, return_sign=False),具体配置可参见这里,返回的值是np.log(np.sum(np.exp(a))). 这里需要强调的是使用该函数的场景: 一般来说,该函数主要用于非常小的数值的运算(比如蒙特卡洛取样样本).在这种情况下,将数据保持log处理是必须的.所以这时你如果想将数组中的数据累加求和就需要这样计算log(sum(exp(a))),但这样做就

  • Python系统监控模块psutil功能与经典用法分析

    本文实例讲述了Python系统监控模块psutil功能与经典用法.分享给大家供大家参考,具体如下: 1.  psutil模块概述 psutil是一个跨平台库(http://code.google.com/p/psutil/),能够轻松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网络等)信息.它主要应用于系统监控,分析和限制系统资源及进程的管理.它实现了同等命令行工具提供的功能,如ps.top.lsof.netstat.ifconfig.who.df.kill.free.nice.

  • python安装scipy的方法步骤

    Scipy高级科学计算库:和Numpy联系很密切,Scipy一般都是操控Numpy数组来进行科学计算.统计分析,所以可以说是基于Numpy之上了. Scipy库的安装 pip install scipy Scipy有很多子模块可以应对不同的应用,例如插值运算,优化算法等等.SciPy则是在NumPy的基础上构建的更为强大,应用领域也更为广泛的科学计算包.正是出于这个原因,SciPy需要依赖NumPy的支持进行安装和运行. SciPy是世界上著名的Python开源科学计算库,建立在Numpy之上.

  • python中scipy.stats产生随机数实例讲解

    python的numpy 能生成一定概率分布的随机数,但如果需要更具体的概率密度,累积概率,就要使用scipy.stats.scipy.stats用于统计分析,统计工具和随机过程的概率,各个随机过程的随机数生成器可以从numpy.random中找到.本文介绍python中使用scipy.stats产生随机数的原理及实例. 1.scipy.stats正态分步格式 scipy.stats #生成指定分布 scipy.stats.poisson.rvs(loc=期望, scale=标准差, size=

  • python的scipy.stats模块中正态分布常用函数总结

    python的scipy.stats模块是连续型随机变量的公共方法,可以产生随机数,通常是以正态分布作为scipy.stats的基本使用方法.本文介绍正态分布的两种常用函数:1.累积概率密度函数stats.norm.cdf(α,均值,方差):2.概率密度函数stats.norm.pdf(α,均值,方差). 1.stats.norm.cdf(α,均值,方差):累积概率密度函数 使用格式 status.norm.cdf(Norm) # 相当于已知正态分布函数曲线和x值,求函数x点左侧积分 使用实例

  • python游戏实战项目之童年经典超级玛丽

    导语 "超级玛丽"--有多少人还记得这款经典游戏?那个戴帽子的大胡子穿着背带裤的马里奥! 带您重温经典的回忆,超级马里奥拯救不开心!炫酷来袭. 如果您的童年,也曾被魔性的 灯~灯灯~灯~灯灯~灯洗脑~那就来怀旧一番吧! 我是华丽的分割线------------------------------ 往期写过游戏实战已经积累到30几篇了哦~嘿嘿,推一波之前的,狗头保命.jpg. 欢迎大家来领免费的游戏,开玩啦~源码可以直接找我拿滴! 在座的各位大佬,你们都玩过这里面的几个游戏吖? ​ 往期

  • Python Pygame实战之五款童年经典游戏合集

    目录 一.推箱子 1)代码展示 2)效果展示 二.滑雪 1)代码展示 2)效果展示​ 三.声控把音符 1)代码展示 2)效果展示 四.保卫萝卜 1)代码展示 2)效果展示​ 五.飞机大战 1)代码展示 2)效果展示 一.推箱子 1)代码展示 import os import sys import cfg import pygame from modules import * from itertools import chain '''游戏地图''' class gameMap(): def _

随机推荐