Hi Holger,
das nenn ich clever und danke für die Mühe allerdings ist mein Level weit unter Deinem.
Wenn ich das richtig verstehe, ist die erste Schleife dafür da, Nullstellen und Amplituden zu sammeln und „irgendwo“ abzulegen. Die Nullstellen werden wohl durch a repräsentiert, wobei mir nicht ganz klar ist warum mit a = -1 gestartet wird. Woher „weiß“ Last_n was eine potentielle Nullstelle ist, wo wurde festgelegt was Last_n ist? Ganz wichtig: Der Minimalabstand soll zwingend vom Benutzer festgelegt werden, ist meine Idee mit der InputBox korrekt?:
Null_min = Application.InputBox("Minimalabstand (Zeilenanzahl) der Nullstellen angeben", Type:=1)
In der zweiten Schleife werden dann die Werte ausgelesen und die Amplituden je Periode summiert? Warum wird für die Bestimmung der Periodenlänge frq1() und frq()benötigt?
Die Tabellenfunktion bildet dann den Mittelwert der in Schleife 2 ermittelten Werte und gibt diesen in der MsgBox aus? Die Standardabweichung mit anzugeben ist eine Spitzenidee.
Was ich zwingend benötige, ist eine Kontrollmöglichkeit der Werte. Darum möchte ich Nullstellen, positive wie negative Amplituden chronologisch in einer extra Tabelle mit den dazugehörigen Argumenten ablegen. Kann ich diese einfach aus der ersten Schleife beziehen und wenn ja wie?
Ich würde mich freuen, nochmal von Dir zu hören. So oder so, Du hast mir unglaublich geholfen.
Danke.
Leon
Holger schrieb am 15.07.2009 13:04:50:
Hallo Leon,
ich gehe davon aus, dass du die Argumente und Werte in verschiedenen Spalten hast, wobei zusammengehörende Argumente und Werte in einer Zeile stehen. Da deine Werte leicht schwanken, kann es vorkommen, das sie um eine Nullstelle schwanken. Ich habe deshalb eine Schranke für Mindestabstände von Nullstellen eingesetzt, um solche Ereignisse herauszufiltern. Für die Amplitude berechne ich Mittelwert und Standardabweichung der Differenzen aufeinander folgender Extrema, für die Periodenlänge entsprechend mit den doppelten Differenzen der Argumente aufeinander folgender Nullstellen und Extrema.
Sub Amplitude_Periodenlänge()
a = -1
ReDim n(0), ex(1, 0)
Sp1 = 1 'Spalte mit den Argumenten (Zeitpunkten???)
Sp2 = 2 'Spalte mit den Sinus-Werten
Null_min = 3 'Minimalabstand der Zeilen für Nullstellen
For i = 2 To Cells(Rows.Count, Sp2).End(xlUp).Row
If (Sgn(Cells(i - 1, Sp2)) <> Sgn(Cells(i, Sp2))) Or (Cells(i - 1, Sp2) = 0) Then 'potenzielle Nullstelle
If i - Last_n > Null_min Then 'verhindert Auswertung von Schwankungen um 0
a = a + 1
ReDim Preserve n(a), ex(1, a)
n(a) = Cells(i - 1, Sp1) 'Argument der Nullstelle
ex(0, a) = X 'Argument des Extremums
ex(1, a) = m 'Wert des Extremums
m = 0 'Ausgangswert Max/Min
Last_n = i
End If
End If
If Cells(i, Sp2) > 0 Then 'Maximum suchen
If Cells(i, Sp2) > m Then m = Cells(i, Sp2): X = Cells(i, Sp1)
Else 'Minimum suchen
If Cells(i, Sp2) < m Then m = Cells(i, Sp2): X = Cells(i, Sp1)
End If
Next i
ReDim amp(a), frq(a), frq1(a)
For i = 0 To a - 1
amp(i) = Abs(ex(1, i) - ex(1, i + 1))
frq1(i) = 2*Abs(ex(0, i) - ex(0, i + 1))
frq(i) = 2*Abs(n(i) - n(i + 1))
Next i
With WorksheetFunction
MsgBox ("Amplitude: " + CStr(.Average(amp())) + " ± " + CStr(.StDevP(amp())) + vbCrLf + _
"Periodenlänge: " + CStr(.Average(frq(), frq1())) + " ± " + CStr(.StDevP(frq(), frq1())))
End With
End Sub
Gruß
Holger
Leon schrieb am 14.07.2009 14:09:57:
Hi,
ich bin auf der Suche nach einem Makro, mit dem ich aus einer sinusförmigen Funktion die Amplituden und die Frequenz auslesen kann. Ich bin hier im Forum auch schon fündig geworden (Beitrag vom 17.06.2009).
Wenn ich das richtig verstehe, werden dort mit der Sgn-Funktion lokale Maxima/Minima bestimmt. Da ich mit realen Messwerten arbeite, entspricht das nicht ganz meinen Anforderungen, da diese um den idealen Verlauf schwanken und ich somit permanent lokale Extrema produziere.
Beim Versuch das Problem mit Applikation.WorksheetFunktion.Max/Min zu lösen, erhalte ich immer nur ein Maximum je Messreihe. Ich benötige aber das Maximum/Minimum je halbe Periode.
Ich sehe 3 Möglichkeiten das Problem zu lösen:
1.Eine Funktion die Amplitude/Frequenz aus Sinusfunktionen extrahieren kann (ist mir in Excel nicht bekannt)
2.Bestimmung des globalen Maximums/Minimums zwischen 2 Nullstellen.
3.Vergrößerung der Umgebung um den Wert
Leider habe ich keine Ahnung wie, ihr vielleicht?
Danke
Leon
|