Forum: Digitale Signalverarbeitung / DSP / Machine Learning Sinusamplitude bei bekannter f ermitteln über Abtasttheorem


von aleXX (Gast)


Lesenswert?

Hi.
Wie kann ich die Amplitude eines Sinussignals softwareseitig aus 
abgetasteten Werten bestimmen?
Angenommen die Frequenz beträgt fsin = 1000 Hz und die Abtastfrequenz 
beträgt fabt = 2300 Hz.
Der Offset beträgt 0 und nur die Sinusamplitude ist unbekannt.

von AbcAbc (Gast)


Lesenswert?

Du könntest die Scheitelpunkte bestimmen. Anhand der Abstastrate weißt 
du auch wie weit diese zeitlich auseinander liegen. Damit kannst du 
Frequenz berechnen. Daran denken das Abtastheorem einzuhalten.

Daneben gibt es natürlich noch eine ganze Menge anderer Techniken. Z.B. 
eine Fouriertransformation.

von AbcAbc (Gast)


Lesenswert?

Ups. Habs bisschen überlesen. Dachte du suchst die Frequenz.
Amplitude ist ja noch einfacher: Geh alle Werte innerhalb einer 
Schwingungsperiode durch und vergleich die Größe. Der größte Wert ist 
die Amplitude.

von Jaroslaw (Gast)


Lesenswert?

AbcAbc schrieb:
> (...) Der größte Wert ist die Amplitude.

Nicht unbedingt... Es koennte sein dass wir beim Abtasten den maximalen 
Wert gar nicht erwischen. Es haengt von der Phasenverschiebung des 
Signals ab!
Ich wuerde eine Discrete Fourier Transform mit 23 Punkten durchfuehren. 
Bei einer Abtastfrequenz von 2,3kHz waere die Aufloesung des Spektrums 
100Hz. Der absolute Betrag vom 10. Abtastwert des Spektrums, dividiert 
durch die halbe DFT-Groesse (11,5), bestimmt die Amplitude des 
1kHz-Sinussignales.

von AbcAbc (Gast)


Lesenswert?

@Jaroslaw Da hast du natürlich recht. Frage ist halt wie genau muss die 
Amplitude bestimmt werden und wie viel Rechenleistung steht zur 
Verfügung. Wenn man die Frequenz des Signals und die Phasenlage kennt, 
kann man natürlich auch einfach nur zum Richtigen Moment abtasten.

Im allgemeinen Fall ist eine DFT natürlich der zu bevorzugende Weg 
braucht aber auch mehr Rechenleistung.

von aleXX (Gast)


Lesenswert?

Danke.

Die Methode mit der Suche nach dem höchsten Abtastwert als Amplitude 
finde ich zwar gut und simpel, aber wenn ich es etwas eleganter 
hinkriege wäre es mir etwas lieber.

Das mit der DFT klingt ganz gut.
Gibt es da eine gute Quelle für die praktische Anwendung für die 
mathematisch nicht so begabten?

Ich bin bereits davor auf FFT und DFT gestoßen, aber konnte damit nicht 
so viel anfangen.

Ich würde gerne wissen wie man das herleiten kann mit den 23 Punkten?

von aleXX (Gast)


Lesenswert?

Rechenleistung ist genug vorhanden. Die abgetasteten Werte werden auf 
einem USB abgespeichert und erst im Anschluss am PC weiterverarbeitet.

von El Ef (Gast)


Lesenswert?

Wenn man die Frequenz kennt und nur diese Interessiert, kann man statt 
der kompletten DFT auch den Görtzel hernehmen

von Jan (Gast)


Lesenswert?

Einfach die Samples nach dem Maximum zu durchsuchen ist natürlich 
Quatsch, insbesondere, wenn du gerade mal etwas mehr als 2 Abtastwerte 
pro Periode hast.

Da du das Abtastheorem eingehalten hast, kannst du theoretisch das 
Signal perfekt rekonstruieren. Google nach Rekonstruktionsfilter oder 
Sinc-Interpolation. Das sind Sachen im Zeitbereich.
Oder du fittest einen Sinus im Zeitbereich hinein, du hast ja sogar den 
Offset und die Phase.
Oder halt Sachen im Zeitbereich, FFT, Görtzel etc.

von Bernd (Gast)


Lesenswert?

