mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP IFFT liefert keine sauberes Signal


Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.
Ich baue ein Signal (1,0 - 1,1 kHZ) mit einer IFFT und das Ergebnis
liefert einen falschen Pegel. Nun wie soll ich das beschreiben.
Der Pegel ist meistens bei ca. 10% und dann kommt eine volle Welle mit
einem Pegel von 100%. Hat jemand eine Idee was ich hier falsch mache?

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, kann aber auch an der Problembeschreibung liegen :)

"falschen Pegel" - etwas genauer
"bei ca. 10%"    - von was?

Wieviel Werte verwendest du, welche IFFT-Routine, welche Software?
Kannst du nicht einfach ne Grafik posten?

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Signal wurde auf einem Pc erzeugt (in C) und ausgegeben.
Gemessen mit einen Oszi.
10% von 100% -- ist doch egal, Fakt ist das der Pegel gleich sein muß.
Entweder hat die eine Welle zu viel Pegel oder der Rest zu wenig.
Meine IFFT arbeitet mit 8192 Punkten und kommt aus dem Audacity
Projekt. Grafik müsste ich erst malen, wird glaube ich aber auch nicht
verständlicher.

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht hilft es, wenn ich mal meinen Code zeige:

for (i=0; i< 8192; i++) // Alles erstmal Löschen
{
 In_r [i] = 0;       In_i [i] = 0;
}
for (i=170; i< 190; i++) // Frequenzen einschalten
{
 In_r [i] = 200;         In_i [i] = 200;
 In_r [8192- i] = 200;   In_i [8192- i] = -200;
}
IFFT (In_r, In_I, Out_r,Out_i);  // 8192 Punkte FFT
Out_r ---> ausgeben     Out_i liegt bei ca. 0.0

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich vermute bei dir sieht es so aus wie im Anhang (Realteil)? Das passt
schon: du hast im Frequenzbereich ein verschobenes Rechteck, das ergibt
eine modulierte sinc-Funktion.

> In_r [8192- i] = 200;   In_i [8192- i] = -200;

Dein Index geht von 0 bis 8191, also muss da 8191 stehen. Aber das
macht keinen großen Unterschied für das Ergebnis.

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe es nur auf dem Oszi gesehen und da habe ich die Daten halt in einem
Loop ausgegeben. Und wenn ich es richtig gesehen habe, passt Dein Bild.

Nur ich wollte eigentlich ein Siganl mit einem gleich bleibenden Pegel
haben!!!!!

Wenn ich bei einer Frequenz(i=170 == ca. 1kHz)  "8191- i" oder
"8193- i" mache hört man sofort das der Sinus nicht sauber ist.
Also bin ich davon ausgegangen das "8192 -i" das richtige ist.
Wenn ich also nur eine Frequenz ausgebe ist alles super keine hörbaren
Pegel schwankungen, und wenn ich dann wie im Beispiel 20 ausgebe kommt
so ein mist raus.  Warum? Was mache ich falsch?

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso, was heist den eigentlich:
"du hast im Frequenzbereich ein verschobenes Rechteck, das ergibt
eine modulierte sinc-Funktion."

modulierte sinc-Funktion --> ist das was ich nicht will!
verschobenes Rechteck  --> ?????

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, 8192 - i war schon richtig.

Das ist nunmal das was rauskommt wenn du 21 Sinusse mit der gleichen
Phase überlagerst. Wenn du die Phase zufällig wählst, dann bekommst du
eher das was du willst. Aber das in C auszuprobieren ist sehr mühselig,
probier's mal mit Matlab oder octave.

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich brauche das leider in "C" weil es in ein Program rein kommt.
Und der Benutzer die Frequenzen und den Pegel angeben können soll.

In welcher Variable und Position (vordere oder hintere hälft) ist die
Phase versteckt?
ALso was muß ich mit dem Random Generator duchdrehen?

Autor: Detlef _a (detlef_a)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi
>ALso was muß ich mit dem Random Generator duchdrehen?
die Phasen.

>In welcher Variable und Position (vordere oder hintere hälft) ist die
>Phase versteckt?

Im Verhältnis von beiden. In_r[i]+(sqrt(-1)*In_i[i] IST ne komplexe
Zahl mit Betrag und Phase. http://de.wikipedia.org/wiki/Komplexe_Zahl

// Phasen drehen, Multiplikation mit einer komplexen
// Zufallszahl des Betrages 1
for (i=170; i< 190; i++) // Frequenzen einschalten
{
 In_r [i] = 200;         In_i [i] = 200;
 w=2.0*pi*zufall(); // zufall() macht nen float 0..1
 rrr=In_r[i]*cos(w)-In_i*sin(w);
 iii=In_r[i]*sin(w)+In_i*cos(w);
 In_r[     i]=rrr;In_i [i     ]= iii;
 In_r[8192-i]=rrr;In_i [8192-i]=-iii;
}

Dann sollte tendenziell son Signal rauskommen wie angehängt.
Cheers
Detlef

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nun, es funktioniert.
Ist nur nicht das was ich haben möchte (gleich bleibenden Pegel).
Es scheint nur so zu sein, das es leider gar nicht anders geht.
Also Danke an alle.

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na, geht doch. Es ist eine Eigenschaft von discrete multitone Signalen,
auch z.B. DSL, daß sie einen hohen crest-factor haben, also Verhältnis
von Spitzenwert zum root-mean-square, sprich keinen 'gleich bleibenden
Pegel'. Allerdings bist Du in der Wahl der Phasen frei, lass Deinen
3GHz Pentium mal ne Woche laufen und probier viele Phasen aus, dann
findest Du sicherlich nen Zeitsignal, daß einen gleichmäßigeren Pegel
hat als ein Signal mit irgendwelchen Zufallsphasen. Mir ist kein
Algorithmus bekannt (außer ausprobieren), der die Phasen so berechnet,
daß der crestfaktor minimal wird.

Cheers
Detlef

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.