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.
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.
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.
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.
@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.
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?
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.
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.
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.
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?
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.
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.
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.
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.
@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.
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.
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.
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.
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.
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.
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.
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.
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
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.
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.
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.
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).
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
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.
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?
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.
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.
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ü.
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.
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.
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.