Forum: Digitale Signalverarbeitung / DSP / Machine Learning TI 6711 DSK AM-Demodulation


von Matthias Köppen (Gast)


Angehängte Dateien:

Lesenswert?

Hallo.
Ich schreibe im Moment an meiner Abschlussarbeit. Meine Aufgabe besteht
u.a. darin, eine AM-Demodulation in C für ein 6711 DSK mit Daughterboard
(48 kHz fA) von TI zu realisieren. Ich habe die Square-Law Demodulation
versucht, aber die funktioniert nicht (oder ich hab Fehler drin).
Könnte jemand eine Lösung vorschlagen? Bei mir kommt im Moment bei
einem eingespeisten AM-Signal so ein pulsierendes 12 kHz-Signal raus.

PS:
Square Law: Quadrieren der Eingangsfkt. --> FIR-Tiefpass --> Wurzel -->
Ausgabe

von Matthias Köppen (Gast)


Angehängte Dateien:

Lesenswert?

Und hier noch schnell die Filterkoeffizienten dazu.

von Michael P. (Gast)


Lesenswert?

Leichte C-Probleme?

Funktion:
int func(int input)
{
  //Rechnen
  return input * 3;
}

Aufruf:

x = func(y)

Oder nur Zeiger auf Daten übergeben und die Variable direkt bearbeiten.

von Matthias Köppen (Gast)


Lesenswert?

So, hab mal versucht, den Code zu überarbeiten.
Aber irgendwie kommt jetzt am Ausgang gar nix mehr raus.
Der Aufruf lautet jetzt:

z.B. Input = quadratur(Input);
Mit ner zusätzlichen Variable (InputHandle) hats auch nicht
funktioniert.
Stimmt denn der grundsätzliche Algorithmus überhaupt?

Beim Starten knackts kurz aus den Lautsprechern, dann is Schicht.

Ach, ich würde es eher als mittelschwere C-Krise bezeichnen.

von Michael P. (Gast)


Lesenswert?

Mein Tip:

-In kleinen Schritten vorgehen. Nur mal Output = Input Probieren.

-Nicht so viele Funktionen, macht für dich vieleicht Code
übersichtlicher.

-Lokale Variablen in CodecISR defienieren nicht Input und Output
Global.

Für den Anfang:

lassen wie es ist:
main()
EnableMcBSP1(void)
void EnableCodec()


interrupt void CodecIsr()
{
float    Input, Output, GleichIn;

  Uint32  McbspOut,Out;
  Int16  temp;

  /* shift left channel to bits 15 - 0 and extend sign into bits 31 -
16      */
  temp  = (Int16) ( MCBSP_read(hMcbsp1) >> 16 );
  Input  = (float) temp;


  Out  =    (Uint32) Output;
  McbspOut =  ( Out<<16 );//|( Out & 0x0000ffff );
  //McbspOut = (Out<<16);
  MCBSP_write(hMcbsp1,McbspOut);
  return;
}

Hoffe du hast Programmgerüst aus funktionierendem Projekt

von Michael P. (Gast)


Lesenswert?

Zu früh abgesendet:

interrupt void CodecIsr()
{
  float    Input, Output, GleichIn;

  Uint32  McbspOut,Out;
  Int16  temp;

  /* shift left channel to bits 15 - 0 and extend sign into bits 31 -
16      */
  temp  = (Int16) ( MCBSP_read(hMcbsp1) >> 16 );
  Input  = (float) temp;

  Out = Input;

  Out  =    (Uint32) Output;
  McbspOut =  ( Out<<16 );//|( Out & 0x0000ffff );
  //McbspOut = (Out<<16);
  MCBSP_write(hMcbsp1,McbspOut);
  return;
}

von Matthias Köppen (Gast)


Lesenswert?

Ich hab angefangen mit nem kleinen Projekt, welches ich von nem Prof.
bekommen habe. Es leitet einfach den Eingang auf den Ausgang. Und das
funktioniert auch wunderbar (bis auf ne leichte Frequenzabweichung, die
wohl aus einem Antialiasing-Filter kommt).
Soll heißen: Das Gerüst für Ein- und Ausgabe hab ich.
Und die Theorie für die Umsetzung der AM-Demod. dächte ich auch zu
besitzen.
Der Teufel steckt im Detail.

von Matthias Köppen (Gast)


Lesenswert?

Hi Michael.
Mein Quelltext war an sich schon richtig, mein Problem war nur, dass
ich als Filter einen Tiefpass benutzt habe. Also hatte ich auf meinem
Ausgangssignal eine Gleichspannung, die sich als unangenehmes
Quietschen bemerkbar gemacht hat und den Ausgang unbrauchbar gemacht
hat.
Der Quelltext sieht jetzt ungefähr so aus:
...
// (input + |input| ) / 2 = one way rectification
float einwegglr(float Input)
{
  Input = (Input + fabsf(Input))/2;
  return 3*Input;
}
// filtering method --> uses external configurable filter coefficients
short Fir(short Input)
{
  int    i, Sum, Prod;
  States[0]=  Input;
  Sum=  0;
  for(i=0;i<M;i++)
  {
    Prod=  Coef[i]*States[i];
    Sum=  Sum+Prod;
  }
  for(i=M-1;i>0;i--)
  {
    States[i]= States[i-1];        /* update states x(k- i):=x(k-(i-1)) 
*/
  }
  return ((float) (Sum>>15));        /* cast output to 32-bits and 
return
  */
}
void processing(void)
{
             Output = Input;
}
/* interrupt service routine
interrupt void CodecIsr()
{
  Uint32  McbspOut,Out;
  Int16  temp;
  /* shift left channel to bits 15 - 0 and extend sign into bits 31 -
16      */
  temp  = (Int16) ( MCBSP_read(hMcbsp1) >> 16 );
  Input  = (float) temp;
  einwegglr(Input);/* one way rectification by absolute values*/
  Fir(Input);      /* band pass filter ( 100 - 4000 Hz )  */
  processing();  /* function for sending demodulated input to output 
*/
  Out  =    (Uint32) Output;
  McbspOut =  ( Out<<16 )|( Out & 0x0000ffff );
  McbspOut = (Out<<16);
  MCBSP_write(hMcbsp1,McbspOut);
  return;
}
...

Nun stehe ich allerdings vor dem nächsten Problem - die nächste Stufe
wäre dann ein quadratischer Hüllkurvendemodulator.
Also praktisch: quadrieren(Eingang), Tief- (oder Band)pass(Eingang),
wurzel(Eingang).
Nur funktioniert das irgendwie so nicht.
Hast Du vielleicht ne Idee?

von shlomo (Gast)


Lesenswert?

Hi,
Can anyone tell me where can I download the other files such as
DskTemplateA1.cdb?

Thanks,

Shlomo.

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.