Hallo alle miteinander! Für ein Projekt an der Uni habe ich einen 3-Band-EQ in MATLAB/Simulink entworfen und möchte diesen nun auf dem ADSP-21369 SHARC-Prozessor implementieren, um dann später den BTC einzubinden. Der code der Filterfunktion wurde mit dem Embedded Coder von MATLAB bereits generiert. Ich habe allerdings so gut wie gar keine Ahnung von DSP-Programmieren bzw. Hardware naher Programmierung und scheitere an folgendem einfachen Problem: Wie funktioniert denn das, dass ich (in C wohlgemekert!), mein Audio Signal einlesen und wieder Ausgeben kann? Ich vermute mal ich brauche das headerfile des 1835 codecs und dann kann ich einfach über eine Variable auf den Eingang zugreifen oder wie? muss ich hier eine schleife deklarieren (wird ja sampleweise eingelesen oder?)? Ist das Signal da, mache ich einfach einen interrupt und rufe meine Filterfunktion auf und gib das ganze an den Ausgang oder wie? man findet in den ganzen Beispielprogrammen & unterlagen nur assemblercodes, ich würde aber was in C brauchen. gibt es hier irgendwelche tutorials oder dokumentationen oder tipps im Netz? habe lange gesucht, jedoch nicht wirklich was brauchbares gefunden... vielleicht hat ja jemand von euch was, um mir etwas auf die Sprünge zu helfen... Dank und freundlicher Gruß, Markus
:
Verschoben durch Admin
Hallo Markus, die Daten des Codec werden wohl als I2S-Datenstrom eintreffen. Du kannst diese Daten entweder per DMA oder in einer Interrupt-Routine verarbeiten. In jedem Fall erfolgt irgendwann ein Interrupt, der die Verfügbarkeit der Daten anzeigt. In dieser Interrupt-Routine rufst Du dann Deine Filterfunktion auf und speicherst den Wert. Für die Ausgabe kannst Du genau so vorgehen und im Interrupt die Daten bereitstellen. Beispiel der Interruptroutinen für den ADSP21261:
1 | void SPORT_handleSPORT0Interrupt(int sig, void *pCBParam) { |
2 | int audioData; |
3 | int finalSample; |
4 | float outSample; |
5 | float originalSample; |
6 | |
7 | // Erkennung linker oder echter Kanal
|
8 | |
9 | int lrInput = *pDAI_PIN_STAT; |
10 | lrInput &= LR_CLOCK; |
11 | audioData = *pRXSP0A; |
12 | audioData &=0x01ffffff; |
13 | if (audioData & 0x00800000) { |
14 | audioData |= 0xff000000; |
15 | }
|
16 | originalSample = (float)audioData * inversFullRange * boost * HEADROOM; |
17 | outSample = Filterbank_execute(originalSample, lrInput); |
18 | outSample = SoundController_execute(outSample, lrInput); |
19 | finalSample = (int)(outSample * fullRange); |
20 | if (lrInput == 0) { |
21 | lastRight = finalSample; |
22 | } else { |
23 | lastLeft = finalSample; |
24 | }
|
25 | }
|
26 | |
27 | void SPORT_handleSPORT1Interrupt(int sig, void *pCBParam) { |
28 | int lrOutput = *pDAI_PIN_STAT; |
29 | lrOutput &= LR_CLOCK; |
30 | if (lrOutput == 0) { |
31 | *pTXSP1B = lastLeft; |
32 | } else { |
33 | *pTXSP1B = lastRight; |
34 | }
|
35 | }
|
Dieser Code stammt aus meinem Verstärker KlarerTon dessen Filter in Filterbank_execute (12 IIR-Peaking Filter) und dem "Klangregler" SoundController_execute implementiert sind. Es gibt auch einige C-Beispiele von AD. Als weitere Quelle kann ich das Forum von AD dringend empfehlen: da werden Sie geholfen. :-) Viel Erfolg und Spaß, Kurt
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.