利用FFT计算相位差
假设用两个麦克风同时录制一段音频,得到两个单声道的ogg文件
import numpy as np
import soundfile as sf
audio1, _ = sf.read('030_1.ogg')
audio2, _ = sf.read('030_2.ogg')
# 对音频进行傅里叶变换
fft1 = np.fft.fft(audio1)
fft2 = np.fft.fft(audio2)
# 计算幅度谱和相位谱
amp1 = np.abs(fft1)
amp2 = np.abs(fft2)
phase1 = np.angle(fft1)
phase2 = np.angle(fft2)
# 找到幅度谱中的最大值索引
index1 = np.argmax(amp1)
index2 = np.argmax(amp2)
# 计算相位差(角度)
phase_diff = (phase2[index2] - phase1[index1]) * 180 / np.pi
print("相位差: ", phase_diff)
已知频率和声速,可以使用公式:相位差(弧度)= 2π * (频率 / 速度) * 距离
将得到的相位差转化为距离
frequency = 44100 # 频率(采样率)
speed_of_sound = 340 # 声速(米/秒)
# 将相位差转换为弧度
phase_diff_rad = np.deg2rad(phase_diff)
# 计算距离
distance = (phase_diff_rad * speed_of_sound) / (2 * np.pi * frequency)
print("距离: ", distance, "米")