Bootstrap

语音信号分析之FFT变换过程

语音信号分析从FFT变换开始

概述

语音信号是人为经过声学设备采集转换而来的便于编码、储存以及做声学处理用途抽象而成的信号。首先一段WAV音频拥有固定的几个参数用来规定语音信号的属性。正确的区分通道数、采样率、分辨率这些基本参数是语音信号分析的基本功。

语音采集

声学麦克风设备当前有很多种,普通单麦、双麦、线麦、环麦。麦克风阵列不同,对于工程上面的分析和处理有不同的实际要求。而它们在整体处理流程上面是一致的。而无论是想做AEC(声学回声消除)、GSC(旁瓣相消)、NR(噪声消除)这些基本的前端声学信号处理,都离不开一个常用的分析方法—频域分析法。想使用频域分析法,前提是要保证原始音频信号的正确性和完整性。现在多数的设备上都是通过PCM模块从底层直接给上层提供转换好的数字信号。应用层工程师可以直接用PCM原始数据进行处理和输出。

语音信号预处理

当然,很多刚开始入门的人都不太明白为什么需要将信号放在频域上面进行处理。也不知道怎么将信号从时域转换到频域。毕竟当初在学校学习微积分-拉普拉斯变换-积分变换各种数学工具时,根本不清楚这些数学工具的思想和实际用途。虽然数学是搞语音信号处理或者机器学习等热门行业的拦路虎,但是从一个点入手,把数学从实际的工程再抽象回理论,是比当初在学校中生硬的理解公式要有趣和容易的多。
声学信号处理常用的FFT点数从256-4096都有,这取决与工程中面对实际问题时的取舍和决策。而每一个FFT点数我们可以理解为是一个频点。语音信号的采样率16000是基于采样定理和人耳能分辨的最高频8k而定的。现在我们简单的跳过一系列的严谨的数学推理,简单的理解FFT就是一个工具,把连续的声学信号通过FFT变换成分辨率为256-4096不等,分别对应0-8k等分频点的数据。那么比如我想要消除直流分量,我现在可以简单的将0频点或者第一个频点的数据置零。当然,频域中的数据是用复数来表示。我们将实部和虚部的平方和简单的看做是这个频点的能量。只要这个频点的能量是0,那么就相当于我把直流分量进行了消除。那现在我们就完成了语音信号处理最简单的一个实验。
当我们想要把数据从时域转换成频域时,以单通道原始音频为例,我们没办法一口气将所有的数据一次进行处理,所以我们可以一段一段的进行。那就有了“帧”的概念,处理的一段数据就是一帧,而一帧的大小取决于我们使用的是多少点的FFT。如果我们想用256点的FFT,那么可以设定一帧数据的大小为256。当然这不是固定的,这取决于你想怎么处理你的数据。
现在我从原始的PCM数据中按照时间的顺序,截取了一帧数据。如果想事情比较严谨的人一定会想到一个问题,是不是一帧的大小决定了语音信号处理的精度呢?而每一帧做相同的处理,表面上看起来是正常不过的事。但是怎么保证前后帧的关联性呢?如果简单的处理完后,可以发现处理后的数据怎么好像是一段一段的,就像我们在P图的时候,人家会说你有“P的痕迹”。为了解决这个“P的痕迹”就需要在这帧数据进行FFT前,给它做个小小的处理。用一个函数或者映射关系将数据进行包装。这个包装过程俗称“加窗”。常用的窗函数有汉宁窗等,当我们具体做的时候就是将每一帧数据256个数,每个都乘以一个用窗函数生成的系数。另外,因为数据的精度是通过一个short字节长度来保存的,为了能够方便的计算。我们将short型的整数,缩小2^15倍数通过数据范围不超过正负1的小数来方便运算。
现在数据可以正式的做FFT运算了。

语音信号频域分析

FFT运算到底在干什么,其实说的简单些,任何一个信号都是可以用不同频率的三角函数之和给表达出来的。三角函数我们比较容易理解它有关于角频率这些概念。这个频率的系数其实就可以简单理解为不同的频率。而三角函数的幅值系数也可以表达该信号的强弱。FFT就是通过推理好的变换方式,将数据从时域映射到频域。有兴趣的童鞋可以自行去研究欧拉公式、拉普拉斯变换、傅里叶变换以及具体的蝶形运算过程的推导原理。如果只是做工程处理,其实不会推导这个过程也没关系。毕竟FFT现在的应用已经比较成熟。函数库和工具也比较完善。唯一需要深入研究的可能就是FFT的运算效率以及结合具体的项目对FFT进行优化。
现在我们得到了256个时域数据变换后的256个频域数据。而有意思的是,这256个数据由于加窗的关系是对称的。也就是说我们其实只需要处理256/2 + 1个数据就可以了。
现在我们可以对数据进行简单的处理。比如,当我们看这个数据中前10个或者20个数据的幅值远远高于后面的频点的幅值。那说明低频的信号中混合这大量的噪声。而怎么把这些噪声消除,又可以保留声音的数据不被破坏。这个就是语音信号处理工作中要研究的问题。
现在我们有两个思路可以做这个处理
1.通过消除有特征的数据信号。
2.保留有声学特征的数据信号。
生活中的噪声多数集中在低频段,如果能够把低频段中噪声都去除掉。那信号的质量就会大大提升。同时不能破坏语音信号。语音信号有自己的特征,比如谐波特性。从频谱图中可以简单的看到语音信号就是从低频到高频的柱状纹路有规律的这样的信号。保留这样特征的信号是处理噪声时需要注意的事情。

语音信号处理总结

当然,仅仅以为把噪声消除就是信号处理的所有那就太过简单了。这只是一个开始。比如,我想把两个人的人声进行区分。那这回是不是难的想要去找文献,找资料去研究了?
虽然语音处理工作繁琐又枯燥,但是如果掌握了对于频域分析和FFT这一利器,必定事半功倍。

;