为什么是两个互相关(xcorr)同时记录的音频信号总是随机返回不同的滞后?救命!!

74次(最近30天)
阿里Soban
阿里Soban 16 2018年1月
回答: 杰弗里·诺埃在2019年4月11日
嗨,大家好!我工作的一个声音本地化项目中,我同时录制两个音频信号,然后把他们的“互相关”,找出“滞后”两个信号之间存在!但是,什么情况是,每一次随机的角度,因为每次滞后的突然值的计算!我不知道我要去哪里错了!请指导我,如果有更好的方法,以达到更好的声音定位!该代码给出如下:
如果真正
FS = 48000;%在赫兹采样频率
recObj1 = audiorecorder(FS,16,1,1);
recObj2 = audiorecorder(FS,16,1,2);
记录(recObj1);
记录(recObj2);
暂停(5);用于同时5秒%记录
止动件(recObj1);
止动件(recObj2);
OUT1 = getaudiodata(recObj1,'INT16');
OUT2 = getaudiodata(recObj2,'INT16');
L = OUT1;
R = OUT2;
T1 =(0:长度(L)-1)/ FS;
T2 =(0:长度(R)-1)/ FS;
数字;
情节(T1,L);
数字;
情节(T2,R);
阈值= 100;
K = 1;
赢= 200;
[K MAX(L)最高(R)]
如果MAX(L)>第&&最大值(R)>第%设定功率阈值
并[c,滞后] = xcorr(L,R);
[A1,B1] = MAX(L);
[A2,B2] = MAX(R);
[A3,B3] = MAX(C);
S =滞后(B3);
TIME_DELAY = S / FS;
DISP(TIME_DELAY);
S = ABS(S);%以绝对的S
DISP(“估计角”);
C = 342;在室温下声音%平均速度
DIS = 1;%两个麦克风之间的平均距离
CAL =((TIME_DELAY * C)/ DIS);
如果CAL <-1
CAL = -1;
ELSEIFCAL> 1
CAL = 1;
结束
ANG =((acosd(CAL))
DISP(ANG);%显示声源的角度由于这些麦克风
结束

0评论

登录发表评论。

接受的答案

加布里埃莱Bunkheila
加布里埃莱Bunkheila 16 2018年1月
嗨阿里,
我在音频系统工具箱队MathWorks公司工作。我不能完全仿照实验性功能,因为我没有你的硬件,但我可以看到的问题的几个可能的来源。
在你的代码似乎是从使用默认的音频驱动程序(通常的DirectSound或WASAPI在Windows上)两个不同的设备同时获取。这让你没有同步采集L和R两个设备本身可以异步操作系统触发的保证,给你两个信号之间的任意新的延迟,你运行你的脚本每一次。
同步采集的最简单的保证来自于获取相同设备的不同渠道,最理想的是采用它的ASIO驱动,而不是默认的一个。ASIO驱动,保证同步的多通道采集。
至少,你应该尝试像下面这样,它得到L和R来自同一设备的前两个渠道:
recObj = audiorecorder(FS,16,如图2所示,设备ID);
更妙的是,你可能想尝试 audioDeviceReader 对象音响系统工具箱,它支持ASIO驱动程序,并经常使用在那里对延迟敏感的声学万博1manbetx测量。见例如,从参考文档页面(读取距离麦克风和写入音频文件)的第一个例子:
deviceReader = audioDeviceReader(“司机”'ASIO''NumChannels',2);
设置(deviceReader);
的FileWriter = dsp.AudioFileWriter('myTwoChannelRecording.wav');
DISP('记录...'
抽动;
TOC <5
acquiredAudio = deviceReader();
的FileWriter(acquiredAudio);
结束
DISP(“录制完成。”
释放(deviceReader);
释放(FileWriter的);
audioDeviceReader也给你通过我们所说的信道映射任何任意对从设备通道的能力来获取。
你会发现在音频测量延迟下更详细的解释 音频I / O:缓冲,延迟时间和吞吐量
我希望这有帮助。
问候,
加布里埃莱。

3条评论

阿里Soban
阿里Soban 16 2018年1月
但是,还有,我要面对的一个问题。我DONOT有该音响系统工具箱。是否有访问ASIO驱动任何替代办法?
加布里埃莱Bunkheila
加布里埃莱Bunkheila 在2018年1月17日
嗨阿里,
很遗憾听到这个!事实上,ASIO驱动程序是由MATLAB工具箱内最专业的应用和对他们的支持所使用的那些只配备了音频系统工具箱。万博1manbetx音频系统工具箱是适用于所有类型的许可证,包括学校,学生和家庭使用。我希望你能找到一个可行的方式将其添加到您的安装。
问候,
加布里埃莱。

登录发表评论。

更多的答案(1)

杰弗里·诺埃
杰弗里·诺埃 在2019年4月11日
谢谢您的指导加布里埃莱!我也一直在努力解决这个问题。
按照你的意见,我使用的是多声道音频接口(百灵U型隐斜UMC404HD),音响系统工具箱。下面是我发现。我在这里提到的数字和驱动程序可能是其他用户不同。
当“deviceReader”对象如下被实例化,
deviceReader = audioDeviceReader(“司机”'ASIO''NumChannels',2);
我发现有样品比应该减少22-27%。这可以通过下面的代码中找到:
[Y,FS] = audioread(文件名);
sampleDifference = Fs的* recordDuration - 长度(y)的
percentDifference = sampleDifference /(FS * recordDuration)* 100
有了如此巨大的错误,音频本地化无法做到的。相反,如果“deviceReader”与“设备”指定(百灵在我的情况下,在其网站上提供的驱动程序)实例化,“sampleDifference”大大降低!它可以微调也通过使用“SamplesPerFrame”参数。
deviceReader = audioDeviceReader(“司机”'ASIO''设备''UMC ASIO驱动''NumChannels',2,'SamplesPerFrame',128);
我发现,通过使这种变化,“percentDifference”可以一致地降低到0.01%!
我也建议关闭所有非必要的应用程序,把所有无线设备关闭(的Wi-Fi,蓝牙等),并增加Matlab的优先级。在Windows 10,这是通过任务管理器来完成。
截图(9).PNG
使用具有接地,正和负导线3针音频设备时,此最后的步骤是有帮助的。正和负导线都携带音频,但具有相反的极性,以从外界干扰噪声抵消。测试表明每个麦克风都会有不同的噪声特性。它们的极性将降低到准确找到音频接收之间的样本数在麦克风1和麦克风2,它是由对两个输入执行互相关发现的能力。
一个简单的解决方法是在执行互相关时找到的两个输入的绝对值以供使用。
[Y,FS] = audioread(文件名);
Y = ABS(Y);
下面是脚本高达互相关的点。
%关闭所有数字和清晰的变量
所有
明确
%设置设备读取器
文件名='myTwoChannelRecording.wav';
deviceReader = audioDeviceReader(“司机”'ASIO''设备''UMC ASIO驱动''NumChannels',2,'SamplesPerFrame',128);
设置(deviceReader);
的FileWriter = dsp.AudioFileWriter(文件名);
%录制的声音
recordDuration = 5;
DISP('记录...'
抽动;
TOC
acquiredAudio = deviceReader();
的FileWriter(acquiredAudio);
结束
DISP(“录制完成。”
%释放系统资源
释放(deviceReader);
释放(FileWriter的);
%读取音频文件
[Y,FS] = audioread(文件名);
Y = ABS(Y);
%显示预期的样本数与数之间的差异
实际样品的%
sampleDifference = Fs的* recordDuration - 长度(y)的
percentDifference = sampleDifference /(FS * recordDuration)* 100
%分离出音频转换成左和右声道
leftAudio = Y(:,1);
rightAudio = Y(:,2);
%下进行互相关和绘制结果
[xCorrResult,滞后] = xcorr(leftAudio,rightAudio);
修正这些错误已经采取了相当长一段时间,所以我希望这可以帮助别人的工作,通过其中的一些问题。声学定位的一个很好的解释可以在YouTube上的视频在这里找到: 那个是从哪里来的?介绍了声本地化

0评论

登录发表评论。