音频知识(一)

2021-04-20 20:30:18 浏览数 (1)

接触过多次音频项目,每次都需要回顾一下学过的内容。这里系统的总结下之前的知识点。

本文主要总结音频的基础知识,术语以及后续提取特征需要了解的一些数学基础知识。

要了解音频,首先要了解声音:声音是物体震动产生的波。

音频基础知识

1.声音三要素

响度:人耳对声音强弱的主观感觉称为响度。响度和声波振动的幅度有关。

音调:人耳对声音高低的感受称为音调。

音调主要和声波的频率有关。但是音调和频率并不是成正比的关系,它还与声音的强度 及波形有关。

音色:是人耳对各种频率、各种强度的声波的综合反应。声音的特性,和发声物体本身材料、结构有关。

2. 数模转换

人耳听到的声音都是时间连续的,这种连续平滑信号称为模拟信号。计算机中处理的音频数据是离散的信号,这种不连续的信号称为数字信号。将模拟信号转换为数字信号就称为数模转换,需要进行的步骤:采样,量化,编码。

采样:按照一定的时间间隔对模拟信号上进行取值。例如通常说16KHZ音频,指每秒采样了16000个点。

量化:将采样得到的值进行量化处理,用限制 个数值表示幅度信号。通常用bit做单位。比如16bit音频指量化级别为16位,取值范围-32768,32767,一共有65536个值。

编码:按照一定的格式记录 采样 和 量化 后的数据。通常说的音频裸数据指的是脉冲编码调制(PCM) 数据。编码后的二进制数据就是数字信号。

3. 术语

采样率:采样频率,没秒采样多少个点。常用16KHZ,44.1KHZ。

采样大小: 每个采样点对bit数。常用16bit,24bit。通道数:信号一次产生几组声波数据。常用单声道,双声道。

码率:也叫比特率,是指每秒传送的bit数。单位为 bps(Bit Per Second),比特率越高,每秒传送数据就越多,音质就越好。

码率计算公式:码率=采样率*采样大小*声道数

pcm编码对文件大小(M):码率*1000*秒数/1024/1024/8

信号基础知识

1.连续信号,离散信号

连续信号x(t)以时间间隔T进行均匀采样,则得到离散信号x(nT),最后通过量化用bit表示得到s数字信号。

信号还分为周期性信号和非周期性信号。下图依次为非周期性连续信号,周期性连续信号,非周期性离散信号,周期性离散信号。

信号信号

2.傅立叶分析

傅立叶说:任何连续周期信号都可以由一组适当的正弦曲线组合而成。 那为什么要用正弦曲线呢?因为正弦波是对频域的描述,

频域中唯一存在的波形。而傅立叶分析就是让信号在时域和频域中转换的方法。

(https://zhuanlan.zhihu.com/p/19759362这篇文章对傅立叶变换的分析讲解的非常好)

2.1 傅立叶级数(Fourier Series)

根据傅立叶说的,将周期性信号f(t)用一系列正弦函数表示:其中这里 t 表示时间, A 表示振幅, w 为角频率omega=2pi/Tpsi

为初相

f(t)=A_0 sum^{infty}_{n=1}{A_nsin(nomega t psi_n)}tag{1}

然后通过三角函数公式公式sin(alpha pm beta) = sinalpha coabeta pm cosalpha sinbeta 可以将公式转换为

f(t)=A_0 sum^{infty}_{n=1}{A_nsinpsi cons(nomega t) A_ncospsi sin(nomega t)}tag{2}

a_n = A_nsinpsi , b_n=A_ncospsi ,那么公式(1)就转换为

f(t)=A_0 sum^{infty}_{n=1}{a_n cos(nomega t) b_n sin(nomega t)}tag{3}

根据三角函数在一个周期内的积分为0,以及三角函数的正交性,我们可以解出A_0,a_n,b_n

begin{split} &A0 = frac{1}{2pi}int^{pi}_{-pi}{f(t)} \ &an = frac{1}{pi}int^{pi}_{-pi}{f(t)cos(nomega t)dt} \ &bn = frac{1}{pi}int^{pi}_{-pi}{f(t)sin(nomega t)dt} \ end{split} tag{4}

为了统一形式,记a_0=2A_0,周期T=2pi ,对公式4进行下变换

begin{split} &a_0 = frac{2}{T}int^{t_0 T}_{t_0}{f(t)} \ &a_n = frac{2}{T}int^{t_0 T}_{t_0}{f(t)cos(nomega t)dt} \ &b_n = frac{2}{T}int^{t_0 T}_{t_0}{f(t)sin(nomega t)dt} \ &f(t)=frac{a_0}{2} sum^{infty}_{n=1}{a_n cos(nomega t) b_n sin(nomega t)}\ end{split} tag{5}

公式5就是傅立叶级数公式了~

2.2 傅立叶变换(Fourier Transform)

傅立叶级数是三角形式,我们将其换为指数形式。

通过欧拉公公式e^{itheta} = cos(theta) isin(theta) 可以计算出

sin(theta) = -i frac{e^{itheta}-e^{-itheta}}{2}, cos(theta) = frac{e^{itheta} e^{-itheta}}{2} tag{6}

把公式6带入5中的f(t)

f(t)=frac{a_0}{2} sum^{infty}_{n=1}(frac{a_n-ib_n}{2}e^{inomega t} frac{a_n ib_n}{2}e^{-inomega t}) tag{7}

然后将5中a_n,b_n,a_0带入公式

f(t)=frac{1}{T}sum^{ infty}_{n=-infty}int^{t_0 T}_{t_0}f(t)e^{-inomega t}dte^{inomega t}tag{8}

我们令N趋于infty ,那么omega=frac{2pi}{N} ,令omega_x=frac{2pi}{N}n=omega n

f(t)=frac{1}{T}sum^{ infty}_{n=-infty}int^{t_0 T}_{t_0}{f(t)e^{-iomega_xt}dte^{iomega_xt}}

再令F(ωt) 为f(t) 的傅立叶变换

F(omega_x)=int^{t_0 T}_{t}f(t)e^{-iomega_xt}dt tag{9}

就可以将公式8变换为

f(t)=frac{1}{T}sum^{ infty}_{n=-infty}F(omega_t)e^{iomega_xt} tag{10}

根据上面的定义,步长omega=frac{2pi}{N} ,依据积分的黎曼和表达式(积分可以视为将曲线分为很小的区间然后求和)

int^{b}_{a}f(t)dt = sum^{(b-a)/delta}_{n=0}f(a ndelta)

那么公式可以变化为

f(t)=frac{N}{2pi T}int^{ infty}_{-infty}F(omega_t)e^{iomega_xt} frac{2pi}{N}=frac{N}{2pi T}int^{ infty}_{-infty}F(omega_t)e^{iomega_xt} domega_xtag{11}

最后令Trightarrow N

f(t)=frac{1}{2pi}int^{ infty}_{-infty}F(omega_t)e^{iomega_xt} domega_xtag{12}

公式12和9就是傅立叶变换的公式了~

2.3 离散傅立叶变换(Discrete Fourier Transform)

傅立叶变换是在连续信号上计算的积分形式。在计算机中,我们拿到的是离散信号,所以需要通过DFT。

DFT是将FT的积分转换为求和形式,FT内是令步长omega_trightarrow 0 ,我们把omega_x=nfrac{2pi}{N} 带入到公式10

f(t)=frac{N}{2pi T}sum^{N}_{n=0}F(n)e^{ifrac{2pi n}{N}t} frac{2pi}{N}=frac{1}{T}sum^{N}_{n=0}F(n)e^{ifrac{2pi n}{N}t} tag{13}

Trightarrow N ,对13和9进行变化,得到DFT变化公式

begin{split} &f(t)=sum^{N}_{n=0}frac{1}{N}F(n)e^{ifrac{2pi n}{N}t} \ &F(n) = sum^{N}_{n=0}f(t)e^{-ifrac{2pi n}{N}t} \ end{split} tag{14}

2.4 快速傅立叶变换(FFT)

DFT与FFT其实是做同样的事情,只是FFT是DFT的一种快速算法。

我们要计算DFT,每个F(n) ,所以需要的时间复杂度为O(n2),但是FFT的时间复杂度只需要O(nlog2​n).

2.5 离散余弦变换(DCT)

DCT是在是在傅立叶级数展开式中,如果被展开的函数是实偶函数,那么其傅立叶级数中只包含余弦项,再将其离散化(DFT)可导出余弦变换,因此称之为离散余弦变换(DCT)。DCT是DFT的一个子集。

离散余弦变换其实是对原信号经一定处理后产生新信号的离散傅里叶变换。从原始信号到新信号的变换过程如下图所示。

原始信号先做对称变换,再平移 1/2 个单位后得到新信号。如果把原信号作为 f(x),那么新信号为g(x)=f(x-frac{1}{2}) f(-x-frac{1}{2})

直接上DCT公式:

X(k)=sqrt{frac{2}{N}}sum^{N-1}_{n=0}{x[n]a_kcos[kfrac{pi}{N}(n frac{1}{2})]}
其中a_k=begin{cases} frac{1}{sqrt{2}}& text{k=0}\ 1& text{k!=0} end{cases}

逆变换

X(n)=sum^{N-1}_{k=0}{X[k]a_kcos[kfrac{pi}{N}(n frac{1}{2})]}

今天先介绍到这里,后续继续介绍音频的MFCC特征提取以及代码实现。

参考文章:

https://zhuanlan.zhihu.com/p/75521342

https://blog.csdn.net/qq_39546227/article/details/99686160

0 人点赞