FFT Verständnis

OP #4636884
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ß
Gast
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.
Gast
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.
OP
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? ;)
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
OP
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?
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
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
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
  }
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

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.