2017-07-12 3 views
2

Vor ein paar Monaten habe ich eine sehr ähnliche Frage zu dem, was ich gerade erfahre, aber es ist ein bisschen anders und ich glaube, dass die Frage die Antwort trifft hier nicht zu.USB-Audio-Eingang Unterbrechung

Grundsätzlich programmiere ich einen Mikrocontroller für USB-Audio-Aufnahme (mit USB Audio Class 2.0/High Speed ​​USB). Als Test nehme ich einfach eine einfache 440 Hz Sinuswelle in den Audioeingang in Audacity auf, um zu sehen, ob ich ein sauberes Signal bekommen kann. Wenn ich diese Sinuswelle aufnehme, bekomme ich eine sehr periodische Unterbrechung in der Wellenform. Diese Unterbrechung erscheint in Form des aufgezeichneten Signals, das versucht, auf 0 oder Stille zu gehen. Dann geht es normal weiter. Wie gezeigt:

Sample Rate - 44,1 kHz: 440 Hz Sine Wave - 44.1 kHz sample rate

Sample Rate - 48 kHz: 440 Hz Sine Wave - 48 kHz sample rate

Wie Sie mit einer Abtastrate von 48 kHz feststellen können länger die Unterbrechungen sind. Ich vermute, ich habe ein seltsames Problem, wenn die Codec-Daten meines MCUs auf USB gehen. Ich habe keine Probleme, wenn ich USB deaktiviere (im Grunde Codec-Eingang -> MCU -> Codec-Ausgang).

Die unten ist, wie ich meine Rahmenlänge zu berechnen, die ich von einem USB-Audio Guide von Apple erhielt (44,1 Abtastrate und 24 Bitrate):

#define AUDIO_POLL_INT  4 
#define FRAME_BYTES  3 
#define NUM_CHANNELS  STEREO 

// Calculate the frame length 
uint16_t frame_len = 44 (44.1kHz/1000 samples) * NUM_CHANNELS * FRAME_BYTES; 
// Every 10 ms, calculate frame length with additional frame (only applies to 44.1kHz sample rate) 
if (!(frame_pos % 9)) frame_len += (1 * NUM_CHANNELS * FRAME_BYTES) 

// Increment frame position per usb call 
frame_pos = (((frame_pos + 1)/8) * (2 << (AUDIO_POLL_INT-1))) % 10; 

Bisher ... die Das Einzige, woran ich denken könnte, ist die Synchronisation zwischen USB-Clock und Codec-Clock (USB liegt bei 12 MHz, Codec liegt bei 11.2896 MHz oder 12.288 MHz). Ich kann es nicht loswerden, egal wie viele Rahmen "Fixes" ich ausprobiere. Wenn die allgemeine Öffentlichkeit zustimmt, dass es sich um ein Clock-Sync-Problem handelt, habe ich ein besseres Bild davon, wie ich weitermachen soll.

Jede Hilfe zu diesem wäre willkommen! Ich werde mehr Code posten, wenn ich muss. Danke

EDIT Stellt sich heraus, ich habe die 48 kHz Sinuswelle in Audacity bei 44,1 kHz Abtastrate aufgezeichnet. Ich habe das Bild der 48-kHz-Aufnahme geändert, um die korrekte Aufnahme zu zeigen.

EDIT2 Also habe ich mit der Anzahl der Puffer gespielt, die ich verwende, um den Codec-Eingang zu erfassen. Die Ausgabe, die in den obigen Bildern gezeigt wird, ist, wenn ich 10 Puffer verwende.

Dies ist, wie es aussieht, wenn ich einen Puffer bei 44,1 kHz verwenden (periodisch, geschieht alle 45 ms): enter image description here

+0

Eine Vermutung ist auf dem Rahmen, wo Sie 1 weitere Audio-Probe kopieren sollen ... Sie sind nicht. –

+0

Außerdem müssen Sie bei der 48KHz-Version keine anderen Bildgrößen ändern. 48000 teilt sich gleichmäßig in 1000 (also sollten Sie immer 48 Stereo Samples pro Frame senden, 3 Bytes pro Kanal Sample) –

+0

Hallo @RussSchultz, das ist ein Fehler auf meinem Code oben; bei 48kHz füge ich keine zusätzlichen Frames hinzu (es bleibt bei 48 * 2 * 3 = 288). Aber ich schaue mir den fehlenden Rahmen für 44,1 kHz an. Aber für 48 kHz sieht es so aus, als würden jedes Mal 4 Samples fehlen. Ich schätze, ich vermisse 4 Frames? Aber das macht keinen Sinn, da 48 kHz Bildgrößen konsistent sind gegenüber 44.1 kHz Du musst zusätzliche Bilder hinzufügen, da es ungleichmäßig ist. –

Antwort

1

Ich bin habe keine Mikrocontroller Wissen, aber einige Beobachtungen ...

Als ich das zum ersten Mal sah, nahm ich an, dass etwas mit einer Taktfrequenzabweichung zu tun hatte. Der Aussetzer ist regulär genug bei 44,1 kHz und scheint für genau eine Probe auszufallen. Es scheint auch, dass das nächste Sample das ist, was ohne den Aussetzer gewesen wäre, was impliziert, dass die ankommende digitale Datenrate nicht mit der digitalen Wiedergaberate mithalten konnte. Ein Pufferunterlauf.

Ihre 48 kHz Aufnahme ist aber interessant. In diesem Fall wird der Nullwert für einige Samples angenähert, und die Wellenform wird kurz vor und kurz nach dem Tauchgang zu Null. Dies impliziert etwas mehr auf der analogen Seite der Dinge. Auf der Grundlage dessen, was Sie sagen, gibt es hier keine analoge Audio-Domäne. Meine Theorie ist, dass Ihre 48-kHz-Aufnahme nicht wirklich das ist, was auf dem niedrigen Niveau passiert, und etwas hat 44,1 kHz bis 48 kHz neu abgetastet.

Interessant ist auch, dass bei der 44,1 kHz-Aufnahme ein Dropout fehlt.

Ich denke, es wäre nützlich zu wissen, ob die Aussetzer garantiert sind, und garantiert bei einer genauen Häufigkeit oder nicht. Ich denke, es wäre auch gut, hier den gesamten Signalweg zu bestätigen und sicherzustellen, dass in Ihren Tests kein Software-Resampling durchgeführt wird.

+0

Hallo Brad, Dein Kommentar hat mich getroffen ... Ich habe vergessen, das Audacity-Projekt auf 48 kHz zu setzen als ich es aufgenommen habe! Du hattest recht und die Aufnahme wurde neu gesampelt und deshalb war es wackelig. Der Beitrag wurde so bearbeitet, dass er so aussieht, wie er tatsächlich aussieht. Wie für die tatsächlichen Aussetzer; wenn Sie Buffer Underrun sagen ... Ich sende wahrscheinlich nur eine falsche Frame-Länge bei diesem spezifischen USB-Schreiben, wenn ich das richtig verstehe? –

+0

Nur um hinzuzufügen, weil mir die Zeichen ausgegangen sind ... Wenn ich keine USB-Übertragungen mache (nur Audio ein- und ausschalten), bekomme ich keine Aussetzer bei irgendeiner Frequenz (hat eine Sinuswelle) Zwitschern um zu bestätigen). –

+0

Weitere Beobachtungen ... Mit der korrigierten 48 kHz-Wellenform können Sie sehen, dass die Dropouts häufiger auftreten als bei 44,1 kHz. Es ist auch schwer zu sagen, aber es sieht so aus, als ob es jedes Mal für eine andere Anzahl von Proben vorkommt. Kannst du das bestätigen? Kannst du es, wenn möglich, auf 96 kHz oder 88,2 kHz drehen und sehen, was passiert? Wenn Sie den Test mehrmals ausführen, ändert sich das Intervall der Aussetzer? – Brad

Verwandte Themen