前言
自己的毕业设计就是关于声阵列定位的,在网上看了很久,大部分用的都是驻极体麦克风,或者是用的类似于一写spieed的麦克风阵列,只能说那些虽然精确度好,但是还是不利于学习吧,因为大部分都是别人做好的库,自己一直想做一个,通过很久的学习,终于算小有成果。文章中部分图片我懒得再去一一截图,用的是几位大佬的图片,这里会给出引用。
准备
如果想进行时延,首先需要做的是怎么利用麦克风去接受数据,需要了解麦克风的通讯协议,这里给出几篇博客,我的工程也是基于他们的做的。
使用STM32的I2S协议读取麦克风INMP441-CSDN博客
STM32 使用IIS实现INMP441模块全速音频采样(附python上位机)_stm32 iis-CSDN博客
上面两位大佬给的指导。
能够正常接收到麦克风数据之后,我采用的是PHAT算法来计算时延的。PHAT最主要的算法还是傅里叶变换,因此这里也给出我学习时参考的一个大佬的文章。
在STM32单片机上使用傅里叶解析信号_stm32傅里叶变换-CSDN博客
通过以上几篇文章的学习,就基本上能明白怎么去匹配i2s协议来获取声音信号了以及对声音信号的fft变换。
时延
这个参数代表的意义以及各种排列的麦克风的角度区分以及空间分辨率我就不过多介绍,比如一字麦克风只能分辨180度的范围,具体原因还是需要理论学习的。本文由于资金的限制以及硬件的限制,用的是双麦克风、硬件平台式STM32F1系列的。
cubemax配置问题
这里主要配置的是i2s的通讯协议问题,根据前面给的博客,我将采样率改成16k了,其他不变。
数据接收
这里需要着重说明,采用inmp441麦克风,根据i2s协议规定,一条数据总线上是可以传输左右两个声道的,我这里的麦克风的声道选择全部为左,也就是将麦克风模块的L/R接地,这样的话,32接收到数据格式是,左左右右,而右声道基本上全是0,因此我们在做这个数据处理的时时候,是不能将右声道的数据给涵盖进去的。需要剔除,
这是我用debug调试显示的DMA接收i2s的数据,很明显看见前两个是有数据的,后面两个是没有数据的,分别对应这左声道高、左声道低,右声道高、右声道低。计算时延一定要把有声道的数据剔除,因为i2s是24bit数据格式,这里用的是32bit接收,因此需要做一些数据调整也不要忘记,前文给出的博客是采用这个双缓冲,我还是采用的单缓冲。
PHAT-FFT计算时延。
这么多算法,通过MATLAB仿真发现还是PHAT-FFT算法更好点,因此我采用的就是这个算法,这个算法的核心就是FFT变换,前面给出的一篇博客有助于学习怎么使用这个FFT变换。因此在计算时间延迟一定要一步一步来,把我提供的博客做一遍。
PHAT-FFT变换的基本原理,在知网上随便找一篇就能看到,或者在博客平台上,这里就不多说了。这里过来人的经验,一定要把代码跟公式一起推导,计算不是很难。
这是我的硬件平台,比较捡漏。麦克风只用了两个,因此分辨率比较差,而且只能计算时延,因为定位至少需要三个麦克风,麦克风越多定位越准,圆形阵列的空间分辨率要大于一字的。小伙伴,们可以尝试一下。这里用的舵机平台用来指向声源方向,这里的思路是想时延值映射到空间角度,也就是说一个方位角对应的一个特定的时延。精确度比较差,我用的是1024个点,这里可以用512个点fft变换,采用更高的主频,比如f4,实时性上肯定可以大幅度提高,还有改变音频采样率上,因为我的时间不多,也就没有进一步的去测试验证了,
这里给出演示视频。
【声阵列时延,方位角指向。-哔哩哔哩】 https://b23.tv/TdJ3WR3
自己复制到哔哩哔哩吧。
请大家笑纳。
如需指导请私信。