1.scipy.io.wavfile.read()
!!!This function cannot read wav files with 24-bit data.
Common data types: [1]
WAV format | Min | Max | NumPy dtype |
---|---|---|---|
32-bit floating-point | -1.0 | +1.0 | float32 |
32-bit PCM | -2147483648 | +2147483647 | int32 |
16-bit PCM | -32768 | +32767 | int16 |
8-bit PCM | 0 | 255 | uint8 |
2.librosa.load()
该函数是会改变声音的采样频率的。如果 sr 缺省,librosa.load()会默认以22050的采样率读取音频文件,高于该采样率的音频文件会被下采样,低于该采样率的文件会被上采样。因此,如果希望以原始采样率读取音频文件,sr 应当设为 None。具体做法为 y, sr = librosa(filename, sr=None)
读取之后,转化为了numpy的格式储存,而不再是音频的格式了。librosa.load()之后的数据(处于-1至1之间),与音频的原始值不同
3.pysptk.swipe()与 pysptk.rapt()
f0_swipe = pysptk.swipe(x.astype(np.float64), fs=sr, hopsize=80, min=60, max=200, otype="f0")
plot(f0_swipe, linewidth=3, label="F0 trajectory estimated by SWIPE'")
Parameters ---------- x : array A whole audio signal fs : int Sampling frequency. hopsize : int Hop size. min : float, optional Minimum fundamental frequency. Default is 60.0 max : float, optional Maximum fundamental frequency. Default is 240.0 threshold : float, optional Voice/unvoiced threshold. Default is 0.3. otype : str or int, optional Output format (0) pitch (1) f0 (2) log(f0) Default is f0.
f0 = pysptk.rapt(x.astype(np.float32), fs=sr, hopsize=80, min=60, max=200, otype="f0")
plot(f0, linewidth=3, label="F0 trajectory estimated by RAPT")
Parameters ---------- x : array, dtype=np.float32 A whole audio signal fs : int Sampling frequency. hopsize : int Hop size. min : float, optional Minimum fundamental frequency. Default is 60.0 max : float, optional Maximum fundamental frequency. Default is 240.0 voice_bias : float, optional Voice/unvoiced threshold. Default is 0.0. otype : str or int, optional Output format (0) pitch (1) f0 (2) log(f0) Default is f0.
Notes ----- It is assumed that input array ``x`` has np.float32 dtype, while swipe assumes np.float64 dtype.
4.音频信息
时域音频信息就是一个点随着时间在振膜垂直方向振动的情况,可表示为一个2D点集,采样率越高,就越接近连续曲线。
sample rate 采样率 = 对这个点所在位置测量的频率,通常就是44100Hz。
bit rate 比特率 = 采样率 * 量化精度 * 声道数,是指单位时间内处理的数据量。
buffer size = window size = 每次分析步骤所需的sample数。通常是1024或2048。
hop size = 两个相邻窗口之间错开的sample数,越小,则说明时序解析度越高,计算成本也越高。通常为buffer size的一半或四分之一。
frame size = 帧长,媒体帧的长度。
fps = 帧率。一个帧可能包含多个采样。音频基本都是这样,视频帧则一般一帧一采样。因此fps这个概念通常用于视频和游戏领域。
bit depth = 位深度,每次采样sample里包含的信息的bit数。
channels = 声道数,双声道文件大小是单声道两倍。
<---- buf_size ---->
[.....step 0.......]
<-- hop -><---- buf_size ---->
[.....step 1.......]
<-- hop -><- hop --><----buf_size ---->
[.....step 2.......]
|-------------------|------------------------>
t t+buf_size (samples)
5.音频的表示
根据傅立叶理论,任何波形的周期函数都是不同振幅、不同相位的正弦波cost(wt)的叠加。无穷多个的正弦波甚至会叠加成标准矩形波(如果以时间为x轴,振幅为y轴)。下图是不同频率振幅的正弦波叠加的直观表现。
频谱就是各频率的振幅图,即下图中的侧视图,频域为x轴,振幅为y轴。可以看到偶数参数的频率相当于cos(0t),是振幅为0的直线,不影响波形,只影响。
除了正面看的时域角度的波形图,侧面看的频域角度的频谱,还有第三个角度,从上往下看的,以频率为x轴,相位(与周期和初相相关)为y轴。
6.各种傅立叶变换
傅立叶级数在时域是一个周期且连续的函数,在频域则是一个非周期离散的函数。如下图。
傅立叶变换就是将一个时域非周期(也可以理解为周期无限大)的连续信号转换为在频域非周期的连续信号。连续信号,就相当于粒度无限细的从0到无穷大所有离散频率的组合,比如下图
很多时候在时域很难处理的事情,放到频域就很简单。比如sin3x+sin5x的时域曲线很难画出来,但频域图很容易画,两条竖线搞定。因此很多时候需要用傅立叶变换把时域表示转换成频域表示。又比如微分方程,在时域是微分和积分的操作,到频域变成乘除法。
频谱分析一般包括幅频谱和相频谱,不过常用的是幅频谱。
模拟信号(1)通过FT变换到连续的频域信号(2),于是有了模拟信号的频谱。
计算机只能处理数字信号,需要将原模拟信号在时域离散化,即在时域对其进行采样,采样脉冲序列如(3)所示,就是均匀地采样。(1)×(3)=(5),得到离散时间信号x[n],时域离散,但FT变换后频谱依旧连续。
连续的频谱仍然不能被计算机处理,需要再进行采样,得到(10)DFT(离散傅立叶变换)结果。著名的FFT就是快速计算DFT的方法,本质并非速算FT,而是速算DFT。
(10)进行逆DFT运算,得到IDFT结果,即为时域信号,它与(5)的x[n]不同,是它的周期性拓延。
DFS(离散傅立叶级数)是针对离散周期信号提出的,本质和DFT一样(截取主值空间做输入)。对(9)这种离散时域信号进行DFS即可得到(10)。
STFT(短时距傅立叶变换)是FT的变形,用于决定随时间变化的信号局部部分的正弦频率和相位。计算STFT的过程往往是将长时间信号切割成数个较短的等长信号没然后分别再计算短程的傅立叶变换,从而描绘频域与时域上的变化(相比之下,FT不能给出任何信号频率随时间改变的信息)。
能量谱(power spectrum)又叫能量谱密度,描述了信号或时间序列的能量如何随频率分布,是原信号FT之后的平方。
倒频谱(cepstrum),或者说倒谱是log(spectrum)进行IFT(傅立叶逆变换)的结果。存在complex cepstrum,power cepstrum,phase cepstrum,real cepstrum这几种。其中power cepstrum对人类语音分析很有用。原频谱上肉眼难识别的周期性信号(指的是重复出现的边频带),或者说成族的边频带谱线简化为单根谱线。所谓边频带就是以高频信号特质频率为中心,对称分布两侧的一对分量。
作者:有向无环
链接:https://www.jianshu.com/p/458251421095
来源:简书