Forum: Analoge Elektronik und Schaltungstechnik FFT Verständnis


von Hali H. (ratendix)


Lesenswert?

Hallo an alle,

ich möchte ein Sinussignal mittels eines ADC auslesen und einer 
implementierten FFT analysieren. Es soll die Amplitude des Signals 
ermittelt werden.
FFT-Code gibts zu hauf im Internet, meine Frage geht eher ums allgemeine 
Verständnis:
Ich übergebe der FFT n Samplepoints in das Realteilarray, die FFT 
wandelt das ganze in Real- und Imaginärteil und ich erhalte dann quasi 2 
Ergebnisarrays.
Wie bekomme ich jetzt die Amplitude?
Muss ich die Magnitude (sqrt(R^2+I^2)) bestimmen?
Sitze da etwas am Schlauch...

Gruß

: Verschoben durch Admin
von Wolfgang (Gast)


Lesenswert?

Hali H. schrieb:
> ich möchte ein Sinussignal mittels eines ADC auslesen und einer
> implementierten FFT analysieren. Es soll die Amplitude des Signals
> ermittelt werden.

Wenn du die Frequenz kennst, ist eine FFT völlig übertriebener 
Rechenaufwand.

von Hilfegeber (Gast)


Lesenswert?

Ja, man muss die einzelnen Werte aufsummieren und euklidsch verrechnen. 
Danach noch auf die FFT-Länge beziehen. Aber Achtung: Manche FFT-Codes 
bauen einen Faktor mit rein.

von Hali H. (ratendix)


Lesenswert?

Hilfegeber schrieb:
> Ja, man muss die einzelnen Werte aufsummieren und euklidsch
> verrechnen.
> Danach noch auf die FFT-Länge beziehen. Aber Achtung: Manche FFT-Codes
> bauen einen Faktor mit rein.

Heißt das, ich muss alle Magnitude Werte in einem seperaten Array 
aufsummieren?
Also quasi magnitude[i]= sqrt(Re(i)^2+Im(i)^2))
oder berechne ich die Magnitude nur einmal?
Auf die Länge der FFT heißt denke ich durch die Anzahl der Samples 
teilen?

Wolfgang schrieb:
>
> Wenn du die Frequenz kennst, ist eine FFT völlig übertriebener
> Rechenaufwand.

Wie geht es denn einfacher? ;)

von Hp M. (nachtmix)


Lesenswert?

Hali H. schrieb:
> Es soll die Amplitude des Signals
> ermittelt werden.

Das macht man mit einem Spitzenwertgleichrichter.

von Klaus R. (klara)


Lesenswert?

Hali H. schrieb:
> ich möchte ein Sinussignal mittels eines ADC auslesen und einer
> implementierten FFT analysieren. Es soll die Amplitude des Signals
> ermittelt werden.

Wenn man einen Sinus mit einer FFT analysieren will, dann hat man 
vermutlich auch Oberwellen, ansonsten braucht man die FFT nicht und 
misst direkt die Amplitude.

Wenn ein Sinus aber Oberwellen beinhaltet, dann muss man sich Fragen, 
welche Amplitude soll denn gemessen werden? Der Sinus kann dann ganz 
schön verformt sein. Ich denke mal, Du musst zur Grundwelle jede 
Oberwelle phasenrichtig addieren. Willst Du das wirklich?
mfg klaus

von Wolfgang (Gast)


Lesenswert?

Hali H. schrieb:
> Wie geht es denn einfacher? ;)

Mit dem Goertzel-Algorithmus. Der rechnet nur den relevanten Teil.

von Wolfgang (Gast)


Lesenswert?

Klaus R. schrieb:
> Wenn ein Sinus aber Oberwellen beinhaltet, dann muss man sich Fragen,
> welche Amplitude soll denn gemessen werden? Der Sinus kann dann ganz
> schön verformt sein.

Dann ist der Sinus kein Sinus.

von Hali H. (ratendix)


Lesenswert?

Klaus R. schrieb:
> Hali H. schrieb:
>> ich möchte ein Sinussignal mittels eines ADC auslesen und einer
>> implementierten FFT analysieren. Es soll die Amplitude des Signals
>> ermittelt werden.
>
> Wenn man einen Sinus mit einer FFT analysieren will, dann hat man
> vermutlich auch Oberwellen, ansonsten braucht man die FFT nicht und
> misst direkt die Amplitude.
>
> Wenn ein Sinus aber Oberwellen beinhaltet, dann muss man sich Fragen,
> welche Amplitude soll denn gemessen werden? Der Sinus kann dann ganz
> schön verformt sein. Ich denke mal, Du musst zur Grundwelle jede
> Oberwelle phasenrichtig addieren. Willst Du das wirklich?
> mfg klaus

Ja genau, das Sinussignal wird verzerrt sein.
Reicht es nicht aus, den maximalen Magnitude zu nehmen? Ein Sinus hat ja 
nur den einen Peak. der Rest wird doch "nur" das Rauschen 
(Ober-/Unterwellen) sein?

von Klaus R. (klara)


Lesenswert?

Hali H. schrieb:
> Ja genau, das Sinussignal wird verzerrt sein.

Hier mal ein extremes Beispiel:
https://www.mikrocontroller.net/attachment/294695/Input_pwl_5_1a.jpg

> Reicht es nicht aus, den maximalen Magnitude zu nehmen? Ein Sinus hat ja
> nur den einen Peak. der Rest wird doch "nur" das Rauschen
> (Ober-/Unterwellen) sein?

