语音识别有近场和远场之分,且很多场景下都会用到麦克风阵列(micphone array)。所谓麦克风阵列是一组位于空间不同位置的麦克风按一定的形状规则布置形成的阵列,是对空间传播声音信号进行空间采样的一种装置,采集到的信号包含了其空间位置信息。近场语音识别将声波看成球面波,它考虑各麦克风接收信号间的幅度差;远场语音识别将声波看成平面波,它忽略各麦克风接收信号间的幅度差,近似认为各接收信号之间是简单的时延关系。麦克风阵列可分为一维、二维和三维麦克风阵列。一维麦克风阵列,即线性麦克风阵列,各个麦克风位于同一条直线上,常见的为均匀线性阵列(Uniform Linear Array,ULA),如图1所示(以阵列有四个麦克风为例)。均匀线性阵列是最简单的阵列拓扑结构,其麦克风之间距离相等、相位及灵敏度一致。线性阵列只能得到信号的水平方向角信息。二维麦克风阵列,即平面麦克风阵列,各个麦克风分布在一个平面上。常见的为均匀圆阵,麦克风均匀的分布在圆周上,如图1所示(以阵列有四个麦克风为例)。平面阵列可以得到信号的方位角和俯仰角信息。三维麦克风阵列,即立体麦克风阵列,其阵元中心分布在立体空间中,常见的为球阵。由于三维麦克风阵列在消费电子产品中应用相对较少,本文不讨论。

图 1

麦克风阵列涉及到的技术包括去混响、声源定位、波速形成(beamforming)和单通道降噪等。混响是指声音信号遇到墙壁、天花板、地面等障碍物形成反射声,并和直达声相叠加的现象。去混响就是去除那些叠加的声音。声源定位是利用多通道语音信号来计算目标说话人的角度和距离从而实现对目标说话人的跟踪,严格的声源定位是指同时确定说话人的角度(包括方位角、俯仰角)和距离。在消费级的麦克风阵列中,通常关心的是声源到达的方向,也就是波达方向(Direction of Arrival,DOA)。波束形成是对信号进行空域滤波,将多个通道的语音数据变成一个波束(即一个通道)的目标声源,目标声源的信干噪比(SINR)得到提升。单通道降噪是抑制单个通道上的噪声。各个模块的关系如下框图2所示(以四通道为例):

图 2

从上图可以看出,先对每个通道上的语音数据做去混响,同时用每个通道上的语音数据做声源定位得到说话人的角度(方位角和俯仰角等),然后用去混响后的语音数据和算出的说话人的角度去做波束形成得到单通道的语音数据,最后对单通道的语音数据做降噪给后续模块使用。我在“远场关键词识别”项目中主要负责单通道降噪。后来由于人手不够,我又负责了波束形成的一种算法(有多种算法可以实现波束形成功能,不同的算法用在不同的应用场景中),即DSB(delay and sum beamforming)算法。本文就讲讲DSB的原理和实现。

波束形成对多通道语音信号进行合并处理,抑制非目标方向的干扰信号,增强目标方向的语音信号。它的输入是麦克风阵列采集的多通道语音信号,它的输出是增强后的单通道语音信号。示意如图3。

图 3

波束形成的算法一般可分为固定波束形成算法和自适应波束形成算法。固定波束形成算法典型的是DSB(Delay and Sum Beamforming),而自适应波束形成算法典型的是MVDR( (minimum variance distorionless response,最小方差无失真响应)。 DSB可以算是最简单的波束形成算法了,它主要分两步,一是各通道语音信号在时间上对齐,二是对各通道语音信号做加权求和,得到单通道语音信号。

先看各通道语音信号在时间上对齐。上文说远场中近似认为各麦克风接收到的声波之间是简单的时延关系,即各麦克风接收到的同一声波在时间上是有先后顺序的,示意如图4。

图 4

时间对齐就是使各个麦克风接收的来自目标方向的语音能够在时间上同步。该步需要事先知道到达时间差(TDOA, Time Difference Of Arrival),到达时间差可以根据声源定位算法里求出的方位角和俯仰角以及其他的参数求得。 先看均匀线性阵列时间延时的计算。它通常以最先接收到语音信号的麦克风为参考点。如图5所示,平面波被麦克风接收时与垂直于麦克风直线的方向的夹角为θ,显然麦克风1最先接收到声波,就以麦克风1为参考点,麦克风4最后接收到声波。设麦克风之间的距离为d,所以声波到麦克风2比麦克风1多走了l距离, l = dsinθ。又设光速为c,所以声波到达麦克风2比麦克风1延迟了l/c = dsinθ/c 秒。由于是均匀线阵,每个麦克风之间均延时了l/c秒。

图 5

再看均匀圆阵的时间延时的计算。图6是均匀圆阵模型:

图 6

在图6中,信号源映射到XY平面上与X轴的夹角为方位角,表示为α,信号源与Z轴的夹角为俯仰角,表示为θ。各个麦克风均匀的分布在圆周上,以圆心O为参考点计算延时。图7中M轴是信号源射入的方向映射到XY平面上,N轴与M轴垂直。

图 7

可知圆周上的麦克风A与其垂直于M轴的A',声波到达的时间一样。A'与圆心O同在M轴上,算A'与O点的延时同均匀线阵。对同一信号源,在N轴右下方的早于圆心O到,在N轴左上方的晚于圆心O到。先求得OA'之间的距离d,延时τ就可以得到了(计算同均匀线阵一样,τ = dsinθ/c, θ为信号源与Z轴的夹角,即俯仰角)。下面看d怎么求。在均匀圆阵上任何位置上计算d的方法都是一样的,数学表达式也是一样的。还是以上图中的A点为例,如图8。

图 8

A点映射到M轴上是点A’,d即为OA’的距离。设共有N个麦克风,A点处为第n个,A处的麦克风的方位角为α(方位角为信号源映射到XY平面上与X轴的夹角),∠AOX = 2*pi*n/N (X轴的方向为角度0), 令β = ∠AOA’= ∠AOX – α= 2*pi*n/N – α。所以OA’= OA*cosβ =  R*cos(2*pi*n/N– α),R表示圆阵的半径。所以延时τ = OA’*sinθ = R*cos(2*pi*n/N – α)sinθ/c。τ > 0表示相对于圆心O信号提前到,τ < 0表示相对于圆心O信号延时到。

各个通道的延时得到了,信号在时间上就可对齐了。设Sn(t)表示第n个通道得到的声音信号,那么S1(t + τ1)和S2(t + τ2)及Sn(t + τn)等表示做好时间对齐后的信号。信号对齐好后就可以做第二步,即加权求和,表达式如式1:

其中S(t)表示做完加权后的单通道数据,Sn(t + τn)表示各个通道时间对齐后的信号,γn表示权重,最简单的可以令每个权重值均相同,即γn = 1/N。

原理讲完了,是在时域下讲的。下面看怎么做软件实现,实现是在频域下做的。用到傅里叶变换的性质:令S(t)的傅里叶变换为S(ω),则S(t + τ)的傅里叶变换为S(ω)ejωτ。时域单通道输出的表达式是式1,对其做傅里叶变换,得到频域单通道输出的表达式式2:

其中ωk为一个具体的频点。得到S(ωk)后再做反傅里叶变换,就是时域的值了。

因此DSB算法实现步骤如下:

1) 对时域的Sn(t)做傅里叶变换得到频域值Snk)

2) 根据声源定位算法得到的方位角和俯仰角以及其他等得到延时τn

3) 根据τn得到导向矢量(steering vector)ekτn

4) 根据式2得到S(ωk)

5) 做傅里叶反变换得到S(t)

麦克风阵列波束形成之DSB原理与实现的更多相关文章

  1. 【麦克风阵列增强】Delay and sum beamforming

    作者:桂. 时间:2017-06-03  15:40:33 链接:http://www.cnblogs.com/xingshansi/p/6937576.html 前言 本文主要记录麦克风阵列的几个基 ...

  2. 基于麦克风阵列的声源定位算法之GCC-PHAT

    目前基于麦克风阵列的声源定位方法大致可以分为三类:基于最大输出功率的可控波束形成技术.基于高分辨率谱图估计技术和基于声音时间差(time-delay estimation,TDE)的声源定位技术. 基 ...

  3. 【论文:麦克风阵列增强】An alternative approach to linearly constrained adaptive beamforming

    作者:桂. 时间:2017-06-03  21:46:59 链接:http://www.cnblogs.com/xingshansi/p/6937259.html 原文下载:http://pan.ba ...

  4. 【论文:麦克风阵列增强】An Algorithm For Linearly Constrained Adaptive Array Processing

    作者:桂. 时间:2017-06-03  15:06:37 链接:http://www.cnblogs.com/xingshansi/p/6937635.html 原文链接:http://pan.ba ...

  5. 【论文:麦克风阵列增强】Signal Enhancement Using Beamforming and Nonstationarity with Applications to Speech

    作者:桂. 时间:2017-06-06 13:25:58 链接:http://www.cnblogs.com/xingshansi/p/6943833.html 论文原文:http://pan.bai ...

  6. 【论文:麦克风阵列增强】Microphone Array Post-Filtering For Non-Stationary Noise Suppression

    作者:桂. 时间:2017-06-08  08:01:41 链接:http://www.cnblogs.com/xingshansi/p/6957027.html 原文链接:http://pan.ba ...

  7. 【论文:麦克风阵列增强】Speech Enhancement Based on the General Transfer Function GSC and Postfiltering

    作者:桂. 时间:2017-06-06  16:10:47 链接:http://www.cnblogs.com/xingshansi/p/6951494.html 原文链接:http://pan.ba ...

  8. 十字线阵---CBF,传统波束形成

    %传统波束形成,CBF (Ps:这个程序是别人的,不是我写的,但是具体是在哪里找到的已经忘了) clear all; close all; clc; %---------初始化常量---------- ...

  9. JavaCV FFmpeg采集麦克风PCM音频数据

    前阵子用一个JavaCV的FFmpeg库实现了YUV视频数据地采集,同样的采集PCM音频数据也可以采用JavaCV的FFmpeg库. 传送门:JavaCV FFmpeg采集摄像头YUV数据 首先引入 ...

随机推荐

  1. HBase环境搭建(hbase1.2.5+zookeeper3.4.6)

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6627857018461880836/ 系统版本,Hadoop已安装完成 Mysql安装完成 Hive版本 Sqoo ...

  2. 文件上传之结合phpinfo与本地文件包含利用

    背景 某站点存在本地文件包含及phpinfo,可以利用其执行脚本. 原理 原理: 利用php post上传文件产生临时文件,phpinfo()读临时文件的路径和名字,本地包含漏洞生成1句话后门 1.p ...

  3. 【PTA】6-2 读文章(*) (31 分)

    请编写函数,从文件中读出文章,将其输出到屏幕上. 函数原型 void ReadArticle(FILE *f); 说明:参数 f 为文件指针.函数读出 f 所指示文件中的文章,将其输出到屏幕上. 裁判 ...

  4. python环境搭建以及jupyter notebook的安装和启动

    一.Python 环境搭建 本章节我们将向大家介绍如何在本地搭建Python开发环境. Python可应用于多平台包括 Linux 和 Mac OS X. 你可以通过终端窗口输入 "pyth ...

  5. Solon Web 开发,五、数据访问、事务与缓存应用

    Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...

  6. Solon Web 开发,七、视图模板与Mvc注解

    Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...

  7. 【解决了一个小问题】golang go.mod中多了一个斜杠导致replace无效

    replace github.com/sxxx/common_lib/src/ => ../../common_lib/src 修改成 replace github.com/sxxx/commo ...

  8. 猪齿鱼 Choerodon 的数据初始化设计解析

    数智化效能平台猪齿鱼Choerodon 作为一个微服务框架,需要解决微服务数据初始化本身具有的问题和复杂性,同时也需要满足框架本身特有的数据初始化需求,下面为大家介绍一下这方面的设计思想和实现. 微服 ...

  9. 微信小程序-国际化(miniprogram-i18n)

    前情提要 最近维护了一个微信小程序的老项目,维护的其中一项是添加国际化.由于踩了蛮多坑,所以就有了这篇文档!!! miniprogram-i18n 对除小程序外的其他框架开发做过国际化的朋友来说i18 ...

  10. vue学习4-class和sytle绑定

    #### Class绑定: 1. 通过数组的方式来实现: 2. 通过对象的方式来实现: 通过对象: 通过数组,通过数组是把多个style样式对象添加进去: