声音延迟的分辨率与空间分辨率之间的关系
通过相关运算可以获得声音传播的延迟,近而获得声源与接收MIC之间的距离。
由于声音信号是通过离散时间采样,因此对于时间 延迟的分辨率就会受到采样时间
的影响。在直线轨道上声音延迟信号分析
推文中,给出了是结果,如下图所示。可以看出时间延迟曲线呈现明显的台阶。这就是因为采样时间所引起的时间分辨率引起的。
根据实验延迟计算出空间距离,同样也会具有一个分辨率下限。
。其中的
是空气中的升速,
是声音信号采样时间。
下面讨论如何提高声音延迟的分辨率、计算效率、以及麦克的不同空间指向对于测量结果的影响。
快速相关运算
1、利用FFT加速计算相关运算
(1)相关运算的复杂度
对于两个时间信号
,它们的相关运算结果
定义如下:
如果这两个信号都是实值信号,公式里面的共轭就可以省略。
对于两个实数离散时间信号
,它们之间的普通相关运算定义为:
从相关运算定义来看,计算两个长度为 的序列相关运算,乘法、加法的计算复杂度与 成正比。
(2)相关运算与卷积运算的关系
在信号运算中,还有一个应用更广泛的运算:卷积运算。
之间的卷积运算定义为:
对比一下信号的相关运算和卷积运算的定义,可以看出它们之间的关系:
(2)快速卷积数值计算
之所以讨论相关运算与卷积运算之间的关系,是为了寻找相关运算的快速算法。
计算一个序列 的离散傅里叶变换 有相应的快速算法-快速傅里叶变换 ,在 为2的整数次幂的情况下,计算FFT的乘法,加法的复杂度都在 的数量级别。正变换和反变换的复杂度相同。
在根据傅里叶变换的卷积定理,序列的时域卷积(和)运算,在频域是乘积运算。基于此,再利用前面讨论的相关与卷积运算之间的关系,可以得到计算两个序列的相关运算的快速算法:
在实际工程中,往往参与卷积的两个信号实现已知,比如在利用声音定位的时候,发送声音信号往往是事先确定好的固定的Chirp信号,每次参与计算的新的信号是接收到的回声信号。所以在上面卷积的快速算法中,对于已知信号的FFT可以事先计算好并存储,实际运算中只需要完成对新采集到信号的FFT计算,以及对乘积结果的反FFT计算。
最后需要补充一下,在利用上面公式计算的时候,还需要将两个信号通过补0,变成长度等于两个序列长度之和减一。
在下面程序中,首先简单的将两个等长序列都补零成两倍的长度。然后按照前面公式计算出卷积结果。
def procdatafft(send, rece):
sm = mean(send)
rm = mean(rece)
send = [d - sm for d in send]
rece = [d - rm for d in rece]
sendspace = zeros(len(send) * 2)
sendspace[0:len(send)] = send
recespace = zeros(len(send) * 2)
recespace[0:len(send)] = rece
cor = list((fft.ifft(fft.fft(sendspace) * conj(fft.fft(recespace)))).real)
maxpos = cor.index(max(cor))
return maxpos
使用快速计算,比直接在时域中进行卷积速度大大提高了。
通过计算获得100个采样数据相关峰值点,使用FFT需要大约:0.36秒钟;而使用普通的相关运算则需要200秒左右。
通过FFT得到的相关结果峰值位置
使用FFT计算100点相关结果只需要0.37秒
直接计算100点相关结果则需要192秒左右
提高相关运算的空间精度
1. 为什么前面测量结果曲线中出现台阶
如果直接根据序列的相关结果峰值位置确定声音延迟,那么声音延迟的时间分辨率就是声音信号的采样时间 ,再根据声音速度 ,可以计算出所对应的测量距离的空间分辨率 。
在采样时间 ,20℃空气速度 ,对应的空间分辨率 ,也就是当收音麦克与音源之间的距离变化小于3.4厘米时,所测量得到的结果是一样的。这也就解释了前面100个位置点测量声音延迟曲线出现了很多台阶的原因。
2. 如何提高测量结果的空间分辨率
提高基于声音采样数据相关方法测量距离的空间分辨率,可以通过提高AD采样速率来解决。但这需要更高速的AD转换器,更多的数据存储内存以及更快速数据计算能力。
除此之外,还可以通过数据插值处理的方法来提高测量结果的空间分辨率。
数据插值柯阳春从离散时间采样数据 中获得时间更加密集的数据 。插值分解成两个过程:第一个过程是将离散时间信号恢复成一个连续时间信号 ;第二个过程就是在连续时间信号的基础上采用更加密集的是时间间隔采样 。
恢复成连续时间信号可以有零阶保持、一阶保持、理想插值等不同方法,它们都可以看成是离散时间采样脉冲信号与一个插值函数进行卷积的结果: 。
零阶保持、一阶保持、理想插值分别对应的卷积信号是矩形信号、三角信号以及
信号等。
不同的离散时间信号重建成连续时间信号的方法
使用理想插值所获得的结果更加平滑,但计算起来相对比较复杂。但如果是从离散时间信号的傅里叶变换结果中恢复插值信号的话,则有一个非常方便的方法,那就是通过对数据的DFT结果补零,获得更长的频谱数据,再通过反离散傅里叶变换,就可以得到原来数据的理想插值结果了。具体的 原理在信号与系统课程中会进行介绍的。
由于前面在快速计算相关结果的时候,就利用了快速傅里叶变换,所以可以在最后一步进行反傅里叶变换的时候,先进行补零,然后在进行
def procdatafftinterpolation(send, rece, interptime):
sm = mean(send)
rm = mean(rece)
send = [d - sm for d in send]
rece = [d - rm for d in rece]
sendspace = zeros(len(send) * 2)
sendspace[0:len(send)] = send
recespace = zeros(len(send) * 2)
recespace[0:len(send)] = rece
fftresult = fft.fft(sendspace) * conj(fft.fft(recespace))
fftexpand = zeros(len(send) * interptime * 2, dtype=complex64)
fftexpand[0:len(send)] = fftresult[0:len(send)]
fftexpand[-len(send):] = fftresult[len(send):len(send)*2]
cor = list(fft.ifft(fftexpand).real)
maxpos = cor.index(max(cor))
return maxpos
下面给出了插值10倍之后所获得的相关峰值位置结果,对比原始计算方法,可以看到经过插值之后的结果明显平滑多了。通过插值后的结果所获得的空间分辨率就从原来的3.6厘米降低到3.6毫米了。
经过空间插值细化后10倍后的相关峰值位置计算结构
由于实验环境是在室内,存在着很多反射波的干扰,所以当距离远了之后,距离测量出现了很多的波动,它们反映了空间中的很多驻波干扰。
随着插值倍数增加,所得到延迟曲线变化
通过简单的差值就可以轻松提高测距的空间分辨率,所需要的代价就是计算时间加长了。下面图给出了插值的倍数与结果计算消耗的时间之间的关系,整体上呈现线性比例关系。
细化倍数和计算时间
室内环境反射波对于测量结果的影响
由于是在室内进行实验,麦克风所接受到的声音信号除了直接来自于声源之外,可能还包括有四周墙壁的反射信号。如果声源距离比较近,四周的反射声波强度受到衰减,对于测量结果影响较小。
下面通过控制接受麦克的不同方向,考察一下测量结果是否受到影响。
使用舵机控制MIC的方向
下面是麦克距离音箱30厘米左右,方向从左到右旋转180°,所测到得到的声音延迟时间。
不同指向对应的相关延迟结果
延迟时间对应的最大值和最小值分别是:
在10kHz的采样率下,上述时间差所对应的距离变化为:
这个3厘米的变化距离和麦克风转动过程中所引起的距离变化大体相当,说明此事四周的反射波对于测量结果影响不大。同时所使用的MIC的方向指向性并不强,可以对来自于180°方向的声波都能够很好的探测。
下面是分别将麦克在距离音箱10厘米和50厘米处重新测量不同的指向对于测距结果的影响。
在10厘米距离下麦克不同方向对应的声音延迟
在50厘米距离下麦克不同方向对应的声音延迟