语音识别有近场和远场之分,且很多场景下都会用到麦克风阵列(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. orleans集群及负载均衡实现

    netcore6项目,微服务框架选orleans ,国内似乎没什么项目在用,坑多无资料.orleans文档可以解决几乎,只能看官方资料. Introduction | Microsoft Orlean ...

  2. CMake与OpenMP

    CMake与OpenMP cmake_minimum_required (VERSION 2.6) project (TEST) set (TEST_VERSION 0.1) set(CMAKE_BU ...

  3. Javascript实现让小图片一直跟着鼠标移动

    Javascript实现让小图片一直跟着鼠标移动实例 注意:图片可能加载不出来,注意更换 <!doctype html> <html> <head> <met ...

  4. window10教育版激活失败

    问题 输入完key之后显示无法连接服务器 再次输入密钥无效,而且家庭版密钥激活也没了 使用命令行消除过去的key,使用新的教育版key后,显示运行在运行microsoft windows 非核心版本的 ...

  5. 知识增强的预训练语言模型系列之KEPLER:如何针对上下文和知识图谱联合训练

    原创作者 | 杨健 论文标题: KEPLER: A unified model for knowledge embedding and pre-trained language representat ...

  6. linux磁盘管理(全面解析)

    目录 一:磁盘管理 1.磁盘管理作用 2.磁盘挂载顺序 3.磁盘分区 4.Linux 磁盘管理常用命令 5.磁盘分区内容 二:linux中分区的意义 三:分区的步骤与顺序 1.添加磁盘 2.查看创建新 ...

  7. Oracle dg 状态校验

    查看主库状态: select open_mode,protection_mode,database_role,switchover_status from v$database; OPEN_MODE ...

  8. 学习JAVAWEB第十八天

    今天解决了登录过程中的数据库连接池的一些问题,如本地服务器不能被访问,主要是连接池的配置文件的问题 明天做一个htm页面,不同用户的不同html页面

  9. Idea内存设置idea.vmoptions无效的解决办法

    原因:貌似是因为maven的问题 解决办法 结果

  10. LeetCode.241

    241. 为运算表达式设计优先级 题目大意 给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果.你需要给出所有可能的组合的结果.有效的运算符号包含 + - * 思路: ...