子曰:“不愤不启,不悱不发”。卓大大,我现在心好累。
提问
我的心好累呀
卓大大您好,我是一名信标组的参赛选手 . 最近研究声音定位已经一个多星期了,一直在跟着您推文中的方法走,也曾像其他人求助,解决了很多问题,但是也遇到了一些新的问题,有些暂时想不明白,就想来请教一下。
购买的 TC264 核心板尚未拿到手,于是用上一届的 K66 板子做实验。使用的麦克风是 MAX9814 模块,GAIN 接 5V。
一开始先用两个麦克风,10khz 采集 2000 个数据做互相关运算,结果存在数组内。找出互相关的最大值对应的下标 Nmax,这个下标和 2000 的差 2000-Nmax 即为时间延迟 / 采样间隔。
- 当 Nmax=0 时,对应信标在两个麦克风正前方,角度对应 90 度;当 Nmax<0 时,对应信标在两个麦克风左侧,定义角度为 0;当 Nmax0 时,对应信标在两个麦克风的右侧,定义角度为 180 度。
实验布局示意图
这里遇到的问题是求出的结果只有三个,两个麦克风距离算 8 厘米,最大时间间隔才 235 微妙,而采样 100 微妙一次,这样的结果就理所当然了。
通过提高采样速率,软件插值,提高麦克风间距,增加测量时间可以增加分辨率。我都尝试了。
提高采样速率和软件插值效果明显,可以做到互相关的最大值的坐标从 3 个点内的移动增大到 100 个点内的 移动。我觉得这应已经很不错了。
Chirp 信号波形
麦克风间距受到 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 信号的自相关信号
用完整的 Chirp 信号可以解决这个错误,但是在保证时间分辨率起码在 10 微妙的情况下,不管是提高采样频率还是插值,一个 0.2048s 的信号的点起卖超过 20000 个。而且不知道信号的起始时间的情况下才采集这么长的时间也不一定才到完整的一帧 Chirp 信号。
所以我现在有点怀疑纯麦克风的方案。折腾了这么久,以为快要成功的时候又发现了 一大大堆不知道如何解决的问题。我现在也没有力气再重新飞线测试 RT1064 的结果了。
Chirp 信号的 FFT 幅度谱
万一只是误差非常非常大和非常大的区别呢?不知不觉写了这么多,真的是麻烦卓老师了。
回复:
采集数据的频率只需要设置为 10kHz 就好了,不需要提高采样频率。这是因为实际信号产生的 DAC 的频率就是 10kHz,提高采样频率也不会提高数据的精度;提高自相关判断的精度是采用 FFT+补零的方式来完成的;具体方法以后会进行理论分析;对于声源的定位,麦克风阵列的极限越长,定位精度越高。可以伴随追的车模运动,自然产生拉长后的麦克风阵列基线;需要假设能够利用调频接收模块来获得发送的信号。根据该信号的起始点来确定采集的起始点以保证能够采集到完整的一帧 Chip 信号;在实际测试中,距离的重复误差应该在 1 厘米左右,如果大于这个误差,请检查一下你的电路中实际信号的幅值和噪声。
公众号留言
卓大大,可千万别把电磁 AI 的赛道搞得太长,我刚试了一下,推车采集数据真的好累人啊 /::<身体累是一方面,心也累,都不知道辛辛苦苦采集的数据训练的结果会是啥鬼样子。