时间过得好快,这就到冬季挑战赛的截止日期了,回头很惭愧,一直没想到很好的题材。由于器材所限,加上之前也一直想做声音定位的东西,所以当这次套餐出来后就选择了套餐A,Micro:bit+声音传感器。因为我手头还有一个i9的声音传感器,所以就摩拳擦掌想试试了。但是做的时候才发现我有点低估了,达不到自己的要求。不过还是想在这里把自己遇到的问题写上来,也算是给其他人一些经验吧。
步骤1 想法
最初定位的想法是使用多个声音传感器,相隔固定间距,然后采样音源数据,然后把数据导入到matlab。由于声音是来自于同一个音源,所以得到的数据应该是相似,但是由于不同声音传感器距离音源距离不同,由于声音延迟,最终各个声音传感器得到的数据应该是相似但是有延迟。使用互相关方法可以求出来各个声音传感器得到的数据之间的时间差,那么根据声音传感器的相对位置可以计算出来音源的位置。但是在做的时候发现声音传感器的灵敏度,采样频率,micro:bit的处理速度和scratch的运行速度限制了这个想法只能另想办了。
上面的想法搁置之后,就退而求其次,希望通过声音传感器获取到声波的图形,采样不同频率的声音,然后使用mind+画出来,可以比较直观的了解到声音的波形岁频率不同的变化。
但经过测试,发现mind+采样声音的频率太低,根据采样频率至少要是声源频率2倍的要求,那么声源的频率要比较小才行,但是发现比较小的频率的声音太低了,而且声音传感器似乎也采样不到。因此作罢。不过我觉得在这个过程中的一些程序还是可以给大家一个参考。
步骤2 连接硬件
两个声音传感器分别连接到扩展板的P0和P1端口。(希望可以治好各位的颈椎病o(* ̄︶ ̄*)o)
步骤3 Mind+编程序
使用Micro:bit采样音频数据
这部分也很简单,当按下A按键后开始采集。数据使用两个列表来记录,每次采集都要先删除之前的数据,并显示列表,计时器归零。然后重复执行200次把两个声音传感器的数据分别保存到SoundValue1和SoundValue2里。
这里要说明一下,为了快速的采集数据,最开始使用了等待0.0001秒这样的,心想这样采集到的数据间隔是比较一致的,但是发现这样是徒劳的,因为即使不等待时间也达不到0.0001秒。之后我打开了计时器进行了测试,发现每秒采集的数据基本上低于20个。看图可以看出来我使用了多种循环方法来采集数据。
舞台和角色部分
这里只用了两个,默认的机器人和画笔。机器人其实没啥用,主要是用来放程序代码和采集完数据后提醒下。画笔我缩小了用来画图。
背景是一个坐标图。这里mind+把scratch默认的坐标图去掉了,不解,这个图还是很有用的。
画音频数据图部分
这里使用了画笔模块。每次画图前把画笔移到最左端,然后进行循环移动,移动的时候划线。由于是两个声音传感器,所以我用了两个颜色来画,并把数据映射到舞台中央部分。
从上面画出来的效果来看,这两个声音传感器获得到的数据基本上是一样的,看来一致性挺好的,但是很遗憾没有获取到真正的声波波形图。
为了获取比较纯的声音,我下载了一个软件,sweepgen,可以用来生成声音。
步骤4 结语
这次效果没有达到我的要求,不过不同的声音还是通过低采样率画出来的图还是可以看出来区别的。感兴趣的同学可以试试。
代码:https://gitee.com/zznuwdxy/mushroomcloudwinter
评论