• 用LabVIEW做声源定位系统


    前一阵子,研发部举办了为期三天的第一届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环境下运行。

    最终效果如下:

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

  • 相关阅读:
    java 多级图的最短路径
    在dos中编译java文件
    apollo客户端的长轮询机制的原理
    Apollo配置中心动态生效实现原理
    jmx_exporter+prometheus+grafana实现kafka metric监控
    XXL-JOB(1) 分布式任务系统选型和XXL-JOB介绍,这篇文章相当的经典呀
    grafana根据不同prometheus server统计数据
    XXL-JOB的使用教程
    普罗米修斯官方文档
    Prometheus标签的管理
  • 原文地址:https://www.cnblogs.com/sonwendi/p/9740400.html
Copyright © 2020-2023  润新知