麦克风阵列信号测试:相位测试(python)

对于麦克风阵列来讲,N个麦克风之间信号是否有延迟,可以通过N个数据之间的相位差来判断。相位差是判断麦克风信号同步性的重要指标之一。

1. 相位和相位差

首先解释一下什么是相位和相位差。

1.1 相位

相位(phase) 是对于一个波,特定的时刻在它循环中的位置:一种它是否在波峰、波谷或它们之间的某点的标度。

相位描述信号波形变化的度量,通常以(角度)作为单位,也称作相角。 当信号波形以周期的方式变化,波形循环一周即为360° 。

例如:在函数y=Acos(ωx+φ)中,ωx+φ称为相位

1.2 相位差

相位差:两个作同频率周期变化的物理量的相之间的差值叫做相位差,或者叫做相差。

简谐运动中的相位差:如果两个简谐运动的频率相等,其初相位分别是φ1,φ2。当φ2>φ1时,他们的相位差是:

△φ=(ωt+φ2)-(ωt+φ1)=φ2-φ1

此时我们常说2的相位比1超前△φ。

2. python求MIC阵列相位差

以下主要讲如何使用python求麦克风阵列信号间的相位差。以两个信号为例,假设该两个信号为两路麦克风信号获得的数据。

2.1 实现思路

录音音频中的信号为时域信号,需要通过傅立叶变换变成频域信号,而傅立叶变换后的数据为复数,实部表示的是振幅,虚部表示的是相位。而相位计算最重要的一步在于解卷绕

关于解卷绕的具体解释,可参考以下链接:
https://blog.csdn.net/bpssy/article/details/22218589

2.2 Python实现

需要调用的库:

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度,符合预期。
麦克风阵列信号测试:相位测试(python)_第1张图片

更多文章请关注微信公众号「智能音箱设计」。

你可能感兴趣的:(人工智能,python)