主要内容

生活与线性麦克风阵列波达方向估计

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

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

如果一个多通道输入音频接口是可用的,然后修改该脚本设置sourceChoice“生活”。在这种模式下的例子使用现场音频输入信号。示例假定所有输入(两个或两个以上)是由麦克风安排在一个线性数组。如果没有麦克风阵列或多通道音频卡可用,然后设置sourceChoice“记录”。在这种模式下的例子使用预先录好的音频样本获得的线性数组。为sourceChoice = '活'下面的代码使用audioDeviceReader获得4声道生活通过Kinect™Microsoft®Windows®。使用另一个麦克风阵列设置,确保安装音频设备驱动程序是一种传统的类型由MATLAB®和设置金宝app设备的属性audioDeviceReader相应的行动。您可以查询有效设备作业你的电脑通过调用getAudioDevices对象的函数audioDeviceReader。注意,即使使用微软Kinect,设备名称在机器可能会有所不同,可能不匹配在本例中使用的。使用选项卡完成正确的名称在您的机器上。

sourceChoice =“记录”;

设置生活的时间处理。每通道获得多少样品,每个迭代过程。

endTime = 20;audioFrameLength = 3200;

创建源。

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

定义数组几何

以下值确定近似的线性坐标4内置麦克风微软的Kinect™相对于RGB相机的位置(在这个例子中不使用)。对3 d坐标使用[(x1, y1, z1), (x2, y2; z2)……,[xN; yN;锌]]

micPositions = (-0.088, 0.042, 0.078, 0.11);

形式麦克风对

在这个例子中使用的算法适用于对独立麦克风。然后结合个人DOA估计提供一个生活DOA输出。对可用越多,更健壮(然而计算昂贵)的DOA估计。对可用的最大数量可以计算nchoosek(长度(micPositions), 2)。在这种情况下,3双inter-microphone距离最大的选择。inter-microphone距离越大越敏感的DOA估计。每一列的矩阵描述了一对麦克风的选择在数组中。所有的值必须是整数1到长度(micPositions)

micPairs = [1 4;1 3;1 2];numPairs =大小(micPairs, 1);

初始化DOA可视化

DOADisplay创建辅助策划的一个实例对象。这将显示估计DOA与箭极坐标图。

DOAPointer = DOADisplay ();

创建和配置算法的构建块

使用一个辅助对象重新输入样本根据麦克风对如何选择。

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

这个例子的主要算法构建块是cross-correlator。结合使用一个插入器,以确保更好的DOA决议。在这个简单的例子中,它是充分使用相同的两个物体在不同对可用。不过,总体而言,不同的渠道可能需要独立保存他们的内部状态,因此由单独的对象。

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

在一个循环中获得和处理信号

在while循环的每次迭代:阅读audioFrameLength样品对于每个音频通道,处理数据来估计DOA值并显示定制arrow-based极地可视化结果。

抽搐idx = 1:(endTime * fs / audioFrameLength) cycleStart = toc;%读的多通道帧音频源%的返回的数组大小AudioFrameLength x大小(micPositions, 2)multichannelAudioFrame = audioInput ();%重新排列了样品在四维数组的大小% bufferLength numBuffers x 2 x numPairs 2的数量%每麦克风对渠道bufferedFrame =预处理器(multichannelAudioFrame);%,估计每一对的DOA,独立%初始化数组用于对可用numBuffers =大小(bufferedFrame, 2);延迟= 0 (1、numPairs);numPairs anglesInRadians = 0 (1);xcDense = 0 ((2 * bufferLength-1) * interpFactor numPairs);%对循环可用kPair = 1: numPairs%估计inter-microphone每个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);%将延迟转换成使用微软对空间角度%的分离提供了anglesInRadians (kPair) = HelperDelayToAngle (fs,延迟(kPair)micSeparations (kPair));结束%将DOA估计只对通过保持中间值DOAInRadians =值(anglesInRadians);%箭头显示DOAPointer (DOAInRadians)%的延迟周期执行人为如果使用记录数据如果(比较字符串(sourceChoice“记录”)暂停(audioFrameLength / fs - toc + cycleStart)结束结束

发行版(audioInput)