Forum: Digitale Signalverarbeitung / DSP / Machine Learning ADSP-21369 - Anfängerfrage


von Markus W. (zimmerkommandant)


Lesenswert?

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
von Kurt H. (Firma: KHTronik) (kurtharders)


Lesenswert?

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
Noch kein Account? Hier anmelden.