音频信号处理入门
普及知识
什么是信号分析?
将一个复杂信号分解成若干简单信号分量之和,或者用有限的一组参量去表示一个复杂波形的信号,从这些简单的分量组成情况去考察复杂信号的特性。
对信号分析的过程实际上就是一个特征提取的过程,从一段复杂的波形中提取我们需要的信息。
为什么要分析信号?
- 信号分析是获取信号特征信息的重要手段,通过信号分析,可以得到复杂信号的基本特征。
- 信号分析是获取信号源特征信息的重要手段,可以通过对信号特征的详细了解,得到信号源特性、运行情况等信息。
- 深度学习的第一步是要收集数据的特征(feature)。所以需要通过信号分析,提取数据集特征。
怎样进行信号分析?
信号分析方式────根据信号的类型选择
- 信号平稳────由于信号不随时变化,可以在时域和频域直接分析;
- 信号不稳────由于信号随时变化,需要将信号拆解分析
- 时间维度拆解,利用平均瞬时功率信号,可以知道信号传播规律
- 频域维度拆解,按照不同频带的滤波器进行滤波处理
- 时频域纬度拆解,同时包含信号随时间和频域变化的规律
信号的频域拆解
信号的频率成分
- 任何信号都可以看作是多个不同频率的简单波形(如正弦波)的叠加
- 每个频率的波形都有其特定的振幅
包络(Envelope)
包络是在信号处理中描述信号强度变化的曲线或轮廓。
包络曲线是在信号波形的最高点和最低点之间绘制一条平滑曲线,它可以用来描述信号的振幅随时间变化的趋势.
包络有助于捕获信号的宏观变化特征,忽略瞬时波动,适合分析具有调幅特性或其他周期性变化的信号。
精细结构
指音频中的高频细节,如每个振动周期内的变化。
信号的包络结构和精细结构与信号频率的关系
多个不同频率信号的叠加,由于和差化积,会形成包络结构和精细结构。
决定包络结构(261.63Hz):
决定精细结构(3401.19Hz):
信号的包络结构是由低频信号决定的,信号的精细结构是由高频信号决定的。
在语音识别中,主要通过信号的包络结构来区分不同的音频信号,因此在识别领域更关注低频的作用。
信号的时域分析
分帧(framing)
什么是分帧?
分帧是指:将信号按照时间尺度分割,划分为多个较短的、固定长度的帧。
也就是将信号按照时间尺度划分成多个段,每一段的长度就是帧长frame_size。
分出的段的数量,就是帧的个数frame_num。
如果不考虑重叠分帧,则该信号的总采样点数为frame_size * frame_num。
为什么要分帧?
由于音频信号是一个随时间变化的连续信号,而我们通常需要在一个较短的时间窗口内去分析,来捕捉信号的时间变化特性。
分帧重叠(Overlapping)
分帧重叠是指相邻帧之间存在部分重叠,这样可以确保帧与帧之间的过渡区域不会丢失重要信息。重叠部分有助于平滑的过渡,减少由分帧引入的边界效应。
重叠大小(Overlap Size):相邻帧之间重叠的样本数
帧移(Hop Size):每次移动的样本数,即相邻帧的开始位置之间的距离。
帧数计算公式
设:
- \(N\)为音频信号的总样本数
- \(L\)为每帧的长度
- \(O\)为帧与帧的重叠大小
帧移(Hop Size)可以表示为:
帧数\(F\)的计算公式为:
公式推导
为了计算帧数,我们需要知道音频信号在分帧后的帧数。
基本思路是:从信号起始位置开始,每次移动帧移(H)个样本,直到覆盖整个信号。
假设有总样本数\(N\),帧长度\(L\),重叠大小\(O\),帧移\(H=L-O\)。
-
初步分析:
我们要覆盖从0到\(N-1\)的所有样本,从而计算总的帧移动次数。考虑到帧开始的位置
- 第一个帧的起始位置:\(0\)
- 第二个帧的起始位置:\(H\)
- 第三个帧的起始位置:\(2H\)
- ...
- 第k个帧的起始位置:\((k-1)H\)
-
覆盖整个信号
为了覆盖整个信号,我们希望最后一个帧的起始位置满足:\((k-1)H + L\ge N\)
也就是说,k必须满足:\(k\ge \frac{N-L}{H}+1\)
-
得出总帧数计算公式
为了确保所有的信号样本的覆盖,我们需要向上取整:
\[F=\left\lceil\frac{N-L}{H}+1\right\rceil \]由于\(H=L-O\),化简得:
\[F=\left\lceil\frac{N-O}{H}\right\rceil \]
幅值包络(Amplitude Envelope)
幅值包络是描述信号振幅随时间变化的曲线,能够反映一个信号整体的振幅结构。
幅值包络是一条平滑的曲线,代表信号在每个时间点的最大幅值,它定义了信号振幅的外部轮廓轨迹。
时域与频域的关系
相位与振幅
正弦波就是一个圆周运动在一个二维平面的投影。
任意时刻的相位:\(\phi\)
任意时刻的幅度:\(\sin{\phi}\times振幅A\)
频域的基本单元
频域的基本单元可以理解为一个是始终在旋转的圆。
快速傅里叶变换(Fast Fourier Transform)
FFT可以将信号从原始域(通常是时间或空间)转换到频域或逆转换回来。
任意波形的FFT
相位差
相位差不是时间差,通过求时间差占周期的比例,乘\(2\pi\)就得到了相位差。
频谱图(Spectrogram)
频谱图通常用来表示信号在频域上的能量分布。
它显示了信号各个频率分量的振幅或功率。一般是针对整个信号,或者某一个固定时间窗口。
频谱图是一个二维图像,横轴是信号频率,纵轴是信号振幅。
语谱图
语谱图是频谱图在时间轴上的延伸。
时频域分析
为什么不能只依靠频域分析?
频谱虽然可以看出信号的频率分布,但是由于丢失了时域信息,因此无法看出频率分布随时间的变化。
时域分析方法
幅值包络法
其余方法待续
时频域分析方法
短时傅里叶变换(STFT)
短时傅里叶变换(Short-Time Fourier Transform,STFT)
小波变换(WT)
Wigner分布
声音
声音包括两个基本属性:频率和振幅
角频率
角频率与频率的关系:
简单理解:
\(\omega\)表示rad/s,f表示完成多少次/s,那么每转完一圈,也就是走了2\(\pi\)rad,就完成了一次。因此
即
响度(Loudness)
响度是指人耳对声音强弱的主观感受。
它不仅与声音的物理属性有关,还与人耳的感知特性有关。
响度的主观感受取决于多个因素,包括声压级(Sound Pressure Level, SPL)、频率和时间等。
声压级
声压级是声音强度的一个物理量,通常以分贝(dB)为单位。
声压级越高,响度感知通常越大。
频率
人耳对不同频率的声音敏感度不同。
一般来说,人耳对1kHz到4kHz之间的声音最为敏感。
同样声压级的声音,在这个频率范围内会会被感知为更响。
时间
持续时间对响度感知也有影响。
持续时间较短的声音可能会被感知为不如等声压级的长时间声音响。
人耳的非线性特征
人耳的响度感知是非线性的。
这意味着响度的增加与声压级的增加不是简单的线性关系。
通常使用等响曲线(Fletcher-Munson曲线)来描述这一特性,这些曲线显示了人耳在不同频率下对相对响度的感知。
频谱
频谱就是频域图像
频域
可以把某一时刻的声波拆分成一系列不同频率的正弦波,
频域关注的就是每个频率的正弦波的振幅(或者相位)
时频谱
Time-Frequency Spectrum
一个用来表示信号在时域和频域属性的工具,它能在同时考虑时间和频率的情况下分析信号。
音频遮掩效应
功率谱 (Power Spectrum)
什么是功率?
在信号处理中,功率通常表示信号的能量。
对于一个频率成分,功率通常是该频率成分振幅的平方。
什么是功率谱?
功率谱是描述信号在不同频率下功率分布的图像或函数。
它揭示了信号的频率成分及对应的能量大小。
功率谱通常用来分析信号的频率特性,比如找出信号中的主要频率成分、噪声特性等
如何计算功率谱?
- 对信号做傅里叶变换:对时域信号进行傅里叶变换,得到频域表示。
- 计算功率谱密度:将傅里叶变换结果的振幅平方来计算功率谱密度(Power Spectral Density)。
- 归一化:有时需要对功率谱进行归一化处理,便于比较不同信号的功率谱。
梅尔频谱
梅尔刻度
梅尔刻度(mel scale)是一种基于频率定义的非线性刻度单位,目的是表示人耳对音高(pitch)等距变化的感官。
梅尔刻度与线性的频率刻度────赫兹(Hz)之间可以进行近似的数学运算,用来表述声音频率与人类感知的关系。
频率f与梅尔刻度m的转换公式
梅尔刻度将1000Hz,且高于人耳听阈值40分贝的声音信号,定为1000mel的参考点。在频率500Hz以上时,随着频率的增加,人耳每感觉到等量的音高变化,所需要的频率变化愈来愈大。这导致在赫兹刻度500Hz往上的四个八度(一个八度即为两倍的频率),只对应梅尔刻度上的两个八度。Mel的名字来源于单词melody,表示这个刻度是基于音高比较而被创造的。
什么是梅尔频谱?
梅尔频谱(Mel Spectrum)是将声音信号的频谱通过梅尔刻度进行转换后得到的结果,更贴近人类的听觉感知特性。在语音识别、语音合成等领域有重要应用。
动态时间规整(DTW)
常见音频文件
- wav
- mp3
- ogg
- wma
- flac
如何让计算机听懂语音?
语音信号是模拟量,通过采样、量化、编码可以将模拟量转换为数字量
采样率(Sample rate)
单位时间内从连续信号中采样的次数
奈奎斯特定理
只要采样频率大于等于采样信号中最高频率的两倍,原信号既可无失真恢复
即 音频文件能达到的最高频率是其采样率的一半
与音频相关的库
librosa
[!NOTE]
旧版本只支持wav,可以使用ffmpeg将其他类型的音频文件转换成wav(新版本自带ffmpeg)
librosa.effects.trim // 消除音频前后静音部分
librosa.effects.split // 找到所有非静音的下标区间
librosa.effects.remix // 根据多个下标区间来截取音频,与split结合可以消除音频中所有的静音部分
audioread
wave
soundfile
scipy
pyaudio
与音频相关的领域
语音合成TTS
Text-To-Speech
简单实现:将处理的文本作为输入,输出对应音频的频谱,再由频谱转化成声音
作用:将文本转换成口语
用途:
- 虚拟助手
- 有声读物
- 无障碍
常见的TTS系统:
WaveNet | |
---|---|
GPT |
语音识别ASR
Automatic-Speech-Recognition
音乐生成
声音分析与处理
语音转换VC
voice conversion