年前最后一更~
前段时间做了点信号处理相关的东西,开发过程中主要深入体验了一下STM32F4系列的DSP功能。不得不说,Arduino用的多了之后有点被惯坏,以致于重新面对寄存器的时候,感觉有点迷之难以释怀。。。
不过当然了,论Cortex-M4的性能,是任何Arduino板子都难以望其项背的,F1系列因其出众的性价比成为很多公司小型嵌入式产品开发的首选,F4系列则进一步提升,集成了DSP和FPU,主频也能跑到168MHz,对于要求不高的信号处理要求是完全没有压力的。
但是F4系列就一点不好,大。
我可是打算要做个萌萌哒小板子可以装在Qbot上到处跑,F4能买到的芯片都至少100来个引脚让我如何愉快地装X。。。
所以芯片就选定了F1。至于这个“音频分析仪”到底是个啥嘞?由于目前刚刚组装好硬件,还有大量程序编写调试工作没做,所以先简单介绍一下,等后面软件篇完成的时候会有详细讲解。
总的来说,这其实是个 声音罗盘+频谱分析仪 这是为我之后打算做的泛用型蚊子毁灭激光打击装置准备的一个先导项目…
前方画风转变注意
为了能快速准确捕获蚊子的方位,我们需要类似人类的一些感知能力如视觉和 听觉 -- 最终肯定会用上摄像头的,但是摄像头的视野没有360度,所以需要靠声源定位先获取大致方向。
而声源定位呢,其实也并不如大家想象的那么容易…最容易想到的就是:安装多个麦克风阵列,判断哪边声音大声源就在那边。这样原理上似乎好像是可以的,但实际上是无法实现的,原因有几点:
- 以麦克风的灵敏度是无法区分出微小的声音强度变化的
- 无法定量计算方位角
- 由于模块很小,事实上传感器挨的很近,所以进一步降低了声源由于距离带来的强度变化
- 最麻烦的是,元器件的特性并不是严格一致的,很可能你买到的几个麦克风各有各的灵敏度
- 噪声干扰无法消除
所以靠谱点的方法呢,就是利用声音的相位差来获取准确的方位。这里面原理就比较复杂了,基本思想就是,一束声波在被几个麦克风捕获的时候,由于到达时间不同,因此各个麦克风获得的信号是同一个波形在时域上相位平移后的样子,这样他们各自的相关函数就会存在一个或多个极值,由此可以求出相位差进而得到信号到达的时差。
求解的过程需要做傅立叶变换,但是F1系列并不带DSP所以这部分会比较吃力,好在之前官方有发布过一个F1的DSP汇编库(虽然后来因为想推广自家带DSP芯片下架了),里面就有关于FFT的函数,而且效率比较高,1024点FFT只耗时2ms,还是比较理想的。麻烦点在于这蠢库只有FFT却没有给IFFT函数(虽然可以等价,但是官方库数据结构很奇怪容易溢出)…等码程序的时候再解决
焊了半天把板子撸出来了,有些许小问题没考虑周全,但总体功能都是可以用的比较欣慰。。。
视频里演示了频谱显示功能,这个只需要用到一个麦克风:
原理图也放出了