Gast
#6688642
Hey Leute, folgendes Problem: Ich arbeite an einem Hobbyprojekt mit dem STM32F7 wo dieser per SPDIF ein Audio-Signal empfangen soll und das Signal per I²S rausgeben soll. Der STM32 ist hier im I²S slave-mode (der Takt kommt von extern). Klar könnte ich das mit einem SPDIF Receiver-Chip und einem ASRC chip realisieren, will es aber selber lösen wegen dem Lerneffekt :-) Außerdem muss der uC noch paar andere Managementsachen auf dem Board machen. Wie auch immer: Ich habe mal im Internet ein bisschen gestöbert und bin hier auf ein Patentschreiben von Altera gekommen. https://patents.google.com/patent/US7369637B1/en Für Hobbyzwecke/Lernzwecke mit nicht-kommerziellen Absichten sollte es in Ordnung sein, zu versuchen, ein Patent nachzuimplementieren. Prinzipiell ist es mir top-level zumindest soweit klar wie das Teil funktionieren. Man hat die Farrow-Struktur am Eingang, die jedes mal "geupdated" wird, wenn ein neues Sample reinkommt. Mithilfe dieser Struktur lässt sich dann ein Sample beliebigen Phasenwinkels interpolieren, den man über das µ angibt, welches an die Multiplizierer der Farrow-Struktur geht (eine kommabehaftete Zahl zwischen 0-1, die angibt wie groß das Delay sein soll). Ich würde hierzu einfach alles direkt in floating-point rechnen - sollte also kein Problem sein. Mir wird aus dieser Patentschrift nur ein paar Sachen nicht ganz so klar: - Wie genau wird dieser µ Wert bestimmt -> klar man braucht als Trigger jeweils die exakte Eingangsfrequenz und die exakte Ausgangsfrequenz. Daraus wird dann der "Conversion Faktor" berechnet. Sagen wir mal am Eingang habe ich 48.0001 kHz und am Ausgang 47.9998 kHz -> Wären also 0,97958 oder so. Das wäre ja noch recht einfach mit Timern oder so zu realisieren. Mein Bauchgefühl ist aber, dass der Phasenwinkel sich ja immer weiterschieben muss und hier verstehe ich nicht, wie genau da die Berechnungen weiterlaufen um für jedes interpolierte Sample jedes mal genau das µ zu bestimmen. Außerdem verstehe ich nicht, was die Triggerbedingung am Fifo ist um hier einen Eintrag zu schreiben. Auf der Lese-Seite wird der Fifo mit der Ausgangsfrequenz geleert. Über das zeitliche Mittel müssen also genauso viele Einträge geschrieben werden, weshalb ich eigentlich dachte, dass man jedes mal ein Sample interpoliert, wenn es der Ausgang "anfragt". Wozu dann aber der Fifo? Vielleicht kann es mir einer erklären. Wäre super lieb, danke! Grüße