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:
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):
Eine Vermutung ist auf dem Rahmen, wo Sie 1 weitere Audio-Probe kopieren sollen ... Sie sind nicht. –
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) –
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. –