音效素材网提供各类素材,打造精品素材网站!

站内导航 站长工具 投稿中心 手机访问

音效素材

Python使用scipy.fft进行大学经典的傅立叶变换
日期:2021-09-08 14:33:58   来源:脚本之家

傅里叶变换是在高数是一个很重要的知识点,今天将结合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 傅立叶变换内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

    您感兴趣的教程

    在docker中安装mysql详解

    本篇文章主要介绍了在docker中安装mysql详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编...

    详解 安装 docker mysql

    win10中文输入法仅在桌面显示怎么办?

    win10中文输入法仅在桌面显示怎么办?

    win10系统使用搜狗,QQ输入法只有在显示桌面的时候才出来,在使用其他程序输入框里面却只能输入字母数字,win10中...

    win10 中文输入法

    一分钟掌握linux系统目录结构

    这篇文章主要介绍了linux系统目录结构,通过结构图和多张表格了解linux系统目录结构,感兴趣的小伙伴们可以参考一...

    结构 目录 系统 linux

    PHP程序员玩转Linux系列 Linux和Windows安装

    这篇文章主要为大家详细介绍了PHP程序员玩转Linux系列文章,Linux和Windows安装nginx教程,具有一定的参考价值,感兴趣...

    玩转 程序员 安装 系列 PHP

    win10怎么安装杜比音效Doby V4.1 win10安装杜

    第四代杜比®家庭影院®技术包含了一整套协同工作的技术,让PC 发出清晰的环绕声同时第四代杜比家庭影院技术...

    win10杜比音效

    纯CSS实现iOS风格打开关闭选择框功能

    这篇文章主要介绍了纯CSS实现iOS风格打开关闭选择框,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作...

    css ios c

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的办法

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的

    Win7给电脑C盘扩容的办法大家知道吗?当系统分区C盘空间不足时,就需要给它扩容了,如果不管,C盘没有足够的空间...

    Win7 C盘 扩容

    百度推广竞品词的投放策略

    SEM是基于关键词搜索的营销活动。作为推广人员,我们所做的工作,就是打理成千上万的关键词,关注它们的质量度...

    百度推广 竞品词

    Visual Studio Code(vscode) git的使用教程

    这篇文章主要介绍了详解Visual Studio Code(vscode) git的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...

    教程 Studio Visual Code git

    七牛云储存创始人分享七牛的创立故事与

    这篇文章主要介绍了七牛云储存创始人分享七牛的创立故事与对Go语言的应用,七牛选用Go语言这门新兴的编程语言进行...

    七牛 Go语言

    Win10预览版Mobile 10547即将发布 9月19日上午

    微软副总裁Gabriel Aul的Twitter透露了 Win10 Mobile预览版10536即将发布,他表示该版本已进入内部慢速版阶段,发布时间目...

    Win10 预览版

    HTML标签meta总结,HTML5 head meta 属性整理

    移动前端开发中添加一些webkit专属的HTML5头部标签,帮助浏览器更好解析HTML代码,更好地将移动web前端页面表现出来...

    移动端html5模拟长按事件的实现方法

    这篇文章主要介绍了移动端html5模拟长按事件的实现方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家...

    移动端 html5 长按

    HTML常用meta大全(推荐)

    这篇文章主要介绍了HTML常用meta大全(推荐),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参...

    cdr怎么把图片转换成位图? cdr图片转换为位图的教程

    cdr怎么把图片转换成位图? cdr图片转换为

    cdr怎么把图片转换成位图?cdr中插入的图片想要转换成位图,该怎么转换呢?下面我们就来看看cdr图片转换为位图的...

    cdr 图片 位图

    win10系统怎么录屏?win10系统自带录屏详细教程

    win10系统怎么录屏?win10系统自带录屏详细

    当我们是使用win10系统的时候,想要录制电脑上的画面,这时候有人会想到下个第三方软件,其实可以用电脑上的自带...

    win10 系统自带录屏 详细教程

    + 更多教程 +
    ASP编程JSP编程PHP编程.NET编程python编程