Schon mal ein Rechteck per FFT analysiert? Ein Rechteck besteht aus 
unendlich vielen Sinussignalen. Jetzt kannst Du Dir vorstellen das auch 
die Phasenlage der Oberwellen zur Ermittlung einer Amplitude interessant 
sein kann.

Es kommt natürlich auf die gestellten Ansprüche an, wie genau soll 
gemessen werden? Beim Klirrfaktor von 10% sieht man im Sinus schon 
optisch die Verzerrungen.
mfg klaus

von Hali H. (ratendix)


Lesenswert?

Wenn also der Klirrfaktor genügend klein ist, man das Eingangsignal 
schon zuvor analog filtert, dann kann man die Amplitude über die 
maximale Magnitude ermitteln oder? Also bei einem Sinussignal.

von Klaus R. (klara)


Lesenswert?

Hali H. schrieb:
> Wenn also der Klirrfaktor genügend klein ist, man das Eingangsignal
> schon zuvor analog filtert, dann kann man die Amplitude über die
> maximale Magnitude ermitteln oder? Also bei einem Sinussignal.

Dann braucht Du zur Ermittlung der Amplitude aber kein FFT mehr.
mfg klaus

von Dergute W. (derguteweka)


Lesenswert?

Moin,

FFT halt' ich eh' fuer schlecht geeignet die Amplitude zu messen, wenn 
nicht das Messsignal und die Abtastrate phasenstarr miteinander 
verkoppelt sind.
Ich wuerd' den Effektivwert des Signals messen und seinen linearen 
Mittelwert. Daraus kann man dann dann, so man annimmt, das Signal waere 
ein Sinus (mit ueberlagertem Gleichanteil z.b. durch den Offset des 
Wandlers) die Amplitude berechnen.

Gruss
WK

von Ingo L. (corrtexx)


Lesenswert?

Du könntest auch, um "nur" den Maximalwert zu bestimmen das Signal über 
mehrere Perioden abtasten und immer schauen ob du ein Maximum hast. Aus 
dieses Maxima berechnest du noch den Mittelwert. Also einen großen 
Buffer vollsamplen, diesen anschließend nach Mixima scannen. Ein Maxima 
hast du wenn Sample[i-1] < Sample[i] > Sample[i+1] ist. Dieses Maxima 
addierst du in einen extra Buffer, gleichzeitig zählst du die Maxima 
mit.
1
  // Search Maxima, Count them , Store Values
2
  for (uint16_t i = 1; i < BUFFERSIZE-1; i++){
3
    if ( (DataBuffer[i-1] < DataBuffer[i]) && (DataBuffer[i+1] < DataBuffer[i]) ){// Maxima found
4
      BufferExtrema+= DataBuffer[i];
5
      AnzahlExtrema++;
6
      
7
    }
8
   Mittel = BufferExtrema / AnzahlExtrema;
9
   BufferExtrema = 0;
10
   AnzahlExtrema = 0;
11
  }

von LKa (Gast)


Lesenswert?

Oder du besorgst die nen uC mit HW FFT Register... Das ist super 
schnell! :)

von Ingo L. (corrtexx)


Lesenswert?

Er hat ja noch nicht gesagt was er überhaupt nutzt.

> Oder du besorgst die nen uC mit HW FFT Register
Welcher µC kann sowas?

von LKa (Gast)


Lesenswert?

Hi
ich noch mal..

dieser zum Beispiel
TMS320C5505

von Uwe B. (uwe_beis)


Lesenswert?

Deine ursprüngliche Frage war
> Muss ich die Magnitude (sqrt(R^2+I^2)) bestimmen?
Ja, aber nur wenn die Frequenz deines Signals genau auf einer deiner 
Spektrallinien liegt. Was "genau" heißt, kannst du dir selber 
definieren. Ansonsten musst du noch benachbarte Spektrallinien 
berücksichtigen.

Die anderen Antworten hier beantworten deine Frage zwar nicht, aber 
solange es um das Ziel, und nicht um den Weg geht, sind sie berechtigt. 
Und es gibt viele Möglichkeiten. Alle haben unter realen Bedingungen 
Messfehler, und es liegt an dir, mit einem Verfahren einen geeigneten 
Kompromiss zwischen Messgenauigkeit und Rechenaufwand zu finden.

Ich bringe noch drei Verfahren in die Diskussion:

1. Signal gleichrichten (Betrag) und Mittelwert bilden (Tiefpass). 
Korrekturfaktor dazu, fertig. Aber alle Oberwellen und Störspannungen 
bleiben in der Messung, nur erheblich geringer als bei 
Spitzenwertgleichrichtung.

2. Signal quadrieren und Mittelwert bilden (Tiefpass). Wurzel daraus, 
fertig. Aber alle Oberwellen und Störspannungen bleiben auch hier in der 
Messung, nur erheblich geringer als bei Spitzenwertgleichrichtung.

3. Signal mit Sinus mit möglichst gleicher Frequenz 2 x multiplizieren: 
1 x 0°, 1 x 90°, beide Multiplizierer auf je einen Tiefpass, so 
dimensioniert, dass weder eine Frequenzabweichung noch die zu 
unterdrückenden Oberwellen und Störspannungen zu einem unzulässigen 
Fehler führen (-> Kompromiss). Messsignal = sqrt(R^2+I^2).

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.