麦克风阵列几何属性

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

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

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

应用程序可以调用 IPart::GetSubType 来检索有关千头的信息,以确定插入千头的设备是否为麦克风阵列。 IPart::GetSubType 返回表示输入插针类型的 pin-category GUID。 如果插入的设备是麦克风阵列,则返回的 GUID 等于KSNODETYPE_MICROPHONE_ARRAY。 该应用程序还可以帮助你确定是否将麦克风阵列插入错误的千头。 在后一种方案中,返回的引脚类别 GUID 适用于其他设备,或者指示没有设备插入麦克风插针。 有关固定类别 GUID 详细信息,请参阅固定 类别属性

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

下面的代码示例演示音频KSAUDIO_MIC_ARRAY_GEOMETRY用于描述外部 USB 麦克风阵列的一个结构:

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 mm。

对于第二次修改,请编辑 Msvad.inf 文件,如 MSVAD Micarray 的 Modified INF 中所示

完成文件修改后,请完成以下过程,为麦克风阵列生成并安装示例驱动程序。

  1. 启动要工作的 WDK 生成环境。 例如,x86 免费生成环境。

  2. 导航到 Src\Audio\Msvad 文件夹。

  3. 键入 build 命令 ,然后按 Enter。

  4. 将修改后的 Msvad.inf 文件复制到生成过程创建的以下文件夹:

    Src\Audio\Msvad\Micarray\objfre_wlh_x86\i386

  5. 验证步骤 4 中的文件夹是否包含名为 Vadarray.sys。

  6. 打开控制面板并使用"添加硬件"手动安装示例驱动程序。

  7. 打开"声音"小控制面板然后单击"录制"选项卡,验证是否可以看到刚安装的虚拟麦克风阵列。

若要了解如何开发应用程序来发现麦克风阵列,请参阅如何为 Vista 生成和使用麦克风阵列Windows C。