www.mikrocontroller.net

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


Autor: Matthias Köppen (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias Köppen (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Und hier noch schnell die Filterkoeffizienten dazu.

Autor: Michael P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias Köppen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Matthias Köppen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias Köppen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: shlomo (Gast)
Datum:

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

Thanks,

Shlomo.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.