使用双麦克风实现声源定位 SensorTile评估板上有一颗数字麦克风再外挂一颗数字麦克就可以实现二维模糊定位 原理是通过判断同一声音到达2颗麦克风的时间差来实现 网上有很多声源定位的方法,比如TDOA估计等等 这些方法涉及技术较多,实现起来也比较复杂 这次我通过一种比较简单的方法实现声源的模糊定位 方法是将SensorTile 内置和外接的一共2颗麦克风按一定距离放置 通过STM32L476的DFSDM(数字滤波模块)采集2处的音频数据 对2路音频数据做FFT(快速傅里叶变换),找出幅度最高的几个频率 通过比较2路音频数据在同一频率下的相位差来计算声音到达2个麦克风的时间差 下图是使用SensorTile的实测数据声音数据,声源在左麦克风的左上方 通过手机APP信号发声器产生1KHz正弦波 使用IAR在线调试模式把读取的麦克风数据导出到电脑 通过EXCEL数据分析中国傅里叶分析工具将2个通道的时域数据换成对应的频域数据 得到与时域数量对应的a+bi表示的复数数据 通过IMREAL和IMAGINARY函数得到复数的实部和虚部 利用公式SQRT(IMREAL^2, IMAGINARY^2)得到对应频率的模值 直流分量用模值除采样点数得到幅值 其它频率用模值除(采样点/2)得到对应幅值 查找到幅值最大的索引为86 对应的频率为“(索引-1)*采样率/采样点数)”实际为996.09Hz 通过ATAN2(实部,虚部)得到996.09Hz对应的相位(单位为弧度) 通过DEGREES函数将弧度转换为角度看起来更直观一些 计算出左声道为-15.87度,右声道为-135.03度 左声相位道提前右声道119.16度 为方便计算下边把996.09Hz按照1KHz处理 声音在25度空气的传播速度是346米/秒 1KHz一个周期(360度)的时间是1s/1000Hz=1ms 119.16度对应的时间差是1ms/360度*119.16度=0.33ms 0.33ms对应的声音传播距离是364/1000*0.33=0.114米=11.4cm 2个麦克风的距离大约是16cm 2个通道声音都是周期信号,左声道提前右声道119.16度 同时也可能是右声道提前左声道360-119.16=240.38度 假设是这种情况 1ms对应的声音传输距离为0.346米 34.6cm-11.4cm = 0.234cm 三角形两边之和大于第三边, |a-b| <> a=b+0.234cm这种情况不存在 所以只有一种可能就是 b=a+11.4cm 只有2个麦克风的情况下只知道D=16cm,b=a+11.4cm没办法确定β角从而判断声源的具体方向 β角会随着声源到麦克风的距离增加而变大 实际测试时声源一搬距麦克风20cm左右,即a=20cm,b=20+11.4=31.4cm 已经知道3边长度可通过余弦定理β=DEGREES(ACOS((a^2+D^1-B^2)/(2*a*D)) 计算出β=121度 会有些误差,不过也能大致判断声音的位置,实现模糊一点的声源定位功能 以后在实际使用时只要声源和左麦克风保持20cm左右的距离即可得到声源所在的大致位置 |
|