2011-06-01 3 views
0

J'ai une question assez différente. J'utilise donc Matlab sur une machine Linux Gentoo. J'ai eu quelques cartes son Asus Xonar STX, et j'essaie de les utiliser comme analyseur de fréquence audio sensible en utilisant le paquet d'E/S audio PlayRec non bloquant. Maintenant, je sais que Matlab dira si vous essayez d'utiliser la fonction audiorecorder, et spécifier 24 bits dans Linux, il vous dira que 24bit est seulement pris en charge dans Windows. Cependant, la littérature d'ALSA n'implique pas qu'il s'agisse d'une limitation du système d'exploitation ou d'ALSA elle-même, et en fait, Alsa semble vous autoriser à spécifier un périphérique PCM 24 bits. Et PlayRec utilise PortAudio, qui utilise ensuite Alsa sur les systèmes Linux. Maintenant, tout cela est très bien, et Playrec ne semble pas avoir un moyen de spécifier la profondeur de bits, juste la fréquence d'échantillonnage. J'ai exécuté de nombreux tests et je connais la fonction de transfert de ma carte son (valeur de retour à virgule flottante pour le rapport de conversion de tension d'entrée), et je sais que ma tension de crête est de 3V et mon bruit est de 100uV. Cela me donne 20 * log10 (3/100e-6) = 91dB. Qui est plus proche de ce que je m'attends à voir de 16 bits et non de 24.Capture audio 24 bits dans Matlab sous Linux

Ma vraie question est la suivante: Y a-t-il un moyen de vérifier que je reçois 24 bits dans mon signal capturé? Si ce n'est pas le cas, existe-t-il des limites inhérentes à ALSA ou à Matlab qui me limitent aux données 16 bits provenant des périphériques de capture audio, même lorsque j'utilise un programme tiers pour collecter ces données?

Répondre

1

Si vous observez les données PlayRec met à travers playrec('getRec', ...), vous verrez qu'il est toujours en virgule flottante simple précision (testé sur Windows, Matlab R2013b, most current Playrec). (Vous pouvez le vérifier vous-même après l'enregistrement d'une seule page avec PlayRec et en regardant dans la fenêtre d'espace de travail de l'IDE ou en exécutant whos('<variable_name_of_page>') à la ligne de commande.

Si vous regardez Line 50 of pa_dll_playrec.h, vous verrez que simple précision est choisi par définition:

/* Format to be used for samples with PortAudio = 32bit */ 
typedef float SAMPLE; 

Malheureusement, cela ne répond pas tout à fait la question de la précision exacte de l'échantillon, car la lib PortAudio convertit des échantillons à partir des API différentes au format dans la définition d'un donc, si vous voulez savoir, quoi. précision que vous obtenez réellement, je suggérerais une solution très pragmatique: en regardant la mantisse des valeurs d'échantillonnage flottant de 32 bits Un simple fprintf('%+.32f\n', data) devrait suffire pour savoir combien de décimales sont réellement utilisées.


Edit: Je viens de réaliser que je me suis trompé. Mais voici l'astuce: Enregistrer l'audio sur un canal vide de votre appareil audio. Tracer les données enregistrées et zoomer dans le plancher de bruit. Si vous obtenez simplement des zéros, l'appareil n'est probablement pas activé correctement (ou a un trop bon rapport signal/bruit). Essayez une interface externe et/ou augmentez légèrement le gain). En fonction de la résolution en bits réelle des données enregistrées, vous verrez des étapes de quantification dans les échantillons. Selon la profondeur de bits utilisée à l'origine par le quantificateur, ces étapes sont plus grandes ou plus petites.Ci-dessous vous verrez la comparaison entre 16 bits (gauche) et 24 bits (droite) des blocs enregistrés séparément, à partir du même périphérique audio, seulement que j'ai utilisé l'API WASAPI de PortAudio (sur Windows, évidemment) sur la gauche et ASIO à droite:

Comparison of sample quantization of 16-bit (left) and 24-bit (right) audio

la différence est tout à fait évidente: à ces niveaux très bas, 16 bits permet seulement trois valeurs, alors que 24 bits a beaucoup stepping plus fin. Cela devrait donc être une réponse suffisante à votre question sur la façon de déterminer le réel bitdepth et si votre signal est enregistré en 24 bits. S'il y a des étapes d'échantillon plus petites que 2^-15, les chances sont assez bonnes. En regardant ce sujet, je me suis rendu compte que cela dépend beaucoup de l'API de l'appareil d'enregistrement actuellement choisi, de la profondeur de la quantification. ASIO semble toujours utiliser 24 bits, alors que WASAPI revient par exemple à 16 bits.

+0

Mais juste parce que vous savez combien de bits dans le numéro de FP sont utilisés ne vous aide pas vraiment autant? Sauf si vous aviez un moyen de manipuler un LSB sur l'A/D. Ensuite, vous pouvez voir comment cela a affecté la valeur en virgule flottante par rapport à la pleine échelle et déterminer les bits de précision. Tant que c'est une boîte noire faisant le A/D (en valeurs entières) -> virgule flottante simple précision sans connaître la fonction de transfert, il n'y a aucun moyen de déterminer quelle résolution bits vous obtenez de la carte son A/D. – dynamphorous

+0

@dynamphorous Vous avez raison. J'ai mis à jour ma réponse ci-dessus. –

+0

Je vais vous accorder que c'est une façon possible. Mais je n'ai jamais vu une carte son qui n'a pas de plancher de bruit sensiblement au-dessus du LSB du quantificateur. Donc je suppose que je pourrais chercher la plus petite série de pas possible dans mon spectre blanc et essayer de supposer que c'est mon pas quantifié minimum. Mais il me semble toujours kludgy. Je vais marquer cela comme la réponse, car je peux vous dire que vous y avez beaucoup réfléchi, et c'est une réponse raisonnable si le bruit Johnson est en dessous de votre LSB de votre quantificateur! – dynamphorous

0

Si vous pouvez stocker ce signal sous forme de fichier wav, exécutez une commande file sur le wav à partir de la ligne de commande sous linux. Quelque chose comme:
file x.wav vous donnera le taux d'échantillonnage et les bits sur lesquels le fichier a été encodé. La sortie est généralement quelque chose comme: 16 bits, 16000Hz etc.

+0

Eh bien, j'aime bien ce que vous en pensez, le seul problème est qu'au moment de sa lecture dans Matlab, le signal devient 2 canaux de nombres à virgule flottante simple précision. Donc, l'écrire dans un fichier wav, en utilisant wavwrite, ou une autre fonction semble simplement convertir le fichier à la profondeur de bit et la fréquence d'échantillonnage que vous spécifiez, plutôt que de conserver les caractéristiques qu'il avait quand il est sorti du UN D. C'est pourquoi j'ai lié mon propre calcul S/N, puisque le Xonar STX DEVRAIT avoir 118dB de plage dynamique (ce qu'ils prouvent dans le manuel avec une précision audio), et j'obtiens 91dB. – dynamphorous