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

这个例子显示了如何获取并处理现场的多声道音频。它也提出用于估计方向上使用线性阵列内的多个麦克风对的声源的到达(DOA)的简单算法。

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

如果多声道音频输入接口可用,则修改此脚本设置sourceChoice“活”。在这种模式下,例如将使用实况音频输入信号 - 它也将假定被布置成线性阵列上的麦克风驱动所有输入(两个或更多)。如果没有麦克风阵列和多声道音频卡可用,然后设置sourceChoice为“记录”。在这种模式下,例如将使用预先记录的音频样本,具有线性阵列获得的。对于sourceChoice =“活”,下面的代码使用audioDeviceReader获得通过微软Kinect™适用于Windows®4个现场音频通道。使用另一个麦克风阵列设置,确保所安装的音频设备驱动程序是通过MATLAB支承并设置常规类型中的一种万博1manbetx设备财产audioDeviceReader因此。您可以查询有效设备给你的电脑分配任务getAudioDevices的方法audioDeviceReader宾语。注意,使用微软Kinect即使,设备名称可在机器有所不同,可能不符合在本例中的一个。使用Tab键完成,让您的机器上正确的名称。

% sourceChoice = {'recorded'|'live'}sourceChoice =“记录”;%确定进行实时处理应该持续多久ENDTIME = 20;%和多少每个声道的样本应该获取,并在每个处理%的迭代audioFrameLength = 3200;开关sourceChoice案件'生活'fs = 16000;audioInput = audioDeviceReader (...'设备'“麦克风阵列(微软Kinect USB音频)”...'采样率'fs,...“NumChannels”4,...'OutputDataType'“双”...'SamplesPerFrame',audioFrameLength);案件“记录”%以下的音频文件保存4原料的20秒的记录用微软Kinect(TM)用于获取%音频通道窗(R)在存在噪声源的情况下向前移动%数组大致从-40度到+40度,然后返回%至初始位置。audioFileName =“AudioArray-16-16-4channels-20secs.wav”;audioInput = dsp.AudioFileReader(...'OutputDataType'“双”...'文件名',audioFileName,...'播放计数',INF,...'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(长度(微位置),2)计算出可用对的最大数量。在这种情况下,选择麦克风间距离最大的3对。麦克风间距离越大,DOA估计越敏感。下列矩阵的每一列描述阵列中麦克风对的选择。所有值必须是1和长度之间的整数(micposition)。

micpair n .一对;1 3;1 2];数对=尺寸(米对,1);

初始化DOA可视化

%创建辅助绘图对象DOADisplay的一个实例。这将在极坐标图中以箭头显示估计的DOA。DOAPointer = DOADisplay ();

创建和配置算法构建块

音频帧的长度

BufferLength中= 64;方法重新排列输入样例选择%麦克风对预处理器= PairArrayPreprocessor(...'MicPositions',micPositions,...'MicPairs',micPairs,...“BufferLength”,bufferLength);micSeparations = getPairSeparations(预处理);%本实施例的主算法builing块是互相关。%即一起使用的内插器,以确保一更细的DOA% 解析度。在这个简单的情况下,就能够使用相同的两个对象跨可用的不同对。不过,总体而言,不同的通道可能需要独立地保存它们的内部状态%,因此要由单独的对象来处理。XCorrelator = dsp.Crosscorrelator (...'方法'频域的);interpFactor = 8;b = interpFactor* fir1((2*interpFactor*8-1),1/interpFactor);groupDelay =值(grpdelay (b));插入器= dsp.FIRInterpolator (...“InterpolationFactor”interpFactor,...'分子',b);

在循环中获取和处理信号

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

抽搐对于IDX = 1:(结束时间* FS / audioFrameLength)cycleStart = TOC;从音频源读取多通道帧%返回的数组是大小AudioFrameLength X的大小(micPositions,2)multichannelAudioFrame = audioInput();%将采集到的样本重新排列成大小为4-D的数组% bufferLength x numbuffer x 2 x个数字对,其中2是的个数每个麦克风对%通道bufferedFrame =预处理器(multichannelAudioFrame);%首先估计DOA对于每一对,独立地在可用对用来%初始化数组numBuffers =尺寸(bufferedFrame,2);延迟=零(1,numPairs);anglesInRadians =零(1,numPairs);xcDense =零((2 * BufferLength中-1)* interpFactor,numPairs);循环遍历可用的对对于kPair = 1:numPairs估计每个2通道缓冲区的麦克风间延迟delayVector =零(numbuffer, 1);对于kBuffer = 1:numBuffers%互相关对渠道得到粗互%xcCoarse = XCorrelator(...bufferedFrame(:,kBuffer,1,kPair),...bufferedFrame(:,kBuffer,2,kPair));%插值来提高空间分辨率xcDense =内插器(flipud(xcCoarse));最大的%提取物位置,等于采样时间延迟%的单位,包括分组延时的插值滤波器[~,idxloc] = max (xcDense);delayVector (kBuffer) =...(idxloc -群延迟)/interpFactor - bufferLength;结束%结合DOA估计跨对通过选择中间值延迟(kPair) =值(delayVector);%转换成延迟角使用Microsoft对空间%的分离提供anglesInRadians(kPair)= HelperDelayToAngle(延迟(kPair),FS,...micSeparations(kPair));结束通过只保留中间值来合并成对的DOA估计DOAInRadians =中间值(anglesInRadians);%箭头显示DOAPointer (DOAInRadians)如果人为地利用记录数据延迟%周期执行如果(的strcmp(sourceChoice,“记录”))暂停(audioFrameLength / FS  -  TOC + cycleStart)结束结束发行版(audioInput)