主要内容

线性麦克风阵列的实时到达方向估计

这个例子展示了如何获取和处理实时多通道音频。本文还提出了一种利用线性阵列内的多个麦克风对估计声源到达方向(DOA)的简单算法。

选择并配置音频样本的来源

如果一个多通道输入音频接口是可用的,然后修改这个脚本设置sourceChoice“生活”.在此模式下,本例使用实时音频输入信号。本例假定所有输入(两个或多个)由排列在线性阵列上的麦克风驱动。如果没有麦克风阵列或多声道声卡可用,则进行设置sourceChoice“记录”.在这种模式下,本例使用预先录制的音频样本,通过线性阵列获取。为sourceChoice = '活',下面的代码使用audioDeviceReader通过Microsoft®Kinect™for Windows®获得4个实时音频通道。使用另一个麦克风阵列设置,确保所安装的音频设备驱动程序是MATLAB®支持的常规类型之一,并设置万博1manbetx设备的属性audioDeviceReader相应的行动。您可以查询有效设备通过调用getAudioDevices对象的函数audioDeviceReader.请注意,即使在使用微软Kinect时,设备名称也可能因机器而异,可能与本例中使用的设备名称不匹配。使用制表符补全来获得机器上的正确名称。

sourceChoice =“记录”

设置实时处理的持续时间。设置每个通道获取和处理每个迭代的样本数。

endTime = 20;audioFrameLength = 3200;

创建源。

开关sourceChoice情况下“生活”fs = 16000;audioInput = audioDeviceReader (...“设备”,“麦克风阵列(微软Kinect USB音频)”,...“SampleRate”fs,...“NumChannels”4...“OutputDataType”,“双”,...“SamplesPerFrame”, audioFrameLength);情况下“记录”%此音频文件保存4个原始音频的20秒录音%渠道获得与微软Kinect(TM)的Windows(R)当噪声源在阵列前移动时%大约从-40度到+40度,然后回到%初始位置。audioFileName =“AudioArray-16-16-4channels-20secs.wav”;audioInput = dsp。AudioFileReader (...“OutputDataType”,“双”,...“文件名”audioFileName,...“PlayCount”正,...“SamplesPerFrame”, audioFrameLength);fs = audioInput.SampleRate;结束

定义数组几何

以下值确定了Microsoft Kinect™的4个内置麦克风相对于RGB相机的位置的近似线性坐标(本例中未使用)。对于三维坐标使用[[x1;y1;z1], [x2;y2;z2],…, [xN; yN;锌]]

micPositions = [-0.088, 0.042, 0.078, 0.11];

形式麦克风对

本例中使用的算法可以独立地处理对麦克风。然后将单个DOA估计值组合起来,提供单个活DOA输出。可用的对越多,DOA估计就越可靠(但计算成本更高)。可用对的最大数目可以计算为nchoosek(长度(micPositions), 2).在这种情况下,选择麦克风间距离最大的3对。传声器间距离越大,对DOA估计越敏感。下面矩阵的每一列描述阵列中麦克风对的选择。所有值必须是1到之间的整数长度(micPositions)

micPairs = [14;1 3;1 2];numPairs = size(micPairs, 1);

初始化DOA可视化

创建辅助绘图对象dodisplay的实例。在极坐标图上用箭头显示估计的DOA。

DOAPointer = DOADisplay ();

创建和配置算法构建块

根据麦克风对的选择方式,使用辅助对象重新排列输入样本。

bufferLength = 64;预处理程序= PairArrayPreprocessor (...“MicPositions”micPositions,...“MicPairs”micPairs,...“BufferLength”, bufferLength);micSeparations = getPairSeparations(预处理);

这个例子的主要算法构建块是一个互相关器。它与内插器一起使用,以确保更好的DOA分辨率。在这个简单的例子中,在不同的可用对中使用相同的两个对象就足够了。然而,通常情况下,不同的通道可能需要独立地保存它们的内部状态,因此需要由单独的对象来处理。

interpFactor = 8;b = interpFactor* fir1((2*interpFactor*8-1),1/interpFactor);groupDelay =值(grpdelay (b));插入器= dsp。FIRInterpolator (“InterpolationFactor”interpFactor,“分子”, b);

在循环中获取和处理信号

对于以下while循环的每次迭代audioFrameLength采样每个音频通道,处理数据以估计DOA值,并在定制的基于箭头的极坐标可视化上显示结果。

抽搐idx = 1:(endTime*fs/audioFrameLength) cycleStart = toc;%从音频源读取多通道帧返回的数组的大小是audioframlength x size(micPositions,2)multichannelAudioFrame = audioInput ();将获得的样品按4-D尺寸排列% bufferLength x numBuffers x 2 x numPairs,其中2是数量每个麦克风对%通道bufferedFrame =预处理器(multichannelAudioFrame);首先,独立地估计每一对的DOA%初始化跨可用对使用的数组numBuffers = size(bufferedFrame, 2);延迟= 0(1、numPairs);numPairs anglesInRadians = 0 (1);xcDense = 0 ((2*bufferLength-1)*interpFactor, numPairs);%循环遍历可用对kPair = 1: numPairs估计每个2通道缓冲器的传声器间延迟delayVector = 0 (numBuffers, 1);kBuffer = 1: numBuffers%交叉相关通道对得到一个粗糙%互相关xcCoarse = xcorr (...kBuffer bufferedFrame (:, 1, kPair),...bufferedFrame (:, kBuffer 2 kPair));%插入增加空间分辨率xcDense =插入器(flipud (xcCoarse));%提取位置最大,等于延迟采样时间%单位,包括插值滤波器的组延迟[~, idxloc] = max (xcDense);delayVector (kBuffer) =...(idxloc - groupDelay)/interpFactor - bufferLength;结束%通过选择中值来组合对之间的DOA估计延迟(kPair) =值(delayVector);使用microsoftspace将延迟转换为角度%的分离提供了anglesInRadians(kPair) = HelperDelayToAngle(delays(kPair), fs,...micSeparations (kPair));结束%通过保持中值来合并对之间的DOA估计DOAInRadians =值(anglesInRadians);%箭头显示DOAPointer (DOAInRadians)%如果使用记录的数据,人为延迟周期执行如果(比较字符串(sourceChoice“记录”暂停(audioframlength /fs - toc + cycleStart)结束结束

发行版(audioInput)