Comment nous testons les systÚmes de microphones sur STM32: l'expérience des développeurs d'appareils Yandex



Bonjour, je suis Gennady "Crail" Kruglov de l’équipe des solutions matĂ©rielles Yandex.

La sélection de microphones pour la matrice de microphones est une partie complexe et intéressante de notre travail: nous testons des modÚles avec différents paramÚtres, expérimentons différentes configurations de matrice et améliorons les algorithmes de traitement du son.

Il est pratique pour les dĂ©veloppeurs qui crĂ©ent des algorithmes de rĂ©duction d’écho et de bruit non seulement de traiter des donnĂ©es brutes prĂ©cĂ©demment extraites d’un appareil en laboratoire, mais aussi d’interagir, par exemple, avec une nouvelle matrice de microphone en temps rĂ©el en la connectant Ă  leur ordinateur portable.

Cela ne semble simple qu'Ă  premiĂšre vue. Dans cet article, je vais expliquer comment nous avons rĂ©solu le problĂšme du transfert du son de sept microphones avec une interface PDM vers un ordinateur via USB, quelles nuances matĂ©rielles et logicielles nous avons rencontrĂ©es et comment les surmonter (spoiler: cette approche peut ĂȘtre adaptĂ©e pour les matrices avec le nombre de microphones ≀ 8 ) À la fin de l'article, je partagerai un lien vers le flux, oĂč je montrerai le processus de dĂ©veloppement sur le microcontrĂŽleur STM32 et parlerai de la prochaine sĂ©rie.

Formulation du problĂšme


Un peu de fond: pour créer un faisceau de sensibilité contrÎlé, pour la premiÚre Yandex.Station, un circuit avec sept microphones (analogiques) a été sélectionné, pour la version Mini - avec quatre (déjà numériques). Pour les autres produits, différentes configurations sont envisagées, mais la matrice à sept microphones reste pour nous basique, classique.

Donc, Ă©tant donnĂ©: sept microphones numĂ©riques, la nĂ©cessitĂ© de les tester. Trouver: pas trop difficile Ă  mettre en Ɠuvre et une maniĂšre flexible d'interagir avec eux. Il est logique de diviser la tĂąche en deux:

1. Obtenez les données des microphones.

2. Envoyez-les Ă  un ordinateur.

Dans l'appareil fini, lorsque l'utilisateur contacte Alice, les signaux des microphones numériques sont envoyés directement au processeur central (il est plus correct de l'appeler SoC - System-on-Chip, mais le «processeur» est plus familier et pratique), il dispose d'une puissance suffisante pour les traiter. Mais pour les algorithmes de débogage, il est beaucoup plus pratique d'obtenir ces données directement sur l'ordinateur du développeur. La façon la plus simple est de se connecter via USB: ainsi, la carte doit avoir un microcontrÎleur avec l'unité appropriée. Nous aimons le contrÎleur STM32, mais il est impossible d'envoyer directement le flux sonore des microphones: il n'y a pas d'unité de réception de signal PDM (modulation de densité d'impulsion) - l'interface de sortie des microphones numériques.

Une autre option consiste Ă  connecter la carte du microphone Ă  la carte de dĂ©bogage du fabricant du SoC utilisĂ©. Mais cette dĂ©cision est liĂ©e Ă  Linux alsamixer, et ses paramĂštres affectent fortement le rĂ©sultat de la conversion de PDM en PCM. Ces blocs peuvent diffĂ©rer non seulement pour les processeurs de diffĂ©rents fabricants, mais mĂȘme pour deux modĂšles du mĂȘme fournisseur. Je vous rappelle que nous avions besoin d'une solution simple, transparente et prĂ©visible.

Solution matérielle


Acceptez l'incapacitĂ© du STM32 Ă  accepter le PDM multicanal. On pourrait utiliser le bloc SPI pour recevoir un signal PDM, mais un seul microphone peut ĂȘtre connectĂ© Ă  un bus SPI. Nous travaillons avec le contrĂŽleur STM32L476RC, oĂč il n'y a que trois bus de ce type. ComplexitĂ© supplĂ©mentaire: le signal PDM est assez haute frĂ©quence, il est nĂ©cessaire de faire sa dĂ©cimation, la moyenne, le traitement, le filtrage - pour sept microphones, cette tĂąche est assez compliquĂ©e.

Puisque nous parlons d'une carte de dĂ©bogage, et non d'un prototype pour la production de masse, nous nous concentrerons sur une puce spĂ©cialisĂ©e TSDP18xx. Il fait tout ce qui est nĂ©cessaire: il gĂ©nĂšre les frĂ©quences et les signaux nĂ©cessaires pour PDM, fait la moyenne et traite le signal PDM, le transforme tout en un signal I2S. Plus prĂ©cisĂ©ment, TDM (Time Division Multiplexing), car le bus I2S suppose deux canaux, et si vous conduisez plus via les mĂȘmes fils, il n'est plus tout Ă  fait correct de l'appeler I2S.

L'avantage de cette approche est que tout le travail de prĂ©paration et de calcul de la moyenne est effectuĂ© par le TSDP. Moins - tous les algorithmes sont Ă©troitement cĂąblĂ©s Ă  l'intĂ©rieur de ce microcircuit, et ils ne peuvent pas ĂȘtre modifiĂ©s. En particulier, vous ne pouvez pas rĂ©gler le volume en modifiant les paramĂštres de moyenne. Mais pour le dĂ©bogage, ce n'est pas critique.

Surveillez vos mains: il y a sept microphones, huit canaux sur le microcircuit. Celui qui n'est pas utilisé, la sortie est toujours là, donc à l'avenir pour plus de simplicité, je parlerai du flux audio à huit canaux.

Donc, nous élevons le TDM à huit canaux en STM32, nous obtenons un flux audio à huit canaux. Comment les données se déplacent:



unitĂ© matĂ©rielle SAI - STM32 pour travailler avec I2S / TDM. Il est trĂšs flexible et vous permet de mettre en Ɠuvre de nombreuses options de protocole. Mais Ă  cause de cela, il est facile de se confondre avec les exigences de frĂ©quences.

L'arbre à horloge mérite un examen plus approfondi. Un résonateur à quartz de 12 MHz est connecté au microcontrÎleur. Nous divisons cette fréquence avant d'appliquer aux blocs PLL par 3 et obtenons 4 MHz. Ensuite, cela fonctionne comme ceci:

1. Ce serait bien d'augmenter la fréquence de base pour suivre tout: par exemple, le maximum pour ce contrÎleur est de 80 MHz. Nous utilisons le premier bloc PLL: nous multiplions 4 MHz par 40 et divisons par 2.

2. L'USB nécessite 48 MHz. Pour ce faire, utilisez le deuxiÚme bloc PLL: multipliez 4 MHz par 24 et divisez par 2.

3. À propos des microphones. Nos cartes de test utilisent une frĂ©quence d'Ă©chantillonnage de Fs = 16 kHz, une norme adoptĂ©e dans le domaine de la reconnaissance vocale. À partir de la frĂ©quence initiale de 4 MHz, vous devez obtenir quelque chose qui peut ĂȘtre transformĂ© en frĂ©quences de trame de bus TDM 16 kHz (alias LRCK, alias FCK, alias FrameSync). Dans ce cas:

[frĂ©quence de synchronisation des bits (BCLK, BitClk, Sync, SCK)] = Fs ∙ [nombre de canaux] ∙ [nombre de bits par canal]

Soit: SCK = 16 kHz ∙ 8 ∙ 16 = 2048 kHz.

4. La fiche technique indique que la relation entre l'horloge maĂźtre et la frĂ©quence d'Ă©chantillonnage Fs est la suivante: MasterClock = 16 kHz ∙ Diviseur MCLK ∙ 256. Ici, 256 est une constante et le diviseur peut ĂȘtre rĂ©glĂ© dans le registre. VĂ©rifions le schĂ©ma - pour la fonctionnalitĂ© nĂ©cessaire, il existe des coefficients pour diviser la frĂ©quence PLL par 7 ou 17:



Pour rĂ©sumer le problĂšme: vous devez sĂ©lectionner un tel ensemble de facteurs et diviseurs PLL et SAI pour obtenir une frĂ©quence d'Ă©chantillonnage de 16 kHz et une frĂ©quence binaire de 128 fois plus. Étant donnĂ© que l'ensemble avait un diviseur obligatoire de 7 (ou 17), il n'a pas fonctionnĂ© pour obtenir exactement le rĂ©sultat souhaitĂ©. J'ai dĂ» construire une table de multiplicateurs et de diviseurs pour obtenir 24,571 MHz. En divisant cette frĂ©quence par 6 (diviseur MCLK), puis par 256 (constant), enfin, nous obtenons un nombre assez proche de 16 kHz. Je vais maintenant expliquer pourquoi cela est si important.

Fonctionnement USB


L'USB utilise un type de transfert isochrone pour travailler avec des données multimédia: dans ce cas, une certaine bande passante et une certaine valeur de retard sont garanties sur le bus USB. La livraison des données n'est pas garantie: si un paquet arrive avec une panne, il sera alors considéré comme perdu. Cela est dû à des délais stricts: il n'y a aucun moyen de demander à nouveau.

Avec le type de transfert isochrone Ă  la vitesse USB FullSpeed ​​(c'est 12 Mbit / s; c'est Ă  cette vitesse que le bloc USB STM32 peut fonctionner), l'ordinateur arrive Ă  l'appareil pour les donnĂ©es toutes les millisecondes: aprĂšs cette pĂ©riode de temps, il doit collecter les donnĂ©es accumulĂ©es. Permettez-moi de vous rappeler les introductions: la frĂ©quence d'Ă©chantillonnage est de 16 kHz, 8 canaux, chaque canal nĂ©cessite deux octets, car le son est de seize bits. Total 16000 ∙ 2 ∙ 8/1000 = 256 octets par milliseconde. La taille d'un paquet pour un type de transmission isochrone peut atteindre 1023 octets, il n'y a donc aucun problĂšme Ă  ce stade.

Ainsi, la taille du paquet est de 256 octets. Il semblerait que tout va bien. Seize fois reçu des donnĂ©es sur TDM, mises dans le buffer, l'USB est venu, nous lui donnons un paquet, nous rĂ©pĂ©tons ... Mais cela n'arrive que dans un monde idĂ©al. Le problĂšme est que, d'une part, nous avons une frĂ©quence imparfaite de 16 kHz (un peu moins) et, par consĂ©quent, les donnĂ©es arrivent un peu moins d'une fois par milliseconde. D'un autre cĂŽtĂ©, la milliseconde de l'ordinateur flotte Ă©galement, car il est occupĂ©: quand il le pouvait, alors il est venu. Autrement dit, la frĂ©quence d'Ă©chantillonnage du microphone diffĂšre de 16 kHz (mais toujours la mĂȘme), et la milliseconde USB diffĂšre Ă©galement en longueur (la diffĂ©rence flotte probablement: elle s'avĂšre un peu plus, puis un peu moins qu'une milliseconde idĂ©ale).

Pourquoi c'est un problÚme? Vous pouvez perdre le colis. Il n'est probablement pas nécessaire d'expliquer que des données complÚtes sont nécessaires pour le débogage correct des algorithmes. Comment le paquet est perdu: ils ont accumulé 256 octets de résultats, les ont mis dans le tampon et ont continué la mesure. Un ordinateur est venu, a pris les 256 premiers, nous continuons toujours de mesurer. L'ordinateur est revenu, mais la mesure n'est pas encore terminée - l'ordinateur est parti avec un emballage vide. Ensuite, nous finissons de remplir le tampon et commençons à en remplir un autre, le suivant, jusqu'à ce que l'ordinateur arrive à nouveau. L'ordinateur ne prend que le dernier paquet; par conséquent, un paquet est perdu.



Le problĂšme est en effet connu. Il existe trois approches pour y faire face:

  • . USB. — . «» — . USB . , , ( , 16 ), . , .
  • . .
  • L'asynchrone est le meilleur pour cette tĂąche. L'appareil dispose d'un gĂ©nĂ©rateur de frĂ©quence stable. Le taux d'Ă©chantillonnage est maintenu exactement le mĂȘme sans rĂ©fĂ©rence Ă  l'USB. Dans ce cas, vous devez transfĂ©rer des donnĂ©es vers l'appareil afin qu'il n'y ait pas d'anomalies significatives.

Tout cela a Ă©tĂ© discutĂ© plus d'une fois sur Internet pour le cas de la lecture d'un ordinateur vers le haut-parleur via un appareil avec un codeur numĂ©rique-analogique, oĂč l'appareil en tant que rĂ©troaction vous indique combien de pĂ©riodes d'Ă©chantillonnage se sont produites depuis la rĂ©ception du dernier paquet.



Mais notre tĂąche est l'inverse, le dĂ©bogage nĂ©cessite de recevoir des donnĂ©es des microphones vers un ordinateur, et la question de l'enregistrement d'un signal des microphones vers un ordinateur n'est mentionnĂ©e que dans le meilleur des cas. Pourquoi ne pas faire de mĂȘme: introduire les commentaires de l'ordinateur? Il existe une option plus simple.

Le voilĂ 


Nous utilisons l'ajout frĂ©quent d'Ă©chantillons et de deux tampons pour stocker les donnĂ©es Ă  envoyer. 16 fois par milliseconde, nous ajoutons au tampon sĂ©lectionnĂ© l'Ă©chantillon suivant. À un moment donnĂ©, une interruption se produit: USB a pris le paquet prĂ©cĂ©dent. Si le tampon n ° 1 est plein, il passe au tampon n ° 2. Lorsque l'USB arrive pour le prochain paquet, il est dĂ©jĂ  prĂ©parĂ©. Envoyez le tampon numĂ©ro 2 et revenez au numĂ©ro 1.



L'USB vient pour les donnĂ©es Ă  diffĂ©rents moments, le forfait comprend un nombre diffĂ©rent d'Ă©chantillons. Il peut s'avĂ©rer ĂȘtre supĂ©rieur ou infĂ©rieur Ă  seize, il y a donc une chance de dĂ©passer un paquet de 256 octets, il est prĂ©fĂ©rable de laisser un espace de manƓuvre. Soit 384 = 256 + 128: cela donnera une marge d'une demi-milliseconde, c'est-Ă -dire qu'il pardonnera la phase de nage du signal USB de 50% - une telle marge devrait ĂȘtre plus que suffisante. Total: parfois plus ou moins 256 octets sont envoyĂ©s, mais jamais un paquet vide, ce qui Ă©vite la perte de donnĂ©es. C'est-Ă -dire que le problĂšme des irrĂ©gularitĂ©s a Ă©tĂ© rĂ©solu en augmentant le package, au prix d'augmenter une partie de la bande passante du bus allouĂ©e Ă  notre appareil et de rĂ©duire cette partie pour d'autres appareils.

Sur ce point, la livraison des donnĂ©es Ă  l'ordinateur a pris fin. Les dĂ©veloppeurs peuvent ĂȘtre dĂ©boguĂ©s et vous pouvez poser des questions dans les commentaires si une sorte de paquet de donnĂ©es n'Ă©tait pas suffisant pour une comprĂ©hension complĂšte.

Mes streams et le prochain Ă©pisode


DerniĂšrement, j'ai diffusĂ© deux fois depuis mon laboratoire de soudage Ă  domicile. Au dĂ©but, je viens de montrer le processus de soudage et de dire quels appareils j'utilise. La deuxiĂšme sĂ©rie vient d'ĂȘtre consacrĂ©e au dĂ©veloppement sur le STM32.

Les flux continuent. Ce vendredi Ă  19h00, mon collĂšgue de l'Ă©quipe de dĂ©veloppement de solutions matĂ©rielles Andrey Laptev organisera une analyse en ligne de Yandex.Stations Mini - montrez l'intĂ©rieur et partagez les historiques de production. Pour plus de plaisir, Andrey va visser la batterie Ă  la colonne - pas tout de mĂȘme, travailler Ă  partir du fil. Au final, vous recevrez un guide qui vous permettra de rĂ©pĂ©ter cette expĂ©rience vous-mĂȘme ou de proposer un design plus intĂ©ressant.

S'inscrirepour regarder le flux. Vous recevrez une lettre avec un dossier pour le calendrier et un rappel le jour de l'air. Merci pour la lecture!

All Articles