Ich muss einen einfachen Echtzeit-Audio-DSP bauen. Jetzt frage ich mich,
wie ich das mit dem STM32F7 am besten realisieren soll. Ich habe vor, es
mit 2x Doppelpuffern mit DMA und Interrupts zu machen, weil STM32F7
angeblich 2 DMA-Kanäle mit doppeltem Puffer unterstützt.
ADC-Puffer: |----Pufferhälfte 1----|----Pufferhälfte 2----|
DAC-Puffer: |----Pufferhälfte 1----|----Pufferhälfte 2----|
Der Ablauf stelle ich mir folgendermaßen vor:
1. CODEC, SAI, DMA, Interrupts etc. konfigurieren. Sagen wir mal
16bit/48kHz mit 1ms Puffer: Eine Pufferhälfte wäre dann:
48Khz*1e-3*2Byte=96Bytes.
2. ADC schreibt über SAI-DMA im Hintergrund in die erste
ADC-Pufferhälfte. Wenn die erste ADC-Pufferhälfte voll ist, wird ein
Interrupt ausgelöst. (DMA schreibt dann weiter in die zweite
ADC-Pufferhälfte.)
3.Nachdem das Interrupt ausgelöst wurde, liest die CPU/FPU die Daten der
ersten Pufferhälfte und verarbeitet sie. (Sagen wir einfach, wir
halbieren die Amplitude: temp[i]=temp[i]/2 und brauchen keine weitere
Komprimierung etc.)
4. CPU schreibt den verarbeiteten Datensatz in die erste
DAC-Pufferhälfte.
5. DMA liest im Hintergrund die Daten aus der ersten Hälfte DAC-Puffer
und schickt sie weiter an DAC.
6. Irgendwann wird wieder ein Interrupt ausgelöst, weil die zweite
ADC-Pufferhälfte voll ist.
7. Es geht mit dem Schritt 3 weiter, es werden nur Speicherhälften
getauscht.
Ist das ein vernünftiger Ansatz? Oder gibt's noch vernünftigere Ansätze
für so was?