精华内容
下载资源
问答
  • 声源定位

    千次阅读 2019-11-06 13:08:35
    声源定位 一.简介 声音定位是人们感知周围事物的一个重要部分。即使看不到那里有什么,我们也可以根据声音大致判断出我们周围有什么。尝试在电子设备中复制相同的系统可以证明是一种有价值的方式来感知机器人、...

    声源定位
    一.简介
    声音定位是人们感知周围事物的一个重要部分。即使看不到那里有什么,我们也可以根据声音大致判断出我们周围有什么。尝试在电子设备中复制相同的系统可以证明是一种有价值的方式来感知机器人、安全和一系列其他应用的环境。我们构造了一个三角形排列的麦克风来定位任意声音的方向。通过记录来自三个麦克风的输入,我们可以将记录相互关联,以识别音频记录之间的时间延迟。因为三个麦克风的物理位置是已知的,所以可以使用麦克风之间的时间延迟来估计声音的方向。估计方向后,我们在液晶显示器上用箭头显示方向。
    二.整体设计思路
    在这里插入图片描述
    2.1 数学原理
    在采样帧中,两个麦克风之间的近似最大时间延迟是使用以下三个参数计算得出的:1.室温下干燥空气中的声速,2.每个麦克风之间的距离,3.采样速率。
    最大时间延迟=采样速率/(声速距离)= 25 kHz / (343 m/s 0.50 m)
    本项目中用于计算两个信号之间时间延迟的主要数学技术是互相关,它通过沿另一个信号滑动一个信号来测量两个信号的相似性。公式如下:
    在这里插入图片描述
    2.2 硬件框图
    下图说明了本项目中使用的所有外设。PIC32利用10位模数转换器(ADC)读取模拟输入,利用串行外设接口(SPI)通道写入薄膜晶体管显示器,利用另一个串行外设接口通道写入数模转换器(DAC)进行模拟输出。
    在这里插入图片描述
    2.3 硬件/软件权衡
    在硬件和软件之间进行选择是实现容易的平衡,同时倾向于在微控制器中运行系统,以增加微控制器提供的灵活性。由于我们希望能够比较声音和可能的时间延迟,大多数音频处理都是在PIC32微控制器中完成的。虽然某些项目中提到使用硬件脉冲检测器来确定到达时间,但我们选择用软件来确定,因为这样可以让我们检测非脉冲的声音。一些放大和信号控制是在硬件滤波器和放大器中完成的,因为这对ADC正确读取输入信号和消除混叠是必要的。在PIC32内部,我们决定让微控制器使用直接存储器存取通道将数据传输到缓冲器,而不是让处理器高速中断来采样ADC。这允许微控制器在采样过程中进行其他处理。
    三.硬件
    3.1 概观
    该项目的硬件包括3个麦克风电路、一个电压调节器、一个按钮、一个薄膜晶体管显示器和一个开关组成的原型板。3个麦克风电路中的每一个都包括驻极体麦克风、一组滤波器和放大器。麦克风电路的每个输出都被反馈入PIC32上的模数转换器通道。单独的线性电压调节器用于为麦克风电路供电。原型板的3.3v电源轨未被使用,因为我们发现微控制器的噪声可以进入电源轨并被放大器拾取。此外,9v电池用于提供整体电源。我们还发现5v插入式壁装电源往往会产生不必要的噪声(可能来自某些开关频率)。该按钮用于开始采样,并简单地作为上拉连接。配置了微控制器的内部下拉。薄膜晶体管显示器用于显示调试信息并指向声音的方向。麦克风电路和电压调节器焊接在焊接板上。最后,使用一个双通道12位数模转换器进行调试。这用于回放录音和输出相关波形。这些可以在示波器上看到。
    3.2 麦克风电路
    麦克风电路由三部分组成。首先是麦克风本身。第二是高通滤波器,用于在向放大器馈电之前去除麦克风中的任何DC值。最后是放大器,它是一个运算放大器,被配置为充当带通滤波器。麦克风电路示意图如下所示:
    在这里插入图片描述
    MCP6242是用于放大器的运算放大器。这是一款3.3V兼容轨对轨运算放大器。初始高通滤波器的截止频率约为160Hz。带通放大器上的高通滤波器被选择为与初始高通滤波器的截止值大致匹配。至于运算放大器的低通滤波器,选择该滤波器的截止频率约为725Hz。选择这些较低频率的选择是因为我们能够用原始方法获得原始采样率。使用的增益是1000:1。这将证明是一个问题,这将在后面的进一步改进部分看到。麦克风电路的每个输出都连接到一个具有模拟功能的输入/输出引脚。使用的引脚是RA0、RA1和RB3,它们对应于AN0、AN1和AN5。这些被组装成焊接板,如下所示:
    在这里插入图片描述
    3.3 按钮
    按钮电路相对简单。这只是一个与330欧姆电阻串联的按钮开关。开关电路的一端是3.3V轨,另一端是PIC32的数字输入/输出引脚。PIC32配置为提供弱下拉,因此当开关打开时,输入/输出引脚读数为0,当闭合时,输入/输出引脚读数为1。开关最初连接到原板,但这最终会导致问题,因为单击开关会导致组件抖动。为了解决这个问题,将一个不同的开关焊接到一段绞合的24awg(截面积大概为0.2平方毫米)电线上,然后连接起来代替车载开关。这允许系统可以进行短距离触发。按钮开关连接到RB7,如下图所示。
    在这里插入图片描述
    3.4 薄膜晶体管显示器
    薄膜晶体管显示器用于显示调试信息并指向声源方向。我们使用的器件是Adafruit,它提供薄膜晶体管显示器、薄膜晶体管显示器驱动器和SD卡读卡器(本项目未使用)。其代码是一个库,该库改编自Adafruit提供的库,用于运行带有Arduino的薄膜晶体管。薄膜晶体管分支使用了一个SPI通道和其他几个数字输入/输出引脚。薄膜晶体管显示器的引脚排列与赛ABB开发板中的配置相同。具体如下:RB0 ->D/C、RB1->ECS、RB2->reset、RB11->EMOSI和RB14->CLK。
    在这里插入图片描述
    3.5 数字模拟转换器
    使用的数模转换器是MCP4822。这是我们常用的12位双通道数模转换器。数模转换器仅用于调试系统,不用于项目本身。通过以1kHz的速率向数模转换器发送波形,我们可以查看系统的输出情况。数模转换器采用标准配置,如下所示:RB4->CS,RB5->MOSI,RB15->CLK。
    3.6 进一步改进
    对于硬件而言,进一步的改进将包括对放大器进行返工,去掉按钮电路,让音频电路触发采样。首先,选择放大器带通滤波器的频率范围是因为原始系统具有低采样频率。由于当前系统可以在25kHz下采样而没有问题,并且经过一些调整后可以增加到40kHz,因此我们可以改变低通滤波器的截止频率。比几千赫高得多。然而,一个问题是增益带宽积大约为550kHz。当增益为1000:1时,结果将系统频率限制在550kHz。但是我们应该注意,增益带宽积的特性不太好,因此芯片之间可能会有很大差异。添加高通滤波器会造成相位偏移,因为每个运算放大器可能不同,这意味着每个麦克风的相位偏移也不同。由于互相关依赖于检查输入信号的相位,这意味着峰值的位置取决于麦克风听到的声音的频率。
    四.软件
    4.1 概述
    为了最大化系统的采样率,我们修改了时钟预分频器,使时钟频率达到60 MHz。然而,为了开始声音定位检测,需要按下按钮来激活程序,并且使用去抖状态机(有限状态机)来保持按钮的状态。首先,为了定位声音的方向,系统首先需要记录来自每个麦克风通道的读数,这是使用直接存储器访问来最小化处理器使用的,并且记录的麦克风数据存储在阵列中。第二,每个通道的记录与下一个通道互相关,并且用相应的相对定时识别互相关值的峰值点。第三,每对声道之间的相对定时将被用于通过使用定时差的相对方向和麦克风放置的物理关系的知识来计算声源的方向,以导出三个方向上的声源。最后,在薄膜晶体管显示屏上画出相应的箭头来提示结果。下一节将详细讨论软件的每个组件,还包括调试功能、实验方法和进一步的建议。
    4.2 直接存储器存取和模数转换器
    三个麦克风通道的模拟输入连接到三个模数转换器通道,即通道0、1和5。模数转换器配置为自动采样模式,在上一次转换完成时,将连续采样下一个数据,采样大小为三个通道,并转换为16位有符号整数。麦克风的录音是使用直接存储器存取完成的,特别是三个麦克风通道的三个直接存储器存取通道。对于每个通道,DMA最初被配置为从麦克风数据从模数转换器缓冲器传输到记录阵列,并且每次传输的整个块大小是记录阵列的大小,其被设置为采样速率乘以十分之一秒。一旦功能调用使能了直接存储器存取通道,直接存储器存取将以定时器2中断设置的速率传输16位大小的单元,该中断被配置为系统时钟/采样频率=2400个时钟周期。当整个数据块被传输时,码分多址信道将提升码分多址_电动车辆_夏令时_满标志,以表示传输完成。此外,计算线程检查所有三个DMA通道的完成标志,以开始声音定位的计算。
    4.3 按钮
    按钮线程持续读取按钮的输入,并使用按钮去抖状态机FSM来更新按钮的当前状态。FSM被用来适当地捕捉按钮的全部按下。按钮按下切换就绪标志,向计算线程发出信号,以直接内存分配传输开始计算。下图具体说明了FSM。
    在这里插入图片描述
    4.4 互相关
    一旦麦克风数据完全记录在阵列中,将对每对麦克风记录计算互相关。互相关是在信道0和信道1、信道1和信道2、信道2和信道0上计算的。在互相关计算中,每个通道的记录值加上每个麦克风通道的恒定DC偏置,这是为每个通道独立测量的。无论如何,通过沿着第二记录完全滑动第一记录的中间部分来计算每个互相关,并且计算完全重叠的记录的点积之和,并且得到的互相关值并存储在记录大小的数组中。滑动窗口的大小是在用多个窗口大小进行实验之后选择的,并且该大小允许使用大量的记录值来寻找两个通道之间的相关性,以及足够的互相关数据来适应麦克风的物理距离在记录约束之间的最大时移量。当互相关值被计算时,三对中每一对的峰值及其索引值将被识别和记录,以计算源声音的方向。
    4.5 计算方向
    声源的方向是使用互相关计算期间检测到的三个峰值指数来计算的。使用3位编码来确定方向。编码的每个比特对应于峰值指数是正还是负,当指数是正时,这意味着第一次记录发生在第二次记录之前,因此第一次记录的麦克风比第二次记录的麦克风更靠近声源。编码由以下赋值构成。
    在这里插入图片描述
    接下来,使用以下逻辑使用3位编码来确定声音的方向,该逻辑将方向确定为在其他两个麦克风通道之前接收信号的麦克风通道。
    在这里插入图片描述
    通过画一个指向三个麦克风之一的箭头,结果方向将显示在薄膜晶体管显示屏上。
    4.6 数模转换器(用于调试)
    为了调试系统,配置了两个数模转换器通道。数模转换器配置为通过串行接口输出互相关数据,串行接口以定时器3中断设置的速率输出数据,定时器3中断配置为60kHz。输出引脚连接到示波器,以便观察和分析互相关信号,这些信号从最新的计算互相关阵列中反复流出。
    4.7 尝试了另一种方法
    我们尝试的第一种声音定位计算方法是连续计算每个麦克风通道与预先录制的录音的互相关。因此,由于实时计算的需求非常紧张,采样率受到很大限制。我们达到的最高采样速率在微处理器运行时为60 MHz,它太低,无法合理分辨麦克风通道之间的时序延迟。从这种方法获得的结果不能识别出符合理论直觉的一致相关性。
    4.8 代码片段
    下面是每个函数和线程的代码,仅供参考。

    //定时器3中断服务例程
    void __ISR(_TIMER_3_VECTOR, ipl2) Timer3Handler(void) {   
    mT3ClearIntFlag();    
    transfer_to_DAC_Channel_A();    
    transfer_to_DAC_Channel_B();
    }
    //计算源声音的方向
    //在薄膜晶体管显示器上绘制结果
    void compute_direction() {    
    // assigned encoding   
     encoding = (peak_index[0] > 0) << 2 | (peak_index[1] > 0) << 1 | (peak_index[2] > 0);
     direction = check_cases_identified _direction(encoding);
     draw_TFT(direction);}
     //交叉关联每对麦克风录音
     void cross_correlate() {    
        for (each channel) {        
           for (shift range) {           
              for (index range) {         
              correlate_value += mic(channel) + biase * mic(next channel) + biase;
                             }            
                             Update_new_peak_value(); 
                     }   
                 }
    }
    //线程等待按钮按下来记录和调用
    //交叉关联和计算方向
    static PT_THREAD(protothread_computation(struct pt * pt)) {    
    PT_BEGIN(pt);   
    while (1) {        
    wait_until_button_pushed();        
    Reset_button;        
    Star_DMA_transfer(All_3_channels);        
    wait_until_all_DMA_complete();        
    //cross_correlation the new recordings        
    cross_correlation();        
    //compute and display direction        
    compute_direction();    
    }    
    PT_END(pt);
    }
    //这个线程更新并维护按钮的状态
    static PT_THREAD(protothread_button(struct pt * pt)) {    
    PT_BEGIN(pt);   
    while (1) {        
    button = Read_Button_input();        
    // FSM for the button press debouncing        
    transition_case_for_button_state();   
     }    
     PT_END(pt);
     }
     //主要功能。配置和初始化定时器、数模转换器、模数转换器、直接存储器、薄膜晶体管、引脚、线程。
    void main(void) {    
    // Configure timer3 interrupt    
    Config_Timer3(sys_clock / 1000);     
    // Configure timer 2 interrupt    
    Config_Timer2(sys_clock / sampling_rate);    
    /// SPI setup for DAC    
    Configure_SPI_for_DAC();     
    //Configure and enable the ADC    
    Enable_ADC_for_3_Channels();     
    // DMA Configure for 3 channels  
    Enable_3_DMA_Channels_on_Timer2_and_Raise_DONE_flag();     
    // set up i/o port pin    
    set_digital_input_and _pulldown(push_button_input_pin);     
    // config threads    
    PT_setup();    
     // setup system wide interrupts    
     INTEnableSystemMultiVectoredInt();     
     // init the threads   
      initialize_threads();     
      // config and init the display    
      tft_config();     
      // round-robin scheduler for threads    
      while (1) {        
      PT_SCHEDULE(protothread_button( & pt_button));   
      PT_SCHEDULE(protothread_computation( & pt_computation));    
         }
     }

    五.结果
    声音定位效果很好,计算延迟很小。当系统能够捕捉麦克风电路带通范围内的正弦扫描有效部分时,该器件工作最佳,因此可以完全捕捉录音的频率特性进行比较。这意味着系统的精度取决于点击按钮的用户的精度,也取决于系统使用的运算放大器,因为这将决定上限的位置。测试设备时捕获了以下图像。
    在这里插入图片描述
    在这里插入图片描述
    两条上迹线显示来自其中一个麦克风的记录信号,下迹线显示来自两个麦克风通道的互相关结果。互相关迹线使用高电平信号来显示数据何时开始和结束。这使我们能够看到互相关的起点和终点以及峰值的位置。在第一幅图像中,峰值明显向左移动,表明一个记录领先于另一个记录,而在另一幅图像中,峰值居中,表明两个记录大致在同一时间。虽然该系统通常是正确的,但存在一致性问题。项目范围缩小到检测与每个麦克风对齐的方向的原因是读数不一致,即使读数一致也不完全正确。这可能是麦克风电路的问题。运算放大器的增益带宽积引起的低通滤波可能会导致麦克风在输入信号上看到不同的相移。我们相信情况是这样的,因为互相关的峰值会像上面描述的那样以干净的波形返回,但是峰值会位于错误的部分。这表明麦克风电路或采样有问题。由于中央处理器时钟工作在60兆赫,模数转换器的采样频率也在兆赫范围内,所以我们通常不关心模数转换器采样之间的延迟,也不关心直接存储器将数据顺序复制到缓冲器中。这只会使麦克风电路在输入信号中产生一些不希望的相移。更糟糕的是,由于相移差可能与频率有关,并且测试信号是频率的线性扫描,这意味着采样和互相关的结果将取决于用户在频率扫描中在正确时间按下按钮的能力。这是不可靠的,因为大多数人不能捕捉到精确到不到十分之一秒的正确时间,所以如果系统也能自己触发采样会更好,因为这样会更一致。
    另一方面,这个项目实际上没有任何安全问题。由于该设备只需记录音频信号并在显示器上返回方向,因此它没有任何移动部件,也不发射/辐射任何电磁波、任何声波或任何可能对周围环境和生物特别有害或干扰的能量输出。就可用性而言,该设备需要相当多的工作。首先,移除按钮将是一个关键的改变,这将提高设备的可用性,因为目前,它需要一个正确定时的按钮,这将要求用户是准确的。第二,扩展带通电路的频率范围,以允许设备检测更宽范围的声音信号。最后,使用更多麦克风通道可能会提高声音方向的检测分辨率。因此,为了充分利用该设备,需要进一步开发该设备的许多方面。
    六.结论
    最终设计和原始设计没有达到最初为项目设定的预期。因此,项目范围缩小到指向最近的麦克风。我们遇到的主要问题是,系统没有从每对麦克风通道之间的相对时间延迟中给出特别一致的结果。在很大程度上,系统会分辨出正确的麦克风,但是不一致意味着它多次指向错误的方向。最初,我们希望能够以高得多的分辨率,十度,分辨出一个方向。互相关代码和代码中峰值的索引似乎给出了正确的结果。互相关波形看起来像理论上的预期,但偶尔会在错误的位置出现峰值。返回峰值索引的代码似乎也会根据观察到的波形峰值给出正确的索引。因此,误导性不一致性的来源很可能不是来自计算,而是麦克风电路。如结果部分所述,麦克风电路中滤波器所选择的截止频率不是我们希望系统运行的声音范围的正确频率。此外,运算放大器增益带宽积的低通也可能导致电路对音频施加不同的相移。如果我们要重做这个项目,我们可能会降低增益,选择增益带宽积更高的运算放大器。这可能会减少或消除我们得到的相关峰值的变化。此外,我们为低通滤波器选择了不同的截止频率,这将使我们的项目能够在更高的频率范围内工作。让系统自己触发采样也可能有助于减少我们看到的不一致性。该系统没有任何重大的安全问题。该项目只需读取音频读数,并尝试确定音频的来源方向。唯一的输出显示在薄膜晶体管显示器上。薄膜晶体管显示屏不够亮,不会损害人们的视力。关于隐私,音频记录的持续时间被限制在十分之一秒,一旦采集下一个样本,它们就会被丢弃。虽然理论上可以从用于调试的数模转换器通道中提取音频,但最终版本会删除该调试功能。
    七.物料清单
    项目 数量
    PIC32MX250F128B芯片 1
    大硬纸板19V电池 1
    薄膜晶体管液晶显示器 1
    麦克风 3
    小型焊接板 3
    运算放大器MCP6241 3
    跨接电缆 10
    扬声器 2
    SIP或插头插座/插头 20
    电压调节器MCP1702 1

    更多创意方案,长按识别下图中二维码,敬请关注本人的微信公众号“小科谈”,愿天下没有难做的电子产品。
    在这里插入图片描述

    展开全文
  • 麦克风声源定位:通过SRP-PHAT和其他数值方法进行的麦克风声源定位。(基于SRP-PHAT的麦克风声源定位
  • TDOA声源定位

    2018-07-22 20:46:20
    利用TDOA估计时间延迟,进行声源定位。这个是基于matlab的声源定位程序。
  • C++声源定位.zip

    2020-08-26 10:19:44
    声源定位方法有基于麦克风阵列声源定位方法,基于双耳听觉机理声源定位方法和基于光学传感方式声源定位方法。其中,基于麦克风阵列的声源定位方法一般通过特定结构组合的麦克风阵列来获取多个位置的声音信号,然后通过...
  • 声源定位源码

    热门讨论 2015-06-09 15:01:30
    声源定位是依据声音信号到达各个麦克风的时延来判定声源的位置
  • TDOA声源定位算法

    2019-05-06 09:52:07
    导航与定位,TDOA,声源定位算法,c++编程
  • 声源定位的算法

    2017-07-30 16:52:31
    声源定位的算法
  • 声源定位程序

    2015-03-24 19:16:42
    建立了声源定位的算法模型,并在STM32上编程实现,定位效果非常良好。
  • 声源定位专项

    千次阅读 2019-05-06 20:22:33
    之前发布了一款声源定位机器人,但是其中还包括图像处理和超声波传感器,以及单片机开发的内容,对于专门想要研究声源定位的朋友可能过于复杂。 这次把声源定位的程序摘取出来,并且保证可以独立运行(只需要放到...

    之前发布了一款声源定位机器人,但是其中还包括图像处理和超声波传感器,以及单片机开发的内容,对于专门想要研究声源定位的朋友可能过于复杂。

    这次把声源定位的程序摘取出来,并且保证可以独立运行(只需要放到镜像里项目文件夹下),给想研究声源定位的朋友参考。

    #!/usr/bin/env python
    import socket
    import sys
    import threading
    import random
    import os
    import time
    import struct
    
    import Image, StringIO
    import numpy as np
    
    
    from voice_engine.source import Source
    from voice_engine.channel_picker import ChannelPicker
    from voice_engine.doa_respeaker_4mic_array import DOA
    from pixels import pixels
    
    import datetime
    
    
    exit_now = 0
    
    last_movement_timestamp = datetime.datetime.now()
    
    
    def exit_signal_handle(sig,stack_frame):
        global exit_now
        print "EXIT sig"
        exit_now = 1
    
    
    def main():
        global last_movement_timestamp
        src = Source(rate=16000, channels=4, frames_size=320)
        doa = DOA(rate=16000)
        src.link(doa)
        src.recursive_start()
    
    
        while exit_now == 0:
            try:
                time.sleep(1)
                current_timestamp = datetime.datetime.now()
                if ((current_timestamp - last_movement_timestamp).seconds > 2):
                    position, amplitute = doa.get_direction()
                    if amplitute > 2000:
                        pixels.wakeup(position)
                        print "doa",amplitute,position
                        if position > 0  and position < 180:
                            print "pivot right"
                            time.sleep(position/200)
                        elif position >= 180 and position < 360:
                            print "pivot left"
                            position = 360 - position
                            time.sleep(position/200)
                        time.sleep(2)
                    else:
                        pixels.speak()
                else:
                    pixels.think()
            except:
                print "doa", sys.exc_info()
        src.recursive_stop()
    
    if __name__ == "__main__":
        main()
    
    

     

    展开全文
  • 声源定位题目

    2014-06-29 15:54:41
    MSP430单片机 三点声源定位 代码实现及物理电路图
  • 声源定位系统

    热门讨论 2013-09-10 23:13:33
    基于stm32声源定位系统,亲自测试过,可以用
  • 提出了利用2个麦克风基于FPGA的声源定位的方法。具体通过基于相位变换改进的互相关方法成功在低信噪比(10 dB)的噪声环境下完成声源定位。利用同样的算法和硬件结构,可以在1片FPGA芯片上实现5组并行的时域处理的系统...
  • 麦克风阵列声源定位

    2016-01-16 12:11:45
    一篇关于麦克风阵列声源定位的论文,具有一定的参考价值。
  • 声源定位摄像头系统资料(stm32加51)
  • 声源定位技术定位出外界声源相对于机器人的方向和位置,机器人听觉声源定位系统可以极大地提高机器人与外界交互的能力。总结和分析面向机器人听觉的声源定位技术对智能机器人技术的发展有着重要的意义。首先总结了...
  • STM32-声源定位pudn.rar

    2021-03-10 16:18:29
    STM32-声源定位 源码
  • 三点接收声源定位原理,用于三个接收传感器采集声音时间,利用时间差进行计算生源位置,讲解实现原理,通过代码可以实现位置解析。
  • 基于卷积神经网络的双耳声源定位
  • 正四面体麦克风阵列声源定位模型研究
  • 基于麦克风均匀线性阵列的声源定位
  • 使用TDOA进行声源定位

    千次阅读 2020-09-19 17:36:08
    根据现有的研究成果来看,声源定位(Sound Source Localization, SSL)存在以下几种方法:基于最大输出功率的可控波束成形的定位方法、基于高分辨谱估计的定位方法和基于到达时延差(Time Difference of Arrival,TDOA)...

    目录

    1. TDOA简介

    2. 时延估计

    3. 定位估计

    4. 声源定位


    根据现有的研究成果来看,声源定位(Sound Source Localization, SSL)存在以下几种方法:基于最大输出功率的可控波束成形的定位方法、基于高分辨谱估计的定位方法和基于到达时延差(Time Difference of Arrival,TDOA)估计的定位方法,以及基于机器学习的方法。其中基于时延估计的定位方法计算量小,实时性好,实用性强等特点,我们就先介绍这种较为简单的声源定位算法。基于TDOA的方法一般分为两步,首先计算声源信号到达麦克风阵列的时间差(时延估计),然后通过麦克风阵列的几何形状建立声源定位模型并求解从而获得位置信息(定位估计)。

    1. TDOA简介

    首先介绍下TDOA的概念,如图所示,假设我们在空间中有一个声源(记为s(t),其在空间的位置为S)两个麦克风(记为m1和m2,它们在空间的位置分别为M1M2,接收到的信号为x1(t)和x2(t)

    那么麦克风m1和m2收到的信号分别为:

    其中τ1和τ2分别是声源到达两个麦克风的延迟时间,n1(t)和n2(t)为加性噪声。那么声源信号到达两个麦克风的TDOA为

    τ1和τ2可以通过下式计算

    其中c是声速。一般情况下,我们选择一个麦克风的信号作为参考信号,例如我们把M2作为参考信号,那么τ2=0。在麦克风阵列几何形状已知的情况下,声源定位问题变为对时延的估计问题。

    2. 时延估计

    时延估计常用的有很多种比如使用广义互相关函数(Generalized Cross Correlation, GCC)估计时延,或者使用倒谱分析进行时延估计等,这里介绍常用的基于广义互相关函数时延估计方法。

     

    互相关函数我们以前已经介绍过了,而广义互相关函数是为了减少噪声和混响在实际环境中的影响,在互功率谱域使用加权函数加权,然后经过IFFT运算后找到峰值估计时延,其流程如下图所示:

     

    广义GCC计算公式为:

    其中Ψ12为频域加权函数,常用的有如下几种

    Gx1x2(ω)为互频谱,其计算公式为:

     

    最后我们就可以通过式(8)估计语音信号到达两个麦克风的时延了。

    3. 定位估计

    如果要确定出声源在二维平面内的位置坐标,都至少需要三个麦克风。对于两个麦克风的情况,我们只能计算到达角(Direction of Arrival, DOA)。在介绍如何定位估计前需要先区分下近场(near-field)和远场(far-field),假设声速波长为λ,麦克风之间的距离为d(有的地方称为孔径,aperture),那么声源与麦克风之间的距离r大于2d2/λ时,符合远场模型,反之则为近场模型。对于远场模型来说,声源到达麦克风阵列的波形视为平面波,如下图所示:

    此时根据麦克风阵列的几何关系,我们有

    进而可以求出,声源相对麦克风阵列的角度

    对于近场模型来说,声源到达麦克风阵列的波形视为球面波,如下图所示:

    近场模型需要三个麦克风,我们假设τ12,τ13分别为第二和第三个麦克风与第一个麦克风的时延,那么

    根据麦克风阵列的几何关系,我们得到

    其中τ12,τ13通过时延估计得到,因此可以求解公式(11)到(13)的方程组,进而使用正弦定理可以得到θ2和θ3。

    4. 声源定位

    在麦克风孔径不大的情况下,一般都符合远场模型(不信读者可自己算一下),因此这里应用远场模型进行声源定位。声源位置在大约在45度角,麦克风之间的距离为0.15m,48 kHz的采样率,使用gcc-phat进行时延估计,结果如下图所示(代码和数据还是在公众号菜单More->Code里面)。

     

    可以看到大体上方向还是被正确估计到,想必聪明的读者已经发现了声源定位的一些数据可以进行VAD结果的判定。这里的Demo比较简单,采用的是单源自由场模型,真实情况下需要考虑更多的问题,比如房间的混响,噪声,声源个数等问题。另外gcc-phat只能用于双麦克风阵列,如果你有多个麦克风,可以使用Spatial Linear Prediction Method 方法去利用麦克风之间的冗余信息获得更为精确的定位结果。此外波束成形(Beam forming, BF)和声源定位联系比较密切,因为时延和BF所要求的导向量等价,因此也有基于BF的声源定位算法。最后提一下机器学习/深度学习的定位方法,前面的流程还是不变,只是最后通过最大值估计时延的这一步换成了使用机器学习模型来估计时延,即模型输入为gcc-phat,输出结果为时延。然后根据这个时延进行声源定位。


    参考文献:

    [1]. https://www.canalu.tv/video/inria/time_difference_of_arrival_tdoa.33273

    [2]. Springer, Micrphone Array Processing,2008


    展开全文
  • 声源定位 摄像头控制

    2011-05-20 15:46:16
    此程序利用LABVIEW进行编程 能够准确进行声源定位 并且能够得到声源定位的角度很距离。
  • 声源定位技术是语音识别技术的基础,针对复杂噪声和混响的室内环境造成声源定位精度不理想的问题,提出了一种基于麦克风阵列的声源定位系统。首先阐述了声源定位原理,然后提出了改进的广义互相关算法。该算法利用两...
  • 基于压缩感知的麦克风阵列声源定位算法
  • 基于混沌人工蜂群优化的声源定位算法
  • 针对混响条件下现有声源定位技术中麦克风数量必须大于声源数量的现状,提出了一种基于压缩感知的双麦克风混响多声源(至少3个声源)定位算法。将多声源定位问题看作是块稀疏信号的重构问题,在频域将全房间冲激响应...
  • 逆向捕获时间差的Voronoi声源定位机制

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 454
精华内容 181
关键字:

声源定位