共用方式為


麥克風陣列幾何屬性

在 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 類別屬性

在應用程式探索插入正確輸入插孔的麥克風陣列之後,下一個步驟是判斷陣列的幾何。 有三個基本幾何: 線性平面三維 (3D) 。 幾何資訊也會提供詳細資料,例如每個麥克風的頻率範圍和 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。