FFT Verständnis

#4636884
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ß
#4636957
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? ;)
#4637003
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
#4637026
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?
#4637056
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
#4637625
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
#4637655
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
  }
#4637986
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).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren