赞
踩
对于麦克风阵列来讲,N个麦克风之间信号是否有延迟,可以通过N个数据之间的相位差来判断。相位差是判断麦克风信号同步性的重要指标之一。
首先解释一下什么是相位和相位差。
相位(phase) 是对于一个波,特定的时刻在它循环中的位置:一种它是否在波峰、波谷或它们之间的某点的标度。
相位描述信号波形变化的度量,通常以度(角度)作为单位,也称作相角。 当信号波形以周期的方式变化,波形循环一周即为360° 。
例如:在函数y=Acos(ωx+φ)中,ωx+φ称为相位。
相位差:两个作同频率周期变化的物理量的相之间的差值叫做相位差,或者叫做相差。
简谐运动中的相位差:如果两个简谐运动的频率相等,其初相位分别是φ1,φ2。当φ2>φ1时,他们的相位差是:
△φ=(ωt+φ2)-(ωt+φ1)=φ2-φ1
此时我们常说2的相位比1超前△φ。
以下主要讲如何使用python求麦克风阵列信号间的相位差。以两个信号为例,假设该两个信号为两路麦克风信号获得的数据。
录音音频中的信号为时域信号,需要通过傅立叶变换变成频域信号,而傅立叶变换后的数据为复数,实部表示的是振幅,虚部表示的是相位。而相位计算最重要的一步在于解卷绕。
关于解卷绕的具体解释,可参考以下链接:
https://blog.csdn.net/bpssy/article/details/22218589
需要调用的库:
import wave
import numpy as np
import scipy.signal as signal
import matplotlib.pyplot as plt
设置采样率和时长:
framerate = 16000
time = 1
生成两个信号,两个信号的相位差是10°:
# 产生时长1秒采样率16kHz的100Hz - 8kHz的扫频信号
t = np.arange(0, time, 1.0/framerate)
wave_data = signal.chirp(t, 100, time, 8000, method='linear')
wave_data2 = signal.chirp(t, 100, time, 8000, method='linear',phi = 10)
进行傅立叶变换,时域变频域:
data1 = np.fft.rfft(wave_data)/len(wave_data)
fr = np.fft.rfftfreq(len(wave_data),1/framerate)
sp1 = 20*np.log10(np.abs(data1))
data11 = np.fft.fft(wave_data)
data21 = np.fft.fft(wave_data2)
data111 = np.angle(data11, deg = True)
data211 = np.angle(data21,deg = True)
#对数据进行解卷绕unwrap#
data112 = data111/180*np.pi
data113 = np.unwrap(data112)
绘图,显示结果:
plt.figure('Phase_delta',figsize=(8,4))
plt.plot((data213[:512]-data113[:512])*180/np.pi,label = 'data213-data113')
plt.ylim(0,50)
plt.legend()
plt.show()
最终结果如下图,两个信号有效频率区间的相位差为10度,符合预期。
更多文章请关注微信公众号「智能音箱设计」。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。