前一阵子,研发部举办了为期三天的第一届Innovation Day,让大家用3天时间去完成工作之外的一些创意。有人做微信小程序,有人继续研究一些工作中用到的Tool,有人把一直想解决而没时间解决的老bug给解决掉。因为我最近忽然对室友新买的小度音响感兴趣,所以就研究了下声源定位。

言归正传,声源定位主要分为三种:

  • 基于时延估计(time-delay estimation,TDE)的算法,也叫TDOA算法(Time Difference of Arrival);
  • 基于高分辨率谱估计的算法;
  • 基于稀疏表示的算法。

本文中使用的算法是第一种,基于时延估计的算法,这种算法最经典也比较简单,适合在两天半内搞定(第三天下午要写PPT给同事们讲+演示)。

TDOA算法

基于时延估计的算法,我参考了这篇文章:https://www.cnblogs.com/ytxwzqin/p/9004603.html,采用的是远场模型。

对于一个线性排列的麦克风阵列,声音到达不同的麦克风总会有时间先后顺序。

那么我们就可以通过计算2个麦克风采集信号的相位差,从而得到声音波束相对于两个麦克风的角度。具体的原理以及公式推理在前面的参考link里都有讲。

但是在真是的设备商运行算法的时候,就需要额外考虑一些情况,比如去混响、

硬件环境

正好我们做的新产品ELVIS III也发布了,和二代不同的是,它是基于ZYNQ的处理器架构,不再是一个DAQ设备,所以可以很轻易的通过网络来访问它。由于是教学产品,所以API的风格沿用了myRIO的风格,不过功能比起myRIO丰富了很多(毕竟贵嘛)。那么就用这个新产品作为采集信号的设备吧。

麦克风选的是淘宝便宜货,大概8块钱一个的麦克风套装,一共买了4个(连经理都看不下去觉得买的太便宜能做出来效果就见鬼了)。

硬件大概是这个样子的(上下两个MIC间隔8.5cm,左右两个MIC间隔也是8.5cm):

4个麦克风模块尽量组成一个矩形。由于MIC模块的输出阻抗和AI的输入阻抗不匹配,所以串联了一个电阻。由于每个MIC模块还需要连3.3V电源和GND,所以连完线,就成了这个样子:

将4个MIC的信号输出端口连接在ELVIS III的bank A的AI0-AI3,并采用N Sample方式来采集数据,采样率为44.1KHz,每次采集200ms进行计算。

实现

由于ELVIS III是基于Linux的设备,那么首先就考虑把信号采集+算法放在RT端(设备端)实现。

RT端实现

算法的框架并不复杂,采用生产者消费者的架构,由2个while loop来实现(一个loop不断的采集数据,另外一个loop不断地处理数据)。但是在实现过程中,遇到了一个最大的问题——RT上跑算法速度并不快,尤其是跑互相关算法很慢,完全没办法实时,所以此路不通。

PC+RT实现

那么换个思路,我们可以把信号采集的部分放在ELVIS III上面跑,然后利用PC强大的计算能力(i7-4790k, 32G内存)来做后面的算法处理。那么设备上只需要跑我们的采集数据的API,然后通过VI server以RPC的方式去返回数据给PC,然后PC再进行数据处理。

所以整个思路就变成这样:

  1. 用ELVIS III采集4个通道的MIC数据,采样率44.1KHz,采样时间200ms。然后讲采集到的数据返回给PC。
  2. PC端采集到完整的200ms数据后,就进行数据处理。
  3. 数据处理包括:
    1. 活动信号检测:把200ms原始信号滤波后,分成10份,分别计算其能量,当超过一定阈值的时候就认为有活动信号。
    2. 时延计算:这里取了个巧,用了声音与震动Toolkit里的一个现成的API,直接可以得到delay,不需要自己吭哧吭哧的再实现了

    3. 声音方位角计算:得到time delay,知道声速,也知道几个MIC的坐标,就可以用数学方法很容易的计算出角度了。

整个Main程序的后面板是这样子的:

可以看到,采用的依旧是生产者消费者模型,只不过数据采集已经是采用了RPC方式。所以只要ELVIS III和你的PC是同一个局域网,就可以远程的采集数据并处理。而且,你的这个程序是不需要Deploy到target上面去运行的,完全可以在Desktop环境下运行。

最终效果如下:

界面略微有点丑,效果就是在某个方向大喊一声,或者用力的拍一下手,可以显示出来方位。

