麦克风阵列声源定位实现[通俗易懂]

麦克风阵列声源定位实现[通俗易懂]麥克風陣列音源定位系統是利用麥克風陣列接收音訊,然後經由適當的演算法估算出音源入射麥克風陣列的方向角,即判斷出音源的位置方向。本專題著重於此演算法的程式撰寫,並實際測試二維及三維空間中單一音源入射的方向角,期望於演算速度及準確度上能有最好的效果。此系統完成後可搭配攝影機應用於視訊會議,隨時定位出發言者;也可應用於監視系統、玩具等。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

麥克風陣列音源定位系統是利用麥克風陣列接收音訊,然後經由適當的演算法估算出音源入射麥克風陣列的方向角,即判斷出音源的位置方向。本專題著重於此演算法的程式撰寫,並實際測試二維及三維空間中單一音源入射的方向角,期望於演算速度及準確度上能有最好的效果。此系統完成後可搭配攝影機應用於視訊會議,隨時定位出發言者;也可應用於監視系統、玩具等。 
麥克風陣列音源定位系統主要是利用同一音源到麥克風陣列中每支麥克風的距離不全相同,因此同一音源的訊號傳遞到每支麥克風會有時間差TDOA ( Time Difference of Arrival ),利用求得的TDOA,代入推論出的方向角公式即可得到音源入射的方向角。而本專題著重於估算TDOA及方向角公式的演算法上,我們使用兩種演算法實作測試,其中一種演算法只適用於二維空間,而另一種適用於二維或三維空間的音源定位。

有許多相關的論文是以頻域的方法分析,但若要將此系統實作在微處理器上,運算較簡單時域分析方法會有較好的效用,且對初學訊號分析的我們來說也較容易實現,所以我們主要以時域的方法來建立演算法。

此系統主要的實作流程為:「語料取樣」、「訊號前處理」、「估算TDOA」、「計算方向角」。下圖1-1為麥克風陣列音源定位系統流程圖,詳細說明如下:
  1. 由兩支以上麥克風組成麥克風陣列接收音訊。

  2. 麥克風接收的訊號經過一放大器後,再經由四輸入USB動態訊號擷取模組,依設定的取樣頻率取樣訊號,輸入電腦分析。

  3. 將每支麥克風接收的訊號音量標準化,並切割成多個音框(frame)。

  4. 設定音量門檻值,去除音量小的部份。(算出一段訊號中所有音框的音量,取其中音框音量最小值的k倍為門檻值,k值由經驗得到。)

  5. 以Cross Correlation的方法估算TDOA。

  6. 將求得的TDOA代入方向角公式,即可得到音源入射的方向角。
    这里写图片描述
    TDOA的計算方法:

TDOA (Time Difference of Arrival) 是指同一音源的訊號傳遞到兩支麥克風的時間差由麥克風所取樣的訊號來估算。而時域上常見的計算方法有四種:AMDF(Average Magnitude Difference Function)、ratio AMDF、最小平方法、Cross Correlation。我们採用最常見且穩定性高的Cross Correlation。

Cross Correlation

x1及x2為兩支麥克風所取樣到的兩段訊號,經由下式可算出所對應λ值的cross correlation值。
这里写图片描述(1)

这里写图片描述

最大合理平移範圍當音源與兩支麥克風的中心成90度時(音源與兩支麥克風距離相等),音源傳遞到兩支麥克風的時間差為0;當音源與兩支麥克風三者成一直線時,音源傳遞到兩支麥克風的時間差最大。 

这里写图片描述

假設聲速為v,兩支麥克風距離為m,取樣頻率為 fS,則最大合理平移範圍為:( m / v ) × fS單位為取樣點數(sample)。                                             
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/192635.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • C++中的空类默认包含哪些类成员函数

    C++中的空类默认包含哪些类成员函数

  • 操作系统–银行家算法c语言代码

    操作系统–银行家算法c语言代码直接上代码了,两个文件分别是main.c和banker.hmain.c#include#include#include”banker.h”//试探分配voidProbeAlloc(intprocess,RESOURCE*res){Available.A-=res->A;Available.B-=res->B;

  • 彻底弄懂C语言数组名

    彻底弄懂C语言数组名先定义一个一维数组inta[]={0,1,2,3,4,5,6,7,8,9};一、数组名是什么数组名的值是数组首元素的指针常量。数组名不是指针,但大多数使用到数组名的地方,编译器都会把数组名隐式转换成一个指向数组首元素的指针来处理。只有两种情况下例外:第一种是对数组名使用sizeof运算符sizeof(a)这将会得到整个数组所占的内存大小,a是长度为10的int(4字节

  • 中介者模式和观察者模式的区别_序列中介作用

    中介者模式和观察者模式的区别_序列中介作用中介者模式 Mediator动机模式定义结构要点总结笔记动机在软件构建过程中,经常会出现多个多个对象相互关联交互的情况,对象之间常常会维持一种复杂的引用关系.如果遇到一些需求的更改.这种直接的引用关系将面临不断地变化这种情况下,我们可以使用一个”中介对象”来管理对象间地关联关系,避免相互交互地对象之间地紧耦合引用关系,从而更好地抵御变换模式定义用一个中介对象来封装(封装变化)一系列地对象交互中.中介者使各个对象不需要显式地相互引用(编译时依赖->运行时依赖),从而使其耦合松散(管理变化),而

  • 软件需求规格说明书范例

    完整版(包括图片表格,请访问http://www.omegaxyz.com/2019/07/23/software-specification/)文章目录一、引言1.1定位与目标1.2对象1.3软件需求分析理论1.4软件需求分析目标二、需求概述2.1项目背景2.2需求概述2.3系统结构三、系统功能需求3.1功能总览3.2业务流程图3.3数据流…

  • Mysql日期和时间函数不求人

    Mysql日期和时间函数不求人

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号