Jan schrieb:

> Einfach die Samples nach dem Maximum zu durchsuchen ist natürlich
> Quatsch, insbesondere, wenn du gerade mal etwas mehr als 2 Abtastwerte
> pro Periode hast.

Das ist einer der typischer Beiträge auf dem µCNet. Schreiben ohne zu 
denken. Es sind 1000 Hz, die mit 2300/s abgetastet werden.

Fange an zu denken und poste die minimale Anzahl von Abtastungen, die 
zur Amplitudenbestimmung benötigt werden.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Das Signal hat die Gleichung

  y = a · sin(ωt + φ)

ω ist bekannt, a und φ nicht. Du kannst für zwei Abtastzeitpunkte t₁ und
t₂ mit den Messwerten y₁ und y₂ ein Gleichungssystem aufstellen

  y₁ = a · sin(ωt₁ + φ)
  y₂ = a · sin(ωt₂ + φ)

und daraus a und φ bestimmen.

Nachteil dieses Verfahrens: Da nur zwei einzelne Messwerte in das
Ergebnis eingehen, ist es empfindlich gegenüber Messrauschen.

Besser:

Du bildest zwei Produkte

  I = y · sin(ωt)
  Q = y · cos(ωt)

Daraus bildest du die Mittelwerte I̅ und Q̅ über ein ganzzahliges
Vielfaches der Periodendauer des Signals.

S. auch:

  https://de.wikipedia.org/wiki/I%26Q-Verfahren
Dann ist

  a = 2 · √(I̅² + Q̅²)
  φ = atan2(Q̅, I̅)

Je mehr Abtastwerte du in diese Berechnung eingehen lässt, umso besser
wird das Messrauschen unterdrückt.

Edit:

Der Faktor vor der Wurzel in der Amplitudenberechnung ist nicht ½,
sondern 2. Ich habe den Fehler oben entsprechend korrigiert.

: Bearbeitet durch Moderator
von Jan (Gast)


Lesenswert?

Bernd schrieb:
> Das ist einer der typischer Beiträge auf dem µCNet. Schreiben ohne zu
> denken. Es sind 1000 Hz, die mit 2300/s abgetastet werden.
>
> Fange an zu denken und poste die minimale Anzahl von Abtastungen, die
> zur Amplitudenbestimmung benötigt werden.

Das kann ich nur zurückgeben. Soll ich dir ne Skizze machen?

von Bernd K. (prof7bit)


Lesenswert?

Bernd schrieb:
> Fange an zu denken und poste die minimale Anzahl von Abtastungen, die
> zur Amplitudenbestimmung benötigt werden.

2

von Jan (Gast)



Lesenswert?

Wenn das Signal nicht verrauscht ist, korrekt. Wenn man nun davon 
ausgeht, dass die Phase zufällig ist (oder man zufällig anfängt 
abzutasten) und man sich nur sehr wenige Perioden anguckt, so 
funktioniert die Methode der Maximum Suche nicht.
Werden es aber mehr Perioden, funktioniert es sogar ganz gut, habe mal 
ein paar Tests gemacht, siehe Anhang.

Ich hätte echt erwartet, dass die Maximum Methode deutlich schlechter 
bei Rauschen abschneidet.

von aleXX (Gast)


Lesenswert?

Demnach habe ich nun die Qual der Wahl.
Am besten teste ich alle 3 Möglichkeiten, also das I&Q-Verfahren, die 
DFT und die Maximalamplitudenbestimmung.
Der Programmieraufwand hält sich da ja relativ in Grenzen.
Danke.

von Yalu X. (yalu) (Moderator)


Lesenswert?

aleXX schrieb:
> Am besten teste ich alle 3 Möglichkeiten, also das I&Q-Verfahren, die
> DFT und die Maximalamplitudenbestimmung.

Das I&Q-Verfahren ist bei näherer Betrachtung nichts anderes als die
DFT, beschränkt auf eine bestimmte Zielfrequenz. Die Begriffe I und Q
verwendet man bevorzugt im Zusammenhang mit der analogelektronischen
Demodulation von Signalen.

von Yalu X. (yalu) (Moderator)


Lesenswert?

aleXX schrieb:
> Demnach habe ich nun die Qual der Wahl.

