Freigeben über


Geometry-Eigenschaft des Mikrofonarrays

In Windows Vista und höher wird Unterstützung für Mikrofonarrays bereitgestellt. In den meisten Situationen erfasst ein einzelnes Mikrofon, das in einen Laptop oder Monitor eingebettet ist, den Sound nicht sehr gut. Ein Array von Mikrofonen funktioniert besser, um eine Soundquelle zu isolieren und Umgebungsgeräusche und Hall abzuweisen. Die KSPROPERTY_AUDIO_MIC_ARRAY_GEOMETRY-Eigenschaft gibt die Geometrie eines Mikrofonarrays an. Der Eigenschaftswert KSAUDIO_MIC_ARRAY_GEOMETRY beschreibt den Arraytyp (linear, planar usw.), die Anzahl der Mikrofone im Array und andere Features.

In diesem Thema wird beschrieben, wie externe USB-Mikrofonarrays die mikrofonarray-Unterstützung von Windows Vista verwenden können. Ein externes USB-Mikrofonarray muss die Parameter bereitstellen, die zum Beschreiben der Geometrie und anderer Features des Arrays als Reaktion auf eine GET_MEM-Anforderung erforderlich sind.

Das USB-Mikrofonarray verwendet ein Standardformat, um die Geometrieinformationen bereitzustellen. Der Windows Vista-USB-Audioklassentreiber muss beim Lesen der Geometrieinformationen das gleiche Format verwenden. Weitere Informationen zum Standardformat finden Sie unter Mikrofonarray-Geometriedeskriptorformat.

Eine Anwendung kann IPart::GetSubType aufrufen, um Informationen zu einer Buchse abzurufen, um festzustellen, ob es sich bei dem an die Buchse angeschlossenen Gerät um ein Mikrofonarray handelt. IPart::GetSubType gibt eine PIN-Kategorie-GUID zurück, die den Typ der Eingabebuchse darstellt. Wenn es sich bei dem angeschlossenen Gerät um ein Mikrofonarray handelt, ist die zurückgegebene GUID gleich KSNODETYPE_MICROPHONE_ARRAY. Die Anwendung kann Ihnen auch dabei helfen, festzustellen, ob Sie Ihr Mikrofonarray an die falsche Buchse angeschlossen haben. Im letzteren Szenario ist die zurückgegebene PIN-Kategorie-GUID entweder für ein anderes Gerät oder gibt an, dass kein Gerät an die Mikrofonbuchse angeschlossen ist. Weitere Informationen zu den PIN-Kategorie-GUIDs finden Sie unter Pin Category Property.For more information about the pin category GUIDs, see Pin Category Property.

Nachdem eine Anwendung ein Mikrofonarray ermittelt hat, das an die richtige Eingabebuchse angeschlossen ist, besteht der nächste Schritt darin, die Geometrie des Arrays zu bestimmen. Es gibt drei grundlegende Geometrien: linear, planar und dreidimensional (3D). Die Geometrieinformationen enthalten auch Details wie den Frequenzbereich und die x-y-z-Koordinaten der einzelnen Mikrofone.

Das folgende Codebeispiel zeigt eine KSAUDIO_MIC_ARRAY_GEOMETRY-Struktur, die ein Audiotreiber verwendet, um ein externes USB-Mikrofonarray zu beschreiben:

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
};

Im vorherigen Codebeispiel ist die variable ar_mic_Coordinates ein Array der KSAUDIO_MICROPHONE_COORDINATES-Struktur und enthält die Koordinaten für die Mikrofone im Mikrofonarray.

Das folgende Codebeispiel zeigt, wie das ar_mic_Coordinates Array verwendet wird, um die geometrischen Positionen der Mikrofone im Mikrofonarray zu beschreiben, wie im vorherigen Codebeispiel beschrieben:

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
 }
};

Im vorherigen Codebeispiel werden die x-y-z-Koordinaten für jedes Mikrofon im Mikrofonarray zusammen mit den vertikalen und horizontalen Winkeln angegeben, die ihre effektiven Arbeitsbereiche beschreiben.

Um den Micarray MSVAD-Beispieltreiber so zu ändern, dass er Arraygeometrieinformationen für ein virtuelles Mikrofonarray bereitstellt, müssen Sie die folgenden Aufgaben ausführen.

Navigieren Sie zunächst zu Src\Audio\Msvad\Micarray, und suchen Sie die Datei Mintopo.cpp. Bearbeiten Sie den Eigenschaftenhandlerabschnitt in Mintopo.cpp, sodass die KSAUDIO_MIC_ARRAY_GEOMETRY-Struktur Informationen zum Mikrofonarray enthält. Der spezifische Codeabschnitt, den Sie ändern müssen, wird im folgenden Codebeispiel gezeigt:

// 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;

Das obige Codebeispiel zeigt Informationen, die für ein lineares Mikrofonarray mit zwei Mikrofonelementen bereitgestellt wurden, von denen jedes einen Nierentyp ist und sich 100 mm von der Mitte des Arrays entfernt befindet.

Informationen zum Entwickeln einer Anwendung zum Ermitteln von Mikrofonarrays finden Sie in Anhang C des Erstellens und Verwendens von Mikrofonarrays für Windows Vista.