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
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.
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.
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: > Es soll die Amplitude des Signals > ermittelt werden. Das macht man mit einem Spitzenwertgleichrichter.
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
Hali H. schrieb: > Wie geht es denn einfacher? ;) Mit dem Goertzel-Algorithmus. Der rechnet nur den relevanten Teil.
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.
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
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.
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
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 | }
|
Er hat ja noch nicht gesagt was er überhaupt nutzt.
> Oder du besorgst die nen uC mit HW FFT Register
Welcher µC kann sowas?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.