Ich habe als Entscheidungshilfe mal kurz die wesentlichen Vor- und
Nachtteile der einzelnen Verfahren zusammengestellt:


Gleichungssystem mit zwei Gleichungen:

Bei unverrauschten Signalen ist das Ergebnis theoretisch exakt, mit
Rauschen kann es aber sehr ungenau werden.


Maximumverfahren:

Bei nur wenigen Abtastwerten ist du Chance gering, dass einer davon
genau auf einen Scheitelpunkt des Sinussignals fällt. Dann wird das
Ergebnis ungenau. Bei sehr vielen Abtastwerten konvergiert das Maximum
gegen das tatsächliche Maximum plus die Rauschamplitude und wird damit
ebenfalls ungenau. Deswegen ist das Verfahren nur für unverrauschte
Signale mit einer ausreichden Anzahl von Abtastwerten brauchbar. Ein
Vorteil ist der geringe Rechenaufwand.


DFT bzw. I&Q:

Man sollte drauf achten, dass der für die Berechnung betrachtete
Zeitraum möglichst genau einem ganzzahligen Vielfachen der Signalperiode
entspricht. Bei 1000 Hz und 2300 Hz entsprechen 23 Abtastperioden exakt
10 Signalperioden (10 ms). Deswegen sollte die Anzahl der ausgewerteten
Abtastwerte 23 oder ein Vielfaches davon sein. Nur dann ist bei
unverrauschtem Signal das Ergebnis theoretisch exakt. Bei verrauschtem
Signal verbessert eine große Anzahl von Abtastwerten das Ergebnis. Nimmt
man n·23 Abtastwerte, so ist der Fehler des Ergebnisses proportional zu
1/√n. Eine Erhöhung der Anzahl der Abtastwerte um den Faktor 100
reduziert also den Fehler auf ein Zehntel. Bei fixer Signal- und
Abtastfrequenz müssen die Sinusse und Kosinusse nur einmal vorab
berechnet werden, so dass der Rechenaufwand für die Signalauswertung
immer noch recht gering ist.


Nichtlineare Optimierung:

Da es sich um ein iteratives Verfahren handelt ist, das Ergebnis auch
bei unverrauschtem theoretisch nicht exakt, durch eine größere Zahl von
Iteration kann der Fehler aber praktisch beliebig reduziert werden, so
dass dies keinen Nachteil darstellt. Das Verfahren liefert auch dann
gute Ergebnisse, wenn der Betrachtungszeitraum keinem Vielfachen der
Signalperiode entspricht. Erkauft wird dies mit einem gegenüber der DFT
höheren Rechenaufwand. Auch der Programmieraufwand ist höher, jedoch
sind fertige Implementation der des dafür üblicherweise eingesetzten
Levenberg-Marquardt-Algoprithmus frei im Web verfügbar.

: Bearbeitet durch Moderator
von aleXX (Gast)


Lesenswert?

@Yalu X.
Vielen Dank, also dann wird es auf jeden Fall ein DFT-basiertes 
Verfahren.

Ich muss dazu noch erwähnen dass das Messsystem (der Abtaster) und die 
Signalquelle völlig unabhängig voneinander laufen.
Annähernd exakt kann ich keine Samples, immer zur gleichen Zeit der 
Periode, nehmen. Die Phase ist also auch unbekannt, aber das haben hier 
eigentlich auch alle sofort erkannt und intuitiv angenommen. Wobei nur 
die Amplitude bestimmt werden muss.

Für DFT-basierte Verfahren wurde hier genannt:
- Die ganz normale DFT.
- I&Q-Verfahren: Laut Wikipedia kann man die Wurzelrechnung durch 
spezielle Algorithmen annähern um Rechenaufwand einzusparen.
- Der Goerzel-Algorithmus, mit dem man z.B. nur die Amplitude ermitteln 
kann und der in diesem Fall schneller als die FFT wäre.

Wobei mir die Messgenauigkeit in diesem Fall wichtiger als die 
Geschwindigkeit ist.

Es ist schön zu sehen was es für verschiedene Ansätze gibt.

von Sven B. (scummos)


Lesenswert?

Yalu X. schrieb:
> DFT bzw. I&Q:
>
> Man sollte drauf achten, dass der für die Berechnung betrachtete
> Zeitraum möglichst genau einem ganzzahligen Vielfachen der Signalperiode
> entspricht.

Ist das denn tatsächlich so relevant? Ich würde denken, wenn man 
ausreichend Zero-Padding macht und dann eine Parabel an die paar 
höchsten Punkte des Ergebnisses fittet, spielt das fast keine Rolle.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Sven B. schrieb:
> Ist das denn tatsächlich so relevant? Ich würde denken, wenn man
> ausreichend Zero-Padding macht und dann eine Parabel an die paar
> höchsten Punkte des Ergebnisses fittet, spielt das fast keine Rolle.

Ja, damit kann man das Ergebnis sicher verbessern. Man muss dazu eben
das Spektrum noch für die beiden Nachbarfrequenzen berechnen, was ja
auch kein großes Problem ist.

Ich bin bei meinen Überlegungen davon ausgegangen, dass die Berechnung
nur für einzige Frequenz (im Beispiel die 1000 Hz) durchgeführt wird.
Das spart Rechenzeit, und da Signal- und Abtastfrequenz beide bekannt
sind, ist die Bedingung für den Betrachtungszeitraum bzw. die Anzahl der
Abtastungen i.Allg. leicht zu erfüllen.

aleXX schrieb:
> Für DFT-basierte Verfahren wurde hier genannt:
> - Die ganz normale DFT.
> - I&Q-Verfahren: Laut Wikipedia kann man die Wurzelrechnung durch
> spezielle Algorithmen annähern um Rechenaufwand einzusparen.

Die Wurzel brauchst du in beiden Fällen. Bei der klassischen DFT taucht
sie in der Betragsbildung des komplexen Ergebnisses auf. Beim
I&Q-Verfahren entsprechen I und Q dem Real- und Imaginärteil des
Ergebnisses der DFT.

Wenn du die Berechnung bspw. über 23 Abtastwerte machst, kostet schon
das mit sin und cos gewichtete Aufsummieren 46 Multiplikationen und 44
Additionen. Da fällt die Zeit für das anschließende Wurzeln kaum ins
Gewicht.

von Bölko (Gast)


Lesenswert?

Yalu X. schrieb:
> Wenn du die Berechnung bspw. über 23 Abtastwerte machst, kostet schon
> das mit sin und cos gewichtete Aufsummieren 46 Multiplikationen und 44
> Additionen. Da fällt die Zeit für das anschließende Wurzeln kaum ins
> Gewicht.

und noch besser geht es bei 46 Werte n, usw.

Ich würde mit dem Sinus-Fit arbeiten. Das ist das Schnellste. Mittlere 
Abweichungen als Parameter in die Gleichung und über möglichst viele, 
als z.B. 46 rechnen.

von Sven B. (scummos)


Lesenswert?

Mir wäre bei dem Sinus-Fit deshalb ein bisschen unwohl, weil das halt 
non-linear least squares ist, und keinesfalls garantiert ist dass das 
konvergiert. Hängt halt auch davon ab, wo und für was das verwendet 
werden soll. In meinem Python-Skript zur Datenanalyse auf dem 
Desktop-Rechner, klar, in irgendeinem Controller einer Maschine ... ich 
weiß nicht.

: Bearbeitet durch User
von Tim S. (timschmii)


Lesenswert?

Hallo aleXX.
Interessantes Thema, welches du hier aufgegriffen hast.  Die 
Sinusamplitude zu mit einer bekannten f zu ermitteln habe ich bis jetzt 
so noch nicht gemacht.
Man könnte aber eigentlich die Scheitelpunkte ermitteln. Außerdem schaut 
man dazu noch auf die Abtastrate, um zu schauen, wie weit das Ganze 
zeitlich auseinanderliegt. EineUSV-Funktion 
(https://www.mornsunpower.de/) wäre auch eine gute Möglichkeit. Man muss 
eben schauen, dass das Signal nicht verrauscht ist. Das mit der Maximum 
Suche ist auch schwierig, da die Phase ja eigentlich zufällig ist und 
sich selber relativ wenige Perioden anguckt.

von Egon D. (Gast)


Lesenswert?

Yalu X. schrieb:

> Gleichungssystem mit zwei Gleichungen:
>
> [...]
> Maximumverfahren:
>
> [...]
> DFT bzw. I&Q:
>
> [...]
> Nichtlineare Optimierung:

Hmm.
Die Ausgleichsrechnung (Fehlerquadrat-Methode nach Gauss)
fehlt in der Liste.

Ich vermute eine weit verbreitete, aber irrige Ansicht als
Grund: Die Fehlerquadrat-Ausgleichsrechnung funktioniert --
entgegen der verbreiteten Meinung -- NICHT nur mit linearen
Funktionen.

Richtig ist: Die Modellfunktion (d.h. die Funktion, die an
die Messwerte "angefittet" werden soll) muss sich als
Linearkombination von Basisfunktionen darstellen lassen; die
Koeffizienten dieser Basisterme werden durch die Ausgleichs-
rechnung bestimmt.
Die Basisterme SELBST können jedoch beliebig nichtlineare
Gestalt haben. Die Modellfunktion a*sin(x)+b*cos(x) erfüllt
diese Forderung, wenn alle Stützstellen x_n bekannt sind
und nur die Koeffizienten a und b gesucht sind.

Das Verfahren führt -- auch bei nichtlinearen Basisfunktionen --
auf ein lineares Gleichungssystem, das man direkt lösen kann,
wenn man möchte.

Die Begründung für diesen Sachverhalt ist zwar nicht wirklich
schwierig, aber doch etwas trickreich.

von Sven B. (scummos)


Lesenswert?

Das ist natürlich völlig richtig und das habe ich an der Stelle auch 
(nicht zum ersten mal ;)) übersehen. Dann ist das (also explizites Least 
Squares) definitiv die Methode der Wahl.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Ich habe das Gauß-Verfahren mal durchgerechnet mit folgendem Ergebnis:

ω=2π·f_signal ist dabei die Kreisfrequenz des Signals, t_i=i/f_abtast
sind die Abtastzeitpunkte und y_i die Abtastwerte.

Wenn die n Abtastperioden zusammen ein ganzzahliges Vielfaches der
Signalperiode sind, durchläuft ω·t_i ein ganzzahliges Vielfaches von 2π.
Dadurch vereinfachen sich drei der obigen fünf Summen zu

Damit ist

womit wir für diesen Spezialfall wieder beim I&Q-Verfahren gelandet
sind.


Noch eine Ergänzung:

Wenn man die Abtastfrequenz frei wählen kann, ist es evtl. vorteilhaft,
sie auf das Vierfache der Signalfrequenz und die Anzahl der Abtastwerte
auf ein Vielfaches von 4 festzulegen. Dann sind nämlich die Werte der
Sinus- und Cosinus-Funktionen in den obigen Formeln alle -1, 0 odet +1,
und man erspart sich bei der Berechnung der Amplitude n Additionen und
2n Multiplikationen. Die Amplitudes ist dann

: Bearbeitet durch Moderator
von Nils Pipenbrinck (Gast)


Lesenswert?

Wenn es wirklich ein sauberer Sinus ist, dann wäre der klassiche Weg 
dies über eine Hilbert Transformation der Eingangsdaten zu machen. Das 
erzeugt Dir aus deinen gemessenen Daten ein um 90° verschobenes Signal. 
Das kannst Du dann direkt als IQ Signal verwenden.

Die Hilbert Transformation kannst du per FFT erzeugen. Wenn Du den 
Messpunkt genau in der Mitte des Zeitbereiches, den Du überwachst legst, 
dann ist das Ergebniss am genauesten.

Der Vorteil: Es fließen alle Messdaten über den Zeitinterval in die 
Berechnung ein. Der Anteil des Rauschens nimmt also mit steigendem 
Zeitintervall ab.

Nachteil: Wenn Dein Sinus nicht sauber ist, dann wird das Ergebnis 
ungenau. Die anderen Verfahren haben da aber auch Probleme.

von Detlef _. (detlef_a)


Lesenswert?

Sehr interessante Diskussion.

Nichtlineare Optimierung ist für Sinusfit nicht nötig.

Das geht mit einem linearen Verfahren so:

Beitrag "Frequenz, Amplitude und Phase eines Sinussignals bestimmen"


Cheers
Detlef

von Raymund Hofmann (Gast)


Lesenswert?

Ein filter f für samples s nehmen der bei der messfrequenz exakt 90° 
phase verschiebt und verstärkung 1 hat. Dann über gewünschte zahl von 
samples mittelwert sqrt(s**2+f**2) bilden.

Ist genau für jede zahl von samples, IQ oder DFT bräuchte zeitfenster 
sowie rechen-, und implementierungsaufwand ist gering.

von Helmut S. (helmuts)


Lesenswert?

Ein Sinusfit funktioniert eher nicht wie bisher vorgeschlagen, da die 
Signalfrequnz nicht exakt 1000Hz ist und ebenso ist die Abtastfrequenz 
nicht exakt 2300Hz. Da müsste man als erstes die Zahl der Signalperioden 
mit den abgetasteten Werten bestimmen um die exakte Signalfrequenz 
bezogen auf die Abtastfrequenz zu bestimmen.

Beispiel:
fsignal 1000,05Hz
Fabtast 2299,95Hz

Das führt über 10000 Perioden des Signals zu einem kontinuierlichen 
Versatz bis zu 1 Periodendauer am Ende des Intervalls.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Helmut S. schrieb:
> Ein Sinusfit funktioniert eher nicht wie bisher vorgeschlagen, da die
> Signalfrequnz nicht exakt 1000Hz ist und ebenso ist die Abtastfrequenz
> nicht exakt 2300Hz ...
>
> Beispiel:
> fsignal 1000,05Hz
> Fabtast 2299,95Hz
>
> Das führt über 10000 Perioden des Signals zu einem kontinuierlichen
> Versatz bis zu 1 Periodendauer am Ende des Intervalls.

Wenn man den Abtastzeitraum so lang macht (im Beispiel 10s oder 23000
Samples), dass das Signal am Ende um eine volle Periode daneben liegt,
ist das Ergebnis in der Tat unbrauchbar.

Verkürzt man den Abtastzeitraum auf 1/10, was einen Versatz der letzten
Periode von immer noch 1/10 Periode bedeutet, liegt der Amplitudenfehler
unterhalb von 1%. Ist das Signal nicht übermäßig verrauscht, genügt auch
schon eine Abtastung über 100 Perioden (das sind 230 Samples) reduziert
sich der Fehler auf 0,01-0,03% (je nach Phasenlage des Signals). Hab's
gerade getestet.

Wenn die Frequenzabweichungen größer sind, kann die Frequenz halt nicht
mehr als bekannt angenommen werden und muss deswegen durch das Fitting
mitbestimmt werden (s. Beitrag von Detlef).

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Einen Vorschlag haett' ich auch noch, der hat aber wohl auch sicher 
aehnliche Genauigkeitsprobleme, wenn Samplezeitraum/frequenz und 
Signalfrequenz "bloed" sind:
Wenn man davon ausgehen kann, dass das Signal ein rauschfreier Sinus 
sein soll, dann wuerd' ich einfach den Effektivwert des Signals messen 
und daraus die Amplitude bestimmen: also jedes Sample quadrieren, aus 
allen Quadraten den arithm. Mittelwert bilden, den dann verdoppeln 
(Effektivwert vs. Amplitude) und einmal die Wurzel draus ziehen. 
Fertsch.

Gruss
WK

von Nils Pipenbrinck (Gast)


Lesenswert?

Ich sag es nochmal: Hilbert Transformation, kommt auch mit ungünstigen 
Verhältnissen klar.

von Martin O. (ossi-2)


Lesenswert?

Man könnte auch zwischen Abtastwerten interpolieren, wie beim 
Abtasttheorem normal unter "Rekonstruktion" beschrieben. Damit kann man 
dann das Maximum erwischen, auch wenn es zwischen Abtastwerten liegt. 
Ich würde zur Rekonstruktion ein paar zig Abtastwerte heranziehen und 
mir das graphisch mal ansehen.

von Bernd K. (prof7bit)


Lesenswert?

Nils Pipenbrinck schrieb:
> Das
> erzeugt Dir aus deinen gemessenen Daten ein um 90° verschobenes Signal.
> Das kannst Du dann direkt als IQ Signal verwenden.
>
> Die Hilbert Transformation kannst du per FFT erzeugen.

Wenn er eine FFT macht fällt das Ergebnis (I und Q) doch direkt unten 
raus, wozu musst Du da noch den Hilbert bemühen?

von Raymund Hofmann (Gast)


Lesenswert?

Bernd K. schrieb:
> Wenn er eine FFT macht fällt das Ergebnis (I und Q) doch direkt unten
> raus, wozu musst Du da noch den Hilbert bemühen?

Nein, zur passablen Annäherung braucht man ein Fenster im Zeitbereich 
und dann eine Summe der Beträge der Frequenzbins um die Messfrequenz 
herum.

Eine DFT analysiert in Frequenzbins von 0/n(dc), 1/n, 2/n ... (N-1)/n 
"negative frequenzen", was nicht exakt in eine bin fällt, verteilt sich 
über einen evtl. sehr großen bereich darum.

Um das zu kontrollieren multipliziert man im Zeitbreich mit einem 
Fenster.

Auch dann muss wie gesagt ein Summe über ein paar Frequenzbins gemacht 
werden um sich anzunähern.

Goertzel hat die gleiche Problematik.

Hilbert ist in dem Sinne besser weil die Fenster und bin-summierung 
entfällt. Jedoch würde man es mit einer DFT realisieren, läuft man in 
eine ähnliche Problematik des spektralen Aliasings, ist also 
unpraktikabel.

Die Hilberttransformation wäre hier besser mit einem FIR Filter zu 
realisieren.

Die Anzahl an Taps bestimmt wie genau es sich annähert und wie breit das 
nutzbare Frequenzband des Transformators nach unten ist.

Dann ist die Lösung in der Tat recht universell, von einer unteren 
Grenzfrequenz des Transformators bis in Nyquistnähe.

Natürlich hat der Transformator eine Verzögerung und das FIR muss erst 
mal mit Samples gefüllt sein bevor die Messung beginnen kann.

Rauschen spektral ausserhalb der Messfrequenz jedoch addiert sich zum 
Amplitudenmesswert und macht die in diesem Fall trivial mögliche 
Mittelung der Amplitudenmesswerte ab einer gewissen Zahl sinnlos.

Eine etwas einfachere Lösung wäre den Hilbert Transformator durch ein 
Filter zu ersetzen dass bei der Messfrequenz genau die Phase um 90 Grad 
verschiebt. Etwas einfacher zu realisieren, jedoch nicht mehr 
breitbandig.

Wenn ich mehr Genauigkeit und Robustheit gegen Rauschen wollte dann 
würde ich es mit einer PLL realisieren.

Die PLL entsprechend schmalbandig ausgelegt lockt auf die Messfrequenz, 
ein  NCO liefert IQ, mit signal multiplizieren, Phasenvergleicher, 
Schleifenfilter auf NCO rückkoppeln, tiefpassfiltern und daraus 
Amplitude berechnen.
Tiefpassfiltern bestimmt die Bandbreite des mitlaufenden Filters und 
damit wie gut Rauschen aus dem Messergebnis raus bleibt.

Aufwand wohl weniger als die Hilbert-Transformator Lösung, jedoch eine 
gewisse Einschwingzeit für die PLL und das Tiefpassfilter.
Evtl. eine Adaptivität im Schleifenfilter um schnell und sicher lock der 
pll in breitem Frequenzbereich zu bekommen.

von Sven B. (scummos)


Lesenswert?

Raymund Hofmann schrieb:
> Eine DFT analysiert in Frequenzbins von 0/n(dc), 1/n, 2/n ... (N-1)/n
> "negative frequenzen", was nicht exakt in eine bin fällt, verteilt sich
> über einen evtl. sehr großen bereich darum.

Hmm, das ist schon richtig, aber nichtsdestotrotz gehen ja dabei keine 
Informationen verloren. Ich denke ja immer noch, eine Parabel mit drei 
Punkten an das Maximum der FFT dranrechnen ist eine ziemlich exakte und 
robuste Methode.

von Sigi (Gast)


Lesenswert?

Interesantes Problem, hatte leider erst jetzt die Zeit
gefunden, es nachzurechnen/zu lösen.

Am vielversprechenstens ist die QI-Lösung von Yalu
(bzgl. Rechenzeit/Aufwand und Genauigkeit),
die man mithilfe angewandter Mathematik noch wesentlich
verbessern kann, siehe z.B. folgendes Buch:

https://books.google.de/books/about/Best_Approximation_in_Inner_Product_Spac.html?id=XFoWaDq6_mYC&redir_esc=y

z.B. Problem 1 (Seite 1) und deren Lösung (Seite 61)
und einige Ergänzungen (nicht direkt im Buch erwähnt)
führt zu folgender Beschreibung (ob Polynome oder
Sinus-Funktionen spielt überhaupt keine Rolle):

Vektor v   = [sample_1,..,sample_n]
Vektor v_s = [sin(w_1),sin(w_2),..,sin(w_n)]
Vektor v_c = [cos(w_1),cos(w_2),..,cos(w_n)]

Matrix M = [v_s,v_c]

mit MI = invert(transpose(M)*M)*transpose(M)
(*:MatrixMult, MI:von einigen Autoren Pseudoinverse
genannt) erhält man:

v_p = MI*v

v_p ist der Parameter-Vektor, der das Signal v
am besten approximiert (least-square):

v_ba = v_p[0]*sin(w) + v_p[1]*cos(w)

Die Amplitude ist damit:

a = sqrt(v_p[0]^2 + v_p[1]^2)

Die Matrix M bzw. MI muss nur einmal berechnet werden.
Fär das Ergebnis (d.h. a) muss dabei keine ganze Periode
gesampelt werden, es funktioniert für jeden Bereich
sehr gut, eine genauere Analyse ergibt aber, das mindestens
eine Periode gesampelt werden sollte, bei dem ungünstigen
und kleinen Verhältnis 2300/1000 sollten es aber möglichst
viele Perioden bzw. Anzahl Samples > eine Periode sein.

Probiert man ein wenig rum, dann erkennt man eine sehr
günstige Abhängigkeit von Rauschen, Anzahl Samples
und Periode (meisst linear).

Bem. zur QI-Methode: für eine ganzzahlige Periode an
Samples ergibt sich aus die Matrix invert(transpose(M)*M)
die Lösung von Yalü.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Sigi schrieb:
> Vektor v   = [sample_1,..,sample_n]
> Vektor v_s = [sin(w_1),sin(w_2),..,sin(w_n)]
> Vektor v_c = [cos(w_1),cos(w_2),..,cos(w_n)]
>
> Matrix M = [v_s,v_c]
>
> mit MI = invert(transpose(M)*M)*transpose(M)
> (*:MatrixMult, MI:von einigen Autoren Pseudoinverse
> genannt) erhält man:
>
> v_p = MI*v

Das ist doch genau dieses:

Egon D. schrieb:
> Die Ausgleichsrechnung (Fehlerquadrat-Methode nach Gauss)

Yalu X. schrieb:
> Ich habe das Gauß-Verfahren mal durchgerechnet mit folgendem Ergebnis:
> ...

Leider war ich zu faul, den Weg zu diesem Ergebnis zu aufzuschreiben,
was du jetzt nachgeholt hast. So kann der TE die dahinterliegende
Mathematik besser nachvollziehen.

von Sigi (Gast)


Lesenswert?

Yalu X. schrieb:
> Das ist doch genau dieses:
>
> Egon D. schrieb:
>> Die Ausgleichsrechnung (Fehlerquadrat-Methode nach Gauss)

Ja und Nein: so wie ich es hingeschrieben habe,
hast du natürlich recht, aber allgemeiner muss
man ja nicht den Standard-L2-Raum verwenden.
Nimmt man gewichtete Normen (um einige Wertebereiche
zu betonen, andere zu "schwächen"), dann kann
man evtl. noch mehr Informationen rausholen bzw.
mehr Genauigkeit erzielen. Das wird auch im Buch
beschrieben.

von Sigi (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe noch zum konkreten Problem eine
Simulation durchgeführt. Die X-Achse
zeigt die Sekunden (*2300 = Anz. Samples),
die Y-Achse zeigt die absollute Abweichung
von der tatsächlichen Amplitude (hier 1).
Dem Signal wurde noch gausches Rauschen
hinzuaddiert (Sigma=0.01). Der Fehler
ist prop. zu 1/sec^2.

0.25 Sekunden (d.h. ca. 500 Samples)
ergeben einen Fehler von 2*Sigma,
1.0 Sekunden einen Fehler von etwas
weniger als Sigma.

von Berndel (Gast)


Lesenswert?

Sigi schrieb:
> gausches

Gaußsches Rauschen nehme ich an, ist gemeint. Ist das relevant für 
diesen Fall? Ich hätte eher 1/f-Rauschen angesetzt.

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.