主要内容

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

此示例显示如何获取和处理实时多声道音频。它还介绍了一种简单的算法,用于使用线性阵列内的多个麦克风对估计声源的到达方向(DOA)。

选择并配置音频样本源

如果提供多声道输入音频接口,则修改此脚本以设置酸奶精力'居住'。在此模式下,示例使用实时音频输入信号。该示例假定所有输入(两个或更多个)由布置在线性阵列上的麦克风驱动。如果没有使用麦克风阵列或多通道音频卡,则设置酸奶精力'录制'。在此模式下,该示例使用使用线性阵列获取的预先记录的音频样本。为了SourceChoice ='活',以下代码使用audiodevicereader.通过用于Windows®的Microsoft Kinect™来获取4个实时音频通道。要使用其他麦克风阵列设置,请确保已安装的音频设备驱动程序是MATLAB支持的传统类型之一,并设置金宝app设备财产audiodevicereader.因此。您可以查询有效设备通过调用来分配您的计算机GetAudioDevices.对象功能audiodevicereader.。请注意,即使使用Microsoft Kinect时,设备名称也会因计算机而异,可能与此示例中使用的设备不匹配。使用选项卡完成以在计算机上获取正确的名称。

SourceChoice =.'录制';

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

终点= 20;audioframelength = 3200;

创建源。

转变酸奶精力案件'居住'FS = 16000;udioInput = audiodevicereader(......'设备''麦克风阵列(Microsoft Kinect USB Audio)'......'采样率',fs,......'numchannels',4,......'outputdatatype''双倍的'......'samplesperframe',audioframelength);案件'录制'%此音频文件可容纳4个原始音频的20秒录制使用Microsoft Kinect(TM)获取的%频道用于Windows(R)%在数组前移动的嘈杂源的存在%大约从-40到约+ 40度,然后回到% 初始位置。audiofilename ='audioArray-16-16-4Channels-20secs.wav';udioInput = dsp.audiofilereader(......'outputdatatype''双倍的'......'文件名',audiofilename,......'播放计数',inf,......'samplesperframe',audioframelength);fs = audioInput.samplerate;结尾

定义阵列几何图形

以下值识别相对于RGB相机的位置(在本示例中使用的位置)的Microsoft Kinect™的4个内置麦克风的近似线性坐标。对于3D坐标使用[[x1; y1; z1],[x2; y2; z2],...,[xn; yn; zn]]

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

形成麦克风对

本例中使用的算法独立地使用一对麦克风。然后,它结合了各个DOA估计以提供单个实时DOA输出。可用的成对越多,更强大(且计算昂贵)DOA估计。可以计算最大可用的成对数为NCHOOSEK(长度(MICPORIONS),2)。在这种情况下,选择具有最大麦克风距离的3对。麦克风间距离越大,DOA估计越敏感。以下矩阵的每列描述阵列内的麦克风对的选择。所有值必须是1之间的整数长度(micPositions)

micpaire = [1 4;1 3;1 2];numpairs = size(云极,1);

初始化DOA可视化

创建辅助绘图对象Doadisplay的实例。这将显示估计的DOA与极性图上的箭头一起生活。

dooapointer = doadisplay();

创建和配置算法构建块

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

bufferlength = 64;preprocessor = pairaraypreprocessor(......'micPositions',micpositions,......'云极',弥脚,......'bufferLength',bufferlength);mickeparations = getPairseparations(预处理器);

该示例的主要算法构建块是交叉相关器。这与内插器一起使用以确保更精细的DOA分辨率。在这种简单的情况下,在可用的不同对中使用相同的两个对象足以使用。然而,通常,不同的信道可能需要独立地保存其内部状态,从而通过单独的对象处理。

Xcorrelator = dsp.crosscorrelator('方法''频域');interpfortor = 8;b = interpfortor * fir1((2 * interportor * 8-1),1 / interpfortor);groupdelay =中位数(grpdelay(b));InterpoLator = dsp.firinterpolator('InterpolationFactor',interportor,'分子',b);

在循环中获取和处理信号

对于以下循环的每次迭代:读取audioframelength.每个音频通道的示例,处理数据以估计DOA值并显示基于箭头的极性可视化上的结果。

Tic.为了IDX = 1:(ENDTIME * FS / AUDIOFRameLength)Cyclestart = TOC;%从音频源读取多声道帧%返回的数组的大小是obioframelength x大小(micPositions,2)multhichannelaudioframe = audioInput();%重新排列在4-D尺寸方面所获得的采样%bufferlength x numbuffers x 2 x numpairs其中2是数量每个麦克风对的%频道bufferedframe = preprocessor(multichannelaudioframe);%首先,独立地估计每对的DOA%初始化跨可用对使用的阵列numbuffers = size(bufferedframe,2);延迟=零(1,数字);Anglesinradians = Zeros(1,NumPairs);xcdense =零((2 * bufferlength-1)* interpfortor,numbairs);%循环通过可用对为了kpair = 1:numpairs每个2通道缓冲区的次级麦克风差异百分比delayvector =零(numbuffers,1);为了KBUFFER = 1:NUMBUFFERS%交叉相关对通道以获得粗糙%跨相关性xccoarse = xcorrelator(......BufferedFrame(:,KBuffer,1,Kpair),......BufferedFrame(:,KBuffer,2,Kpair));%插值以增加空间分辨率xcdense =插值器(flipud(xcroarse));%提取最大位置,等于采样时间的延迟%单位,包括插值滤波器的组延迟[〜,idxloc] = max(xcdense);DelayVector(KBuffer)=......(idxloc  -  groupdelay)/ interpfortor  -  bufferlength;结尾通过选择中位值来跨对的数量估计。延迟(kpair)=中位数(delayvector);使用Microsoft对空间将延迟转换为角度提供的%分离Anglesinradians(Kpair)= HelperdelaytoAngle(延迟(kpair),fs,......MICSEPLATIONS(KPAIR));结尾通过保持中位值,%相结合DOA估计DoaInradians =中位数(Anglesinradians);%arrow显示dooapointer(努餐车)如果使用录制的数据,则延时周期执行如果(strcmp(sourcechoice,'录制'))暂停(audioframelength / fs  -  toc + cyclestart)结尾结尾

发布(探听)