语音识别有近场和远场之分,且很多场景下都会用到麦克风阵列(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. 【记录一个问题】go1.17中,把代码文件放在main.go的同级目录,导致无法编译

    写了类似目录结构的代码: myproxy - main.go - server.go 编译的时候总是出现main.go中找不到类型定义.但是用goland却可以直接执行. 最后调整了目录结构后解决: ...

  2. IDEA2017 maven Spark HelloWorld项目(本地断点调试)

    作为windows下的spark开发环境 1.应用安装 首先安装好idea2017 java8 scalaJDK spark hadoop(注意scala和spark的版本要匹配) 2.打开idea, ...

  3. 使用Xamarin开发移动应用示例——数独游戏(一)项目的创建与调试

    最近项目中需要移动客户端,由于团队基本上使用.Net产品线,所以决定使用Xmarin进行开发,这样技术路线统一,便于后期维护.官网上是这样介绍的" Xamarin 允许你使用 .NET 代码 ...

  4. js生成指定范围的随机整数

    定义一个random()函数,原理是 随机数和最大值减最小值的差相乘 最后再加上最小值. function random(min, max) { return Math.floor(Math.rand ...

  5. Nginx代理常用参数

    目录 一:Nginx代理常用参数 1.添加发往后端服务器的请求头信息 二:参数案例 1.lb01配置文件 2.web01 web02 web服务器 3.测试 4.重启 5.DNS域名解析 6.网址测试 ...

  6. 使用Canny+hough实现钱币检测

    目录 Canny边缘提取算法实现 霍夫变换实现 参考 这个是北京邮电大学<计算机视觉>的一门作业: Canny边缘提取算法实现 首先定义一个Canny类 其init函数是: class C ...

  7. mybatis 配置文件 简单介绍

    配置文件? 一. properties属性:可以引入外部的属性文件,可以自定义属性信息,供后续的节点使用: 注意!外部文件 定义在SRC目录下 否则找不到资源.二. settings设置:全局的配置信 ...

  8. 如何在pyqt中实现亚克力磨砂效果的QLabel

    前言 Windows10 在 UWP 应用中支持亚克力画刷,可以在部件的底部绘制亚克力效果的背景图.下面我们使用 QLabel 来模拟这个磨砂过程. 实现方法 MSDN 文档中介绍了亚克力材料的配方, ...

  9. ApacheCN 数据科学译文集 20211109 更新ApacheCN 数据科学译文集 20211109 更新

    计算与推断思维 一.数据科学 二.因果和实验 三.Python 编程 四.数据类型 五.表格 六.可视化 七.函数和表格 八.随机性 九.经验分布 十.假设检验 十一.估计 十二.为什么均值重要 十三 ...

  10. 布客&#183;ApacheCN 编程/后端/大数据/人工智能学习资源 2020.9

    公告 ApacheCN 项目的最终目标:五年内备份并翻译 Github 上的所有教程(其实快被我们啃完了,剩下的不多了). 警告各位培训班:对 ApacheCN 宣传文章的举报,也将视为对 Apach ...