子曰:“不愤不启,不悱不发
”。卓大大,我现在心好累。
提问
卓大大您好,我是一名信标组的参赛选手.最近研究声音定位已经一个多星期了,一直在跟着您推文中的方法走,也曾像其他人求助,解决了很多问题,但是也遇到了一些新的问题,有些暂时想不明白,就想来请教一下。
购买的TC264核心板尚未拿到手,于是用上一届的K66板子做实验。使用的麦克风是MAX9814模块,GAIN接5V。
一开始先用两个麦克风,10khz采集2000个数据做互相关运算,结果存在数组内。找出互相关的最大值对应的下标Nmax,这个下标和2000的差 2000-Nmax 即为时间延迟/采样间隔。
Nmax=tsampleΔt
- 当Nmax=0时,对应信标在两个麦克风正前方,角度对应90度;
- 当Nmax<0时,对应信标在两个麦克风左侧,定义角度为0;
- 当Nmax0时,对应信标在两个麦克风的右侧,定义角度为180度。
这里遇到的问题是求出的结果只有三个,两个麦克风距离算8厘米,最大时间间隔才235微妙,而采样100微妙一次,这样的结果就理所当然了。
通过提高采样速率,软件插值,提高麦克风间距,增加测量时间可以增加分辨率。我都尝试了。
提高采样速率和软件插值效果明显,可以做到互相关的最大值的坐标从3个点内的移动增大到100个点内的 移动。我觉得这应已经很不错了。
麦克风间距受到Chirp半波长限制
,增加采样时间效果不明显(试验从1000到4000个点)。
然后我开始尝试用三个麦克风实现定位,作了一个等边三角形固定麦克风。以厘米为单位建立平面坐标,求解联立的双曲线方程,再代入第三个方程求得唯一解。
折腾半天算出来表达式非常长的一串,在电脑上运行C语言程序,MATLAB计算,代入数值答案都正确而且一致,说明等式没有问题。
把这些代码移植到单片机里实践,效果确实非常差:大部分时候算出来的X,Y坐标只是符号正确而已,说明好坏知道我在哪个象限;有些符号都是错误的。我想这个数学模型是非常敏感的。在远点的地方双曲线接*行,0.1厘米的误差都会导致误解或者提前相交–失之毫厘,差之千里。
于是,我开始寻找误差来源:麦克风的误差可以忽略不计;K66的ADC采样的误差,一是ADC脚悬空时跳变较大(但是接入麦克风后又是稳定很多),而是一个ADC的才寄回干扰的其他的ADC。这个挺明显的,1个麦克风+2个悬空使用虚拟示波器看波形,有声音的时候2个悬空的也有不算小的波动。
我找了个RT1064来做对比,发现这两个指标都好上不少;三是麦克风不是一个点,是一个圆柱体,加上等边三角形的误差,凤城参数和我实际麦克风间具有一定的差距。
然后寻找错误的来源:在Chirp的中频段,有可能互相关的结果在t点和T-t点都是峰值(t是时间延迟,T是信号周期)。因为我采集到的信号并不是一个完整周期的Chirp信号,可能在我采集的这一段就是规律的正弦信号,往左往右都可以重合。
用完整的Chirp信号可以解决这个错误,但是在保证时间分辨率起码在10微妙的情况下,不管是提高采样频率还是插值,一个0.2048s的信号的点起卖超过20000个。而且不知道信号的起始时间的情况下才采集这么长的时间也不一定才到完整的一帧Chirp信号。
所以我现在有点怀疑纯麦克风的方案。折腾了这么久,以为快要成功的时候又发现了 一大大堆不知道如何解决的问题。我现在也没有力气再重新飞线测试RT1064的结果了。
万一只是误差非常非常大和非常大的区别呢?不知不觉写了这么多,真的是麻烦卓老师了。
回复:
- 采集数据的频率只需要设置为10kHz就好了,不需要提高采样频率。这是因为实际信号产生的DAC的频率就是10kHz,提高采样频率也不会提高数据的精度;
- 提高自相关判断的精度是采用FFT+补零的方式来完成的;具体方法以后会进行理论分析;
- 对于声源的定位,麦克风阵列的极限越长,定位精度越高。可以伴随追的车模运动,自然产生拉长后的麦克风阵列基线;
- 需要假设能够利用调频接收模块来获得发送的信号。根据该信号的起始点来确定采集的起始点以保证能够采集到完整的一帧Chip信号;
- 在实际测试中,距离的重复误差应该在1厘米左右,如果大于这个误差,请检查一下你的电路中实际信号的幅值和噪声。