麦克风阵列几何属性

在 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 的详细信息,请参阅引脚类别属性

应用程序发现插入正确输入插孔的麦克风阵列后,下一步是确定阵列的几何图形。 有三个基本几何图形:线性平面三维 (3-D)。 几何图形信息还提供详细信息,例如每个麦克风的频率范围和 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。