Forum: Digitale Signalverarbeitung / DSP / Machine Learning IFFT liefert keine sauberes Signal


von Dirk (Gast)


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?

von Alex (Gast)


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?

von Dirk (Gast)


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.

von Dirk (Gast)


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

von Andreas S. (andreas) (Admin) Benutzerseite


Angehängte Dateien:

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.

von Dirk (Gast)


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?

von Dirk (Gast)


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  --> ?????

von Andreas S. (andreas) (Admin) Benutzerseite


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.

von Dirk (Gast)


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?

von Detlef _. (detlef_a)


Angehängte Dateien:

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

von Dirk (Gast)


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.

von Detlef _. (detlef_a)


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

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.