麦克风阵列几何属性

在 Windows Vista 及更高版本中,为麦克风阵列提供支持。 在大多数情况下,嵌入笔记本电脑或监视器中的单个麦克风无法很好地捕获声音。 麦克风数组可以更好地隔离声源,并拒绝环境噪音和混响。 KSPROPERTY_AUDIO_MIC_ARRAY_GEOMETRY属性指定麦克风阵列的几何图形。 属性值 KSAUDIO_MIC_ARRAY_GEOMETRY描述数组类型(线性、平面等),数组和其他功能中的麦克风数。

本主题介绍外部 USB 麦克风阵列如何使用 Windows Vista 提供的麦克风阵列支持。 外部 USB 麦克风阵列必须提供描述其数组的几何图形和其他特征以响应 GET_MEM 请求所需的参数。

USB 麦克风阵列使用标准格式来提供几何信息。 Windows Vista USB 音频类驱动程序在读取几何信息时必须使用相同的格式。 有关标准格式的详细信息,请参阅 麦克风阵列几何描述符格式

应用程序可以调用 IPart::GetSubType 来检索有关插孔的信息,以确定插入到插孔的设备是否为麦克风阵列。 IPart::GetSubType 返回表示输入插孔类型的插针类别 GUID。 如果插入的设备是麦克风阵列,则返回的 GUID 等于KSNODETYPE_MICROPHONE_ARRAY。 应用程序还可以帮助你确定是否将麦克风阵列插入错误的插孔。 在后一种情形中,返回的引脚类别 GUID 要么适用于其他设备,要么表示没有设备插入麦克风插孔。 有关引脚类别 GUID 的详细信息,请参阅 Pin Category 属性

应用程序发现插入正确输入插孔的麦克风阵列后,下一步是确定数组的几何图形。 有三个基本几何图形: 线性平面三维(三维)。 几何信息还提供详细信息,例如每个麦克风的频率范围和 x-y-z 坐标。

以下代码示例演示音频驱动程序用于描述外部 USB 麦克风阵列的KSAUDIO_MIC_ARRAY_GEOMETRY结构:

KSAUDIO_MIC_ARRAY_GEOMETRY mic_Array =
{
 0x100,// usVersion (1.0)
 KSMICARRAY_MICARRAYTYPE_LINEAR,// usMicArrayType
 7854,  // wVerticalAngleBegin (45 deg; PI/4 radians x 10000)
 -7854,  // wVerticalAngleEnd
 0, // lHorizontalAngleBegin
 0, // lHorizontalAngleEnd
 25, // usFrequencyBandLo in Hz
 19500, // usFrequencyBandHi in Hz
 2,  // usNumberOfMicrophones
 ar_mic_Coordinates // KsMicCoord
};

在前面的代码示例中,ar_mic_Coordinates变量是KSAUDIO_MICROPHONE_COORDINATES结构的数组,它包含麦克风数组中麦克风的坐标。

下面的代码示例演示如何使用ar_mic_Coordinates数组来描述麦克风阵列中的麦克风的几何位置,如前面的代码示例中所述:

KsMicCoord ar_mic_Coordinates[] =
{
 // Array microphone 1
 {
  KSMICARRAY_MICTYPE_CARDIOID,// usType
  100, // wXCoord (mic elements are 200 mm apart)
  0,// wYCoord 
  0, // wZCoord 
  0,// wVerticalAngle
  0,// wHorizontalAngle
 },
 // Array microphone 2
 {
  KSMICARRAY_MICTYPE_CARDIOID,// usType
  -100, // wXCoord 
  0,// wYCoord 
  0, // wZCoord 
  0,// wVerticalAngle
  0,// wHorizontalAngle
 }
};

在前面的代码示例中,将为麦克风阵列中的每个麦克风提供 x-y-z 坐标,以及描述其有效工作区域的垂直和水平角度。

若要修改 Micarray MSVAD 示例驱动程序以提供虚拟麦克风阵列的阵列几何信息,必须执行以下任务。

首先,导航到 Src\Audio\Msvad\Micarray 并找到Mintopo.cpp文件。 编辑Mintopo.cpp中的属性处理程序部分,以便KSAUDIO_MIC_ARRAY_GEOMETRY结构包含有关麦克风阵列的信息。 必须修改的代码的特定部分显示在以下代码示例中:

// Modify this portion of PropertyHandlerMicArrayGeometry
PKSAUDIO_MIC_ARRAY_GEOMETRY pMAG = (PKSAUDIO_MIC_ARRAY_GEOMETRY)PropertyRequest->Value;

// fill in mic array geometry fields
pMAG->usVersion = 0x0100;           // Version of Mic array specification (0x0100)
pMAG->usMicArrayType = (USHORT)KSMICARRAY_MICARRAYTYPE_LINEAR;        // Type of Mic Array
pMAG->wVerticalAngleBegin = -7854;  // Work Volume Vertical Angle Begin (-45 degrees)
pMAG->wVerticalAngleEnd   =  7854;  // Work Volume Vertical Angle End   (+45 degrees)
pMAG->wHorizontalAngleBegin = 0;    // Work Volume Horizontal Angle Begin
pMAG->wHorizontalAngleEnd   = 0;    // Work Volume Horizontal Angle End
pMAG->usFrequencyBandLo = 100;      // Low end of Freq Range
pMAG->usFrequencyBandHi = 8000;     // High end of Freq Range
 
pMAG->usNumberOfMicrophones = 2;    // Count of microphone coordinate structures to follow.

pMAG->KsMicCoord[0].usType = (USHORT)KSMICARRAY_MICTYPE_CARDIOID;          
pMAG->KsMicCoord[0].wXCoord = -100; // mic elements are 200 mm apart
pMAG->KsMicCoord[0].wYCoord = 0;         
pMAG->KsMicCoord[0].wZCoord = 0;         
pMAG->KsMicCoord[0].wVerticalAngle = 0;  
pMAG->KsMicCoord[0].wHorizontalAngle = 0;

pMAG->KsMicCoord[1].usType = (USHORT)KSMICARRAY_MICTYPE_CARDIOID;          
pMAG->KsMicCoord[1].wXCoord = 100;  // mic elements are 200 mm apart
pMAG->KsMicCoord[1].wYCoord = 0;         
pMAG->KsMicCoord[1].wZCoord = 0;         
pMAG->KsMicCoord[1].wVerticalAngle = 0;  
pMAG->KsMicCoord[1].wHorizontalAngle = 0;

前面的代码示例显示了为具有两个麦克风元素的线性麦克风阵列提供的信息,每个元素都是有心形类型,并且位于数组中心 100 毫米。

有关如何开发应用程序以发现麦克风阵列的信息,请参阅 有关如何为 Windows Vista 生成和使用麦克风阵列的附录 C。