用LabVIEW做声源定位系统的更多相关文章

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

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

  2. iOS 定位系统 知识

    最近在做考勤定位系统 总结一些定位系统的知识. 后期会出一份算法主要攻克地球坐标和火星坐标转换的 1.关于百度的火星坐标定位策略 地图SDK/定位SDK的定位策略: WIFI + 基站 +GPS 三者 ...

  3. Python中导入第三方声源库Acoular的逻辑解释以及Acoular的下载

    [声明]欢迎转载,但请保留文章原始出处→_→ 秦学苦练:http://www.cnblogs.com/Qinstudy/ 文章来源:http://www.cnblogs.com/Qinstudy/p/ ...

  4. LabVIEW上位机与串口通信

    渊源 大一的时候,学校开了门公共选修课,叫LabVIEW编程,当时的我当然还不知道LabVIEW是啥东东,但还是选了.上课的老师是机械学院的一个副教授.他给我们展示了好几个用LabVIEW做的项目.譬 ...

  5. 从LabVIEW到C++

    前言 最近一段时间一直没有更新,一方面是时间精力的问题(PS:懒癌犯了),另一方面是小黑大部分的时间都在学习C++相关知识,恶补了许多的知识(从大学C语言水平强制拔高了一段). 本文谈谈自己近期的一些 ...

  6. 【LabVIEW技巧】你可以不懂OOP,却不能不懂封装

    前言 大多数写LabVIEW程序的工程师都不是一个纯软的工程师,很多做硬件的.做机械的.甚至学化学的也会学习LabVIEW. 由于主要重心不在软件,所以LabVIEW程序基本上能用行,也就得到入门容易 ...

  7. 语音跟踪:信号分解、锁相、鸡尾酒会效应、基于PR的信号分离

    NLP中关于语音的部分,其中重要的一点是语音信号从背景噪音中分离.比如在一个办公室场景中,有白天的底噪-类似于白噪音的噪音.空调的声音.键盘的啪啪声.左手边45度7米元的地方同事讨论的声音.右手边1. ...

  8. 使用LabVIEWPC的制备

    使用LabVIEWPC的制备 1.下载.安装LabVIEW 如今,互联网搜索,你可以搜索出一大推LabVIEW下载并安装破解教程.因此,这里没有具体描述的.请自行百度~~.另外.提醒一下,下载LabV ...

  9. labview--http协议数据交互

    最近接了一个项目,需求是要将采集到的数据,以以下要求上报,并且提供接口供上层系统下发指令. 采用restful的http协议进行交互: 输入输出参数皆为json体. 响应包含三部分: Code:业务码 ...

随机推荐

  1. December Challenge 2019 Division 1 题解

    传送门 当我打开比赛界面的时候所有题目都已经被一血了-- BINXOR 直接把异或之后二进制最多和最少能有多少个\(1\)算出来,在这个范围内枚举,组合数算一下就行了.注意\(1\)的个数是\(2\) ...

  2. mpvue图片上传

    mpvue小程序项目中的图片上传 我的csdn博客地址:https://blog.csdn.net/zmkyf1993 一般我是优先更新csdn内容,然后在拷过来的. 效果图 通过mpvue文档得知他 ...

  3. planning algorithms chapter 1

    chapter 1 介绍 什么是规划? 在机器人领域,运动规划和轨迹规划主要用来解决"怎么移动钢琴"的问题,这个问题是如何将钢琴从一个房间移动到另一个房间,并且保证钢琴不和其他事物 ...

  4. 前端微服务初试(singleSpa)

    1.基本概念 实现一套微前端架构,可以把其分成四部分(参考:https://alili.tech/archive/11052bf4/) 加载器:也就是微前端架构的核心,主要用来调度子应用,决定何时展示 ...

  5. Java将list<map>或者list<entity>集合根据指定字段排序

    今天项目中用到了,特记录一下 一. List<Map> 如果 item.get(sortField) 有时间,有数字的时候直接toString(),数组结果的排序结果可能不正确 List& ...

  6. getaddrinfo工作原理分析

    getaddrinfo工作原理分析 将域名解析成ip地址是所有涉及网络通讯功能程序的基本步骤之一,常用的两个接口是gethostbyname和getaddrinfo,而后者是Posix标准推荐在新应用 ...

  7. vue的跳转方式(打开新页面)及传参

    1. router-link跳转 // 直接写上跳转的地址 <router-link to="/detail/one"> <span class="sp ...

  8. Mysql 查询今天,这周,这个月,今年的数据

    今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ...

  9. kaggle, gmail, 烟雨朦胧

    kaggle, gmail, 烟雨朦胧 刚才为了体验kaggle,用gmail重新登录,需要验证十几年前在桂林使用的手机号,竟然找到了,终于又可以上了. 那是一个在烟雨江南里努力奋斗而又迷失自我不堪回 ...

  10. Springboot 条件注解

    @Conditional 根据满足某一个特定条件创建一个特定的 Bean.就是根据特定条件来控制 Bean 的创建行为,这样我们可以利用这个特性进行一些自动的配置 Springboot 中大量用到了条 ...