www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP TI's FFT - Phaseninformation extrahieren - TMS320F2812


Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
hoffe es gibt hier Experten, die mir helfen können das Phasenspektrum
einer FFT zu bekommen. Ich benutze gerade die TI-FFT-Library und rechne
eine komplexe FFT eines zweikanaligen Eingangssignals (I & Q-Kanal). Nun
möchte ich gerne das Phasenspektrum berechnen. Kurz: Wie geht das? Wie
trenne ich Imaginär und Realteil? Damit könnte ich dann die Phase per
arctan berechnen, oder?
Ich sehe immer nur das Amplitudenspektrum.

Danke im Voraus

Christian

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Damit könnte ich dann die Phase per arctan berechnen, oder?

ja

>Ich sehe immer nur das Amplitudenspektrum.
was heißt das? Die library sollte Dir doch Real/Imagteil liefern. Wenn
Du daraus die Amplitude berechnen kannst, sollte das mit der Phase doch
auch gelingen ?!

Ratlos. Bißchen mehr infos kämen gut.

Cheers
Detlef

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
also mehr Infos zu meinem Problem:
Im Prinzip müsste die FFT-library mir Real/Imaginärteil liefern, aber
wo finde ich diese? Ich schreibe momentan die komplette 512er FFT in
ein Array und schaue mir dieses als Graph an. Es ist das
Amplitudenspektrum, ziemlich sicher. Ich benutze die RFFT32-Funktion
und die RFFT32_ACQ-Funktion zum einlesen. Nun lese ich aus dem
FFT-Handbuch, dass eigentlich bei dieser Funktion die Werte in
folgender Form eingelesen werden: I-Kanal-Samples in die geraden
Speicherzellen und Q's in die ungeraden. Das mache ich also.
Das Problem ist nun der Output. Aus dem Handbuch glaube ich zu
erkennen, dass diese Funktion den "Real Part" in die ersten N/2
Speicherstellen und den "Imag Part" in den Rest schreibt. Meinem
Spektrum sehe ich aber an, dass es einfach nur ein komplexes
Amplitudenspektrum ist. Das erkenne ich daran, dass wenn ich einen
Kanal abschalte, ich die Spiegelfrequenz sehe und sonst nicht. Ich
hoffe ich hab das bisher alles richtig verstanden.
Wie komme ich nun an den Imaginär und Realteil und damit an die Phase?
Woran sehe ich zB dass es sich nun um den Imag Teil handelt? Gibt
andere Möglichkeiten an die Phase zu kommen? Weil der DSP ja für einen
arctan bestimmt auch einige Zeit braucht (mit der IQ-Math libraray).

Freu mich über Hilfe

Christian

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Christian,

>Ich schreibe momentan die komplette 512er FFT in ein Array und >schaue
mir dieses als Graph an.

11111111111>>>
Du kuckst Dir die Ergebnisse in dem array an, auf das magptr zeigt?
magptr aus diesem komischen struct? Das sind vermutlich die Magnitudes,
wenn man dem Namen trauen darf. Die FFT ist 'inplace', wenn ich die
doku richtig verstanden habe, d.h. die FFT-Ergebnisse stehen in dem
array, in das Du Deine Zeitsamples reingeschrieben hast.
2222222222>>>
'real fft' heißt bei ti, daß ein Zeitsignal von N-samples fft-iert
werden soll, dazu reicht eine N/2 FFT. 'Complex fft' heißt, daß der
Imaginärteil des 'Zeitsignals' auch betrachtet wird, dann braucht man
für N samples auch ne N-Punkte FFT.
3333333333>>>>
I/Q - Kanal: Du weiß, was Du tust? I/Q (inphase, quadrature phase) hat
mit imaginär und real nix zum tun! Das sind zwei Zeitsignale. Du kannst
zwei Zeitsignale mit je N Punkten in einer einzigen N-Punkte-FFT
gemeinsam verarbeiten, dazu ist aber etwas Vorverarbeitung notwendig.
Bin in die doku nicht soweit eingestiegen, daß ich weiß, ob die lib das
kann.

Vorschlag: Probleme trennen. Erstmal reinen Sinus mit der lib richtig
fft-ieren, dann die 'realfft' kucken, dann die gemeinsame FFT-Tierung
zweier Zeitsignale testen. Auch mal überlegen, ob Du die lib wirklich
nutzen willst oder Dir nicht ne FFT selber machst. Die beiden Wege sind
vielleicht gleich langwierig, bei dem einen hast Du hinterher ti's
cryptische Einlassungen verstanden, beim anderen die FFT von der Pike.
Da würde ich letzteres vorziehen.

Cheers
Detlef

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi nochmal,

danke erstmal für die Hilfe.

I und Q Kanal haben meiner Meinung nach sehr wohl was mit Real und
Imaginärteil zu tun. Der I Kanal repräsentiert den Realteil des Signals
und der Q Kanal das um 90° gedrehte Signal und damit den Imaginärteil.
Diese taste ich simultan ab und schiebe sie wie beschrieben in die FFT.

Ich bin erst mal beruhigt, dass ich nicht der einzige bin, der nicht zu
100% durch das TI Handbuch steigt. Vielleicht ist die Idee mit der
eigenen FFT nicht so schlecht. Ich habe bisher die TI-FFT bevorzugt, da
ich dachte, dass diese wohl auf Assembler-Ebene optimiert sei und somit
sehr schnell ist. A propros array, ich arbeite nicht mit der magnitude
Funktion. Ich rechne nur die FFT und schreibe die Ergebnisse aus dem
ipcb in ein eigenes Array. Das alles funktioniert ja auch wunderbar und
hat schon etliche Std gekostet bis hierhin. Deshalb würde ich gerne hier
weitermachen. Ein reiner Sinus läuft super, alles kein Problem, aber den
Imaginärteil seh ich auch da nicht. Und in der TI-Beschreibung steht
auch immer, dass oft nur der Realteil benötigt wird und dass man doch
die magnitude berechnen soll. Will ich aber alles nicht.....
Ich scheine doch ein spezielles Problem zu haben. Sie Phase scheint
nicht so viele Signalverarbeiter zu interssieren....

Bin weiterhin für jede gute Idee dankbar

Christian

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ein reiner Sinus läuft super, alles kein Problem, aber den
> Imaginärteil seh ich auch da nicht.

häh? Reiner Sinus liefert Real/Imaginärteil abhängig davon, welche
Phase er hat, wie er 'im Fenster liegt'. Wenn das nicht geht, läuft
überhaupt nix super.

Cheers
Detlef

Autor: Christian (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmal,
natürlich is nix super, sonst würd ich ja hier nicht nachfragen.
Ich hab nun meinen ADC mal mit einem Sinussignal gespeist, das
TI-handbuch bemüht und das Signal im Frequenzbereich nach Real und
Imaginärteil getrennt (hoffe ich zumindest:-)). Dazu hab ich die Werte
mit geradem Index von den ungeraden getrennt, anschließend die geraden
in den ersten Teil eines 512er Arrays gepackt und Rest in die andere
Hälfte. Das Ergebnis hab ich mal als pdf angehängt. Sieht meiner
Meinung nach gar nicht so verkehrt aus. Die Frequenz des Sinussignals
beträgt genau 1/4 der Abtastfrequenz. Ich frage mich nur warum das
Sinussignal immer genau so im Fenster liegt, dass ich immer einen
Imaginärteil und einen Realteil bekomme?
Müsste das nicht irgendwann mal nur zu einem Real oder nur zu einem
Imaginärteil führen, weil das Fenster sich ja nicht idealerweise immer
ein wenig verschiebt?
Fragen über Fragen...

Gruß
Christian

Autor: Detlef A (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Fragen über Fragen...
stimmt
>Ich hab nun meinen ADC mal mit einem Sinussignal gespeist,
Das ist die FFT eines realen Signals!? Das sieht aus wie synchrone
Abtatung, also DAC und ADC Takte fest gekoppelt oder synthetisches
Signal. So rauschfrei, nicht mal nen Pixelchen hin und her auf der
Nulllinie (Nullinie?). Kann ich nicht glauben. Fetter DC-Offset dabei.

>Die Frequenz des Sinussignals beträgt genau 1/4 der Abtastfrequenz.
Die FFT eines Sinus Amplitude 1 mit 1/4 Abtastfrequenz i.e. 4
Abtastwerte pro Vollwelle im 512er Fenster hat alle Realteile 0,
imag[128] ist -256, imag[512-128] = 256 (C Zählung, also 0..511), also
nur zwei Spitzen und nicht 4. Phasenverschiebung von 90° macht aus dem
Sinus nen Cosinus, Realteile zweimal positiv und Imaginärteile alle 0.
So muß der aussehen. Deine Bilder verstehe ich nicht, Du sprichst von
zwei Signalen, zu sehen sind aber 3.

Das ist nen Problem mit der blöden ti-lib.

Cheers
Detlef

Autor: Björn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>
Du kannst
zwei Zeitsignale mit je N Punkten in einer einzigen N-Punkte-FFT
gemeinsam verarbeiten, dazu ist aber etwas Vorverarbeitung
notwendig.<<

Nö, vorbereitet muss da gar nichts werden. Zwei reelle Signale x1 und
x2 mit einer komplexen FFT is nur

x3[n] = x1[n] + j*x2[n]

Dann

x3[n] -> FFT -> X3

Und nu kann man die Spektren der beiden Signale aus X3 rausfummeln.

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> aus X3 rausfummeln

Das meinte ich mit Vorverarbeitung. Ist aber doch wohl eher ne
Nachverarbeitung.

Cheers
Detlef

Autor: Björn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann sind wir uns einig ;-)

Autor: Christian (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Tag nochmal,
ich hab mich nochmal mit der TI-Library rumgeärgert und bei ner 128er
FFT, einer Abtastfrequenz von 5 kHz ein Sinussignal mit 625 Hz
abgetastet und transformiert. Die Abbildungen zeigen das Ergebnis. Die
Kurven laufen so hin und her. Links hab ich den Realteil, also von
Index 0 bis 128, und rechts den Imaginärteil. Das müsste es sein
oder??
Jetzt müsste ich nur noch die Phase berechnen. Kann ich da einfach die
IQmath Library mit der arctan-Funktion benutzen oder muss ich da noch
was beachten?
Gruß
Christian

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, 8 Abtastwerte/Welle sind 16 volle Wellen auf Deine Fensterbreite,
also müßte peak bei Index 16 sein, bei Dir ist er bei 8?! Aber schön
spiegelsymmetrisch die Realteile und punktsymmetrisch die
Imaginärteile, das ist gut. Sind wieder drei Signale dargestellt? Was
ist denn da für nen fetter Störer bei Index 56 (?). Für Index 8 wäre
das die 7. Oberwelle, ungewöhnlich. Hast Du einen Funktionsgenerator
dran? Oder ist das Signal synthetisch, dann ist der fette Zacken
falsch. Phase kannst Du einfach mit arctan berechnen, das sollte ok
sein, die IQmath Library ist mir unbekannt.

Viel Glück
Detlef

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein letztes Mal Hallo,
wollte nur kurz ein großes DANKE sagen.
Die Kiste läuft vom allerfeinsten. Die Phase bzw. die Phasendifferenz
zweier Signal wird exakt ausgegeben.
Hab ne Menge gelernt.
Bis zum nächsten Mal vielleicht.... ;-)

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kannst du bitte mal den Code reinstellen wie du das ganze implementiert 
hast?

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.