主要内容

基于线性传声器阵列的实时到达方向估计

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

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

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

sourceChoice =“记录”

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

endTime = 20;audioFrameLength = 3200;

创建源。

开关sourceChoice情况下“生活”Fs = 16000;audioInput = audioDeviceReader(...“设备”麦克风阵列(微软Kinect USB音频)...“SampleRate”fs,...“NumChannels”4...“OutputDataType”“双”...“SamplesPerFrame”, audioFrameLength);情况下“记录”这个音频文件包含一个20秒的录音4个原始音频%的频道通过微软Kinect(TM) for 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 = [1 4;1 3;1 2];numPairs = size(micPairs, 1);

初始化DOA可视化

创建辅助绘图对象DOADisplay的实例。这显示了估计的DOA在极图上的箭头。

DOAPointer = DOADisplay();

创建并配置算法构建块

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

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

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

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

在循环中获取和处理信号

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

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

发行版(audioInput)