音频与信号的基础概念

傅里叶级数

Fourier Series (thefouriertransform.com)

傅里叶级数将周期函数分解到正弦曲线的函数中。它是周期函数的傅里叶变换。为了开始分析傅里叶级数,让我们定义周期函数。

一个周期为T的函数如果对下列条件成立

$$ f(t+T)=f(t) $$

简单来说,这以为这周期为T的函数将会在T秒时出现和现在一样的值。不管你什么时候观察这个函数。注意一个周期为T的函数,也是周期为2T的函数。所以基本的周期是T的值值中最小的可能性让以上等式依然可以成立。

来看图1

图1的方型波基本的周期为T。

现在让我们来定义傅里叶级数。周期为T的傅里叶级数,是正弦函数的无穷和(cosine 和 sine),每个频率都是1/T的整数倍(基本周期的倒数)。傅里叶级数也包括了常熟,因此被写作:

$$ \begin{gathered} g(t) =a_{0}+\sum_{m=1}^{\infty}a_{m}\cos\biggl(\frac{2\pi mt}{T}\biggr)+\sum_{n=1}^{\infty}b_{n}\sin\biggl(\frac{2\pi nt}{T}\biggr) \\ =\sum_{m=0}^{\infty}a_{m}\cos\biggl(\frac{2\pi mt}{T}\biggr)+\sum_{n=1}^{\infty}b_{n}\sin\biggl(\frac{2\pi nt}{T}\biggr) \end{gathered} $$

其中的常数$a_m,b_n$是傅里叶级数的系数。它决定了乜咯正弦曲线的权重。现在的问题是:

对于任意的周期函数f(t),我们能用周期为基本周期的整数倍的简单正弦波来多么接近地近似这个函数?也就是,对于给定的周期函数f(t),函数g(t)和f(t)由多接近。

这个结果是数学中最棒的结论之一,即:我们可以精确的近似f(t),只要f(t)是连续且光滑。现实中,所有的函数都是连续和光滑的。所以对于时间中的工程师或者物理学家,所有的周期性函数可以精准的通过傅里叶级数来进行表示。这是一个很棒的结果

傅里叶变换

正弦波

正弦曲线或正弦波(Sinusoid/Sine wave)是一种来自数学三角函数中的正弦比例的曲线。也是模拟信号的代表,与代表数字信号的方波相对。

正弦曲线的形状就像完美的海上波浪,以三角函数正弦比例改变而形成。

标准的纯正弦函数公式为

$$ y=sin(x) $$

sin(x) 为正弦函数。

而一般应用的正弦曲线公式为

$$ y=A\cdot\sin(\omega t+\theta) $$

A 为波幅(纵轴), ω 为角频率, t 为时间(横轴),θ为初始相位(t=0时的)。以下的公式则拥有全部的可用参数.

$$ y=A\cdot\sin(kx-\omega t-\theta)+D $$

k 为波数(周期密度), D 为(直流)偏移量(y轴高低)。

因为cos⁡x=sin⁡(x+π2),$\displaystyle \cos {x}=\sin(x+{\frac {\pi }{2}})$所以余弦波也是正弦波。

基本

事实上时姐上所有的函数都可以被描述成为一个波形,是一个时间空间或者其他变量的函数。例如,声波,电磁场,山的高度与位置的关系,驻波比与频率的关系图,你最喜欢的股票价格与时间的关系等。傅里叶变换给了我们一种独特的强有力的能力来观察这些波形。

基于这样一个事实-宇宙的基本秘密之一:所有的波形无论你在宇宙中如何描述或者观察,它们只是不同频率的简单正弦曲线的和。

正如我们看到的一样这个事实很酷。傅里叶变换分解了波形:任何真实世界的波形变为正弦曲线。即,傅里叶变换给出了一种表示波形的方法

让我们将图1中的曲线分解为建筑块(或者成分的频率)。这个分解可以用傅里叶变换来完成(或者周期波形的傅里叶级数),就像我们看到的一样。

第一个曲线为正弦曲线其周期为T=6.28(2pi),幅值0.3的正弦波如图1所示。

图1:一个基本频率(左)和原来的原始波形(右)的比较


第二个频率的周期是第一个的一半(频率的俩倍)。第二个组成部分展示在图2左侧,加上俩个频率域原始波形的和。

图2:第二个原始频率(左)和源波形与前俩个频率组合的比较。

我们可以看到前俩个频率的和开始长得像源波形。最后我们加入4个频率分量得到原始波形。

傅里叶变换是基本的工具像我们展示了如何结构波形成为几个正弦函数的组成部分。它在很多领域都用应用,帮助我们理解宇宙,这让实践工程师或科学家的生活变得更容易。

梅尔频谱

Understanding the Mel Spectrogram | by Leland Roberts | Analytics Vidhya | Medium

信号

信号是一定数量随着时间的变化。对于音频变化的量是空气的压力。我们如何以数字的方式补货这些信息?我们可以取气压随时间变化的样本。我们对数据的采样率可能会有所不同,但是通常使用44.1kHz,或者44,100 采样每秒。我们捕获的是信号的波形,它可以被解释修改和通过计算机软件分析。

import librosa
import librosa.display
import matplotlib.pyplot as plt
y, sr = librosa.load('./example_data/blues.00000.wav')
plt.plot(y);
plt.title('Signal');
plt.xlabel('Time (samples)');
plt.ylabel('Amplitude');

这很好!我们有了音频信号的信号表示,这是我们可以处理的。我们也许会想知道,我们如何在其中提取出有用的信息?它看起来乱七八糟。我们的朋友傅里叶要来了

傅里叶变换

一个音频信号包括了几个信号频率声波。当信号随着时间进行采样,我们之内捕获到最终的振幅。傅里叶变化是一个数学公式,它允许我们分离信号到单独的频率和频率的振幅。换句话说,它将信号从时间域转换到了频域。这个结果我们称之为频谱。

这是很重要的,因为每个信号都可以被分解为正弦函数集和余弦波,加起来就是原始信号。这是一个了不起的理论被叫做傅里叶定理。

快速傅里叶算法(FFT)是一个能够有效的计算傅里叶变换的算法。它被广泛用在信号处理。我们将在事例音频的窗口段上使用这个个算法。

import numpy as np
n_fft = 2048
ft = np.abs(librosa.stft(y[:n_fft], hop_length = n_fft+1))
plt.plot(ft);
plt.title('Spectrum');
plt.xlabel('Frequency Bin');
plt.ylabel('Amplitude');

频谱图

快速傅里叶变化是一个强大的工具允许我们分析信号的频率内容,但是如何信号的频率内容随时间发生变化呢?大多数音频信号比如音乐和说话都是如此。这些信号被称为非周期信号。我们需要一种方式来表示这些信号随时间改变的频谱。你可能会想:“我们不能通过对信号的几个窗口执行FFT来计算几个频谱吗?”没错!这就是我们所做的,它被叫做短时傅里叶变换。FFT是在信号的重叠窗口段上计算的,我们就得到了所谓的频谱图。这让人难以接受,这里发生了很多事。

你可以将频谱图想象成一个堆叠在一起的FFT。这是一种直观地表示信号响度,广度的方法,因为他们在不同频率下随着时间变化。在计算频谱图时,还有一些额外的细节在幕后进行。y轴被转换成对数刻度,颜色维度被转换成分贝(你可以想象振幅的对数刻度)。这是因为人类只能感受到非常小的范围的和集中的频率范围与振幅。

spec = np.abs(librosa.stft(y, hop_length=512))
spec = librosa.amplitude_to_db(spec, ref=np.max)
librosa.display.specshow(spec, sr=sr, x_axis='time', y_axis='log');
plt.colorbar(format='%+2.0f dB');
plt.title('Spectrogram');

只需要几行代码,我们就可以创建频谱图。我们很接近了!我们现在知道了平铺图,但是什么是Mel呢?这是什么。

梅尔尺度

研究表明,人类不能感知到线性尺度上的频率。我们更擅长与检测低频的差异而不是高频的差异。举个例子,我们可以简单的是活出500和1000hz的不同,但是我们很难说出1000和10500hz的不同,即使他们的路径距离是一样的。

在1937年 Stevens, Volkmann,Newmann 提出了音高单位,使得在音高上的等距离听上去对听者来说距离相等。这被称之为梅尔尺度。我们队频率进行数学计算,将其转换为梅尔尺度。

梅尔频谱

梅尔频谱是一个频率已经转换为梅尔尺度的频谱。令人惊奇的是,在经历了这一切后,现在只需要几行代码就可以实现。

mel_spect = librosa.feature.melspectrogram(y=y, sr=sr, n_fft=2048, hop_length=1024)
mel_spect = librosa.power_to_db(spect, ref=np.max)
librosa.display.specshow(mel_spect, y_axis='mel', fmax=8000, x_axis='time');
plt.title('Mel Spectrogram');
plt.colorbar(format='%+2.0f dB');

Last modification:September 8, 2024
如果觉得我的文章对你有用,请随意赞赏