深入理解傅里叶变换(一)

这篇具有很好参考价值的文章主要介绍了深入理解傅里叶变换(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

三棱镜分解太阳光实验

深入理解傅里叶变换(一)
三棱镜能将太阳光分解成七种颜色的可见光。我们知道这七种颜色有不同的波长范围,从而对应不同的频率范围。这给我们一个启示:太阳光这种看起来是白色的光,其实是由不同频率的光组成的,而三棱镜能起到将太阳光分解成不同频率的光的作用。

如果把三棱镜看作是一个算法,把太阳光看作是一段信号,那么我们就可以设想:存在一种算法,能将一段信号分解成不同频率的信号。

从时域到频域

深入理解傅里叶变换(一)
上图表示的是同一段信号,左图为时域图,右图为频域图,频域图中y轴的值最大的那个尖峰(即第二个尖峰)是时域信号最为重要的一个分量(或者说,最为相似的一个分量),而第一个尖峰所对应的频率则被称为基频F0。

那么该如何做这个分解呢,直观来看,分为以下几个步骤:

  • 将原始时域信号,与不同频率的正弦信号,比较相似度
  • 比较相似度的结果是,我们得到不同频率的正弦信号对应的振幅和初相
  • 正弦信号的振幅越大,该频率的正弦信号与原始时域信号的相似度就越大

傅里叶变换

加载一段音频信号,指定采样率为16000Hz,然后绘制出其时域图像

import librosa
import librosa.display
import matplotlib.pyplot as plt
import numpy as np
import scipy as sp


def wav_to_ft(filename):
    signal, sr = librosa.load(filename, sr=16000)
    librosa.display.waveshow(y=signal, sr=sr, alpha=0.5)

    plt.show()


if "__main__" == __name__:
    filename = r"10 - Fourier Transform_ The Intuition\audio\piano_c.wav"
    wav_to_ft(filename)

深入理解傅里叶变换(一)
然后使用FFT,得到不同频率对应的振幅和初相,注意:

  • 不同的频率是通过将采样频率等分得到的
  • 这里的是振幅和初相是用复数给出的,需要求模长得到振幅
  • 初相一般在机器学习中不重要,所以略去
def wav_to_ft(filename):
    signal, sr = librosa.load(filename, sr=16000)
    ft = np.fft.fft(signal)
    magnitude = np.abs(ft)
    frequency = np.linspace(0, sr, len(magnitude))

    plt.subplot(1, 2, 1)
    librosa.display.waveshow(y=signal, sr=sr, alpha=0.5)

    plt.subplot(1, 2, 2)
    plt.plot(frequency, magnitude)
    plt.xlabel("Frequency Hz")
    plt.ylabel("Magnitude")

    plt.show()

深入理解傅里叶变换(一)
惊奇的发现FFT得到的频率-振幅图像是对称的,原因暂且按下不表。由于对称性,我们可以只显示一半的图像,即(1+sr//2)。

plt.plot(frequency[:1 + sr // 2], magnitude[:1 + sr // 2])

深入理解傅里叶变换(一)
第一个尖峰对应频率:524Hz
第二个尖峰对应频率:1053Hz
第三个尖峰对应频率:1591Hz
第四个尖峰对应频率:2136Hz
近似为等差数列,理论上而言,的确应该为等差数列。即第一个尖峰为基波(基音),其他的为基频整数倍的尖峰为谐波(泛音)。

如何寻找这些正弦波

基波频率为524Hz,则一个基波周期为1/524Hz=0.0019s,大概为2ms,而一个采样的持续时间为1/16000Hz=0.0000625s,即32个采样点的持续时间大概为一个基波周期。

我们就取出原始信号的一个320个采样点的局部,大概为十个基波周期,看看这个局部范围内的信号是如何找寻基波的初相的。

def wav_to_ft(filename):
    signal, sr = librosa.load(filename, sr=16000)
    ft = np.fft.fft(signal)
    magnitude = np.abs(ft)
    phase = np.angle(ft)
    frequency = np.linspace(0, sr, len(magnitude))

    samples = range(len(signal))
    time = librosa.samples_to_time(samples=samples, sr=sr)

    f0, voiced_flag, voiced_probs = librosa.pyin(y=signal,
                                                 fmin=librosa.note_to_hz('C2'),
                                                 fmax=librosa.note_to_hz('C7'),
                                                 sr=sr)
    fs = [int(f0[1]), 2 * int(f0[1]), 3 * int(f0[1])]

    mag0 = 0.5
    phase0 = phase[fs[0]]
    sin0 = mag0 * np.sin(2 * np.pi * fs[0] * time + phase0)

    mag1 = 0.5
    phase1 = phase0 + 2 * np.pi * 0.3
    sin1 = mag1 * np.sin(2 * np.pi * fs[0] * time + phase1)

    mag2 = 0.5
    phase2 = phase0 + 2 * np.pi * 0.5
    sin2 = mag2 * np.sin(2 * np.pi * fs[0] * time + phase2)

    mul0 = sin0 * signal
    mul1 = sin1 * signal
    mul2 = sin2 * signal

    # plt.subplot(1, 2, 1)
    # librosa.display.waveshow(y=signal, sr=sr, alpha=0.5)

    # plt.subplot(1, 2, 2)
    # plt.plot(frequency[:1 + sr // 2], magnitude[:1 + sr // 2])
    # plt.xlabel("Frequency Hz")
    # plt.ylabel("Magnitude")

    fig, ax = plt.subplots(3, 1, sharex=True)
    ax[0].plot(time[1000:1000 + 320], signal[1000:1000 + 320])
    ax[0].plot(time[1000:1000 + 320], sin0[1000:1000 + 320])
    ax[0].fill_between(time[1000:1000 + 320], mul0[1000:1000 + 320])

    ax[1].plot(time[1000:1000 + 320], signal[1000:1000 + 320])
    ax[1].plot(time[1000:1000 + 320], sin1[1000:1000 + 320])
    ax[1].fill_between(time[1000:1000 + 320], mul1[1000:1000 + 320])

    ax[2].plot(time[1000:1000 + 320], signal[1000:1000 + 320])
    ax[2].plot(time[1000:1000 + 320], sin2[1000:1000 + 320])
    ax[2].fill_between(time[1000:1000 + 320], mul2[1000:1000 + 320])

    plt.show()

深入理解傅里叶变换(一)
频率已限制为基频,振幅设置为最接近原始信号的0.5,接下来就是寻找使得该正弦波与原始信号相似度最大的初相,一个直观的办法是将对应采样点的信号全部对应相乘,然后累加起来,使得该累加值最大的初相就是要找的初相。

上图中的蓝色填充就是两信号相乘后的值,可见,当最准确的初相变化半个周期后,值全部变为负。

因此,寻找一个正弦波分量的直观过程如下:

  • 选择一个频率
  • 在该频率下,设定振幅为1,然后寻找使两信号相乘再相加后,取得最大值的初相
  • 计算对应的振幅
    对于振幅,之前已经提到过,振幅表征了该正弦波与原始信号的相似度,所以振幅就是两信号相乘再相加后的累加值。

对于傅里叶变换,需要在所有可能的频率取值中,迭代地进行上述找寻正弦波分量的过程。

寻找一个正弦波分量的公式表述如下:
φ f = a r g m a x φ ∈ [ 0 , 1 ) ( ∫ s ( t ) ⋅ s i n [ 2 π ( f t − φ ) ] ⋅ d t ) d f = ( ∫ s ( t ) ⋅ s i n [ 2 π ( f t − φ f ) ] ⋅ d t ) \begin{aligned} \varphi_f &= argmax_{\varphi \in [0,1)} (\int s(t) \cdot sin[2 \pi (ft - \varphi )] \cdot dt ) \\ d_f &= (\int s(t) \cdot sin[2 \pi (ft - \varphi_f )] \cdot dt ) \end{aligned} φfdf=argmaxφ[0,1)(s(t)sin[2π(ftφ)]dt)=(s(t)sin[2π(ftφf)]dt)
下一部分将与傅里叶变换的数学有关文章来源地址https://www.toymoban.com/news/detail-431131.html

到了这里,关于深入理解傅里叶变换(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何理解图神经网络的傅里叶变换和图卷积

    图神经网络(GNN) 代表了一类强大的深度神经网络架构。在一个日益互联的世界里,因为信息的联通性,大部分的信息可以被建模为图。例如,化合物中的原子是节点,它们之间的键是边。 图神经网络的美妙之处在于它们能够在不牺牲重要细节的情况下直接对图结构数据进

    2024年02月09日
    浏览(44)
  • 傅里叶级数和傅里叶变换之间的关系推理及应用

    傅里叶级数和傅立叶变换是傅里叶分析的两个主要工具,它们之间有密切的关系。 傅里叶级数是将一个周期函数分解为一系列正弦和余弦函数的和。它适用于周期性信号,可以将周期函数表示为一组振幅和相位不同的谐波分量的和。傅里叶级数展示了一个周期函数在不同频率

    2024年02月07日
    浏览(58)
  • 傅里叶变换

    在计算机视觉中,有一个经典的变换被广泛使用——傅里叶变换。傅里叶变换是将时间域上的信号转变为频率域上的信号,进而进行图像去噪、图像增强等处理。 什么是时域(Time domain)?从我们出生,我们看到的世界都以时间贯穿,股票的走势、人的身高、汽车的轨迹都会

    2024年02月03日
    浏览(47)
  • 图傅里叶变换

    目录 什么是图信号? 如何理解图信号的”谱“? 图傅里叶变换是什么? 图傅里叶变换中特征值和图信号的总变差有什么关系? 让我们先总结一下,我们想要把图信号  正交分解到一组基  上; 那么怎么得到?可以通过对图的拉普拉斯矩阵 做特征分解得到,即. 于是   

    2024年02月06日
    浏览(44)
  • 【高数+复变函数】傅里叶变换

    上一节 【高数+复变函数】傅里叶积分 回顾:上一节中主要讲了Fourier积分公式的指数形式及其三角形式 f ( t ) = 1 2 π ∫ − ∞ + ∞ [ ∫ − ∞ + ∞ f ( τ ) e − j ω τ d τ ] e j ω t d ω = 1 π ∫ 0 + ∞ [ ∫ − ∞ + ∞ f ( τ ) cos ⁡ ω ( t − τ ) d τ ] d ω f(t)=frac{1}{2pi}int_{-infty}^{+inf

    2024年02月04日
    浏览(55)
  • 通俗讲解傅里叶变换

    参考:六一礼物:给孩子解释什么是傅里叶变换 牛!不看任何数学公式来讲解傅里叶变换  如何直观形象、生动有趣地给文科学生介绍傅里叶变换? - 知乎 从基说起…… 从数学的角度,提供一个形象有趣的解释。理解傅里叶变换的钥匙是理解基♂,它能让你重新认识世界。

    2024年02月09日
    浏览(37)
  • 傅里叶变换与Matlab

      很多初学者学习了傅里叶变换之后,只是对其公式死记硬背,从而达到做题的目的,但并不理解其原理,对于很多时频分析问题的理解不够透彻。之前自己也是如此,在经过深入学习之后,对变换公式的的本质进行探讨,理解变换的原理及意义所在,同时将傅里叶变换和

    2024年01月20日
    浏览(52)
  • 图像的傅里叶变换

    先向大家道歉啊   作为基础知识这内容肯定有人写过   但作为屌丝没时间搜这个出处   也没什么商用价值 就是为了自己好看  收藏不好用 麻烦选别的   真的对不起就是为自己   烦请勿扰   看不惯你了 忍着 傅里叶基础 法国数学家吉恩·巴普提斯特·约瑟夫·傅里叶被

    2023年04月27日
    浏览(54)
  • 【scipy 基础】--傅里叶变换

    傅里叶变换 是一种数学变换,它可以将一个函数或信号转换为另一个函数或信号,它可以将时域信号转换为频域信号,也可以将频域信号转换为时域信号。 在很多的领域都有广泛的应用,例如信号处理、通信、图像处理、计算机科学、物理学、生物学等。 它最大的功能是能

    2024年02月06日
    浏览(40)
  • opencv4 傅里叶变换

    ① 高频:变化剧烈的灰度分量,例如边界礁石。 ② 低频:变化缓慢的灰度分量,例如一片大海。 ③ 高通滤波器:只保留高频,会使得图像细节增强。高频边界锐化了,增强了,细节更明显了。 ④ 低通滤波器:只保留低频,会使得图像模糊。低频信息保留下来了,高频信息

    2024年02月08日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包