Seite 1 von 1
Werte harmonisch interpolieren
Verfasst: Dienstag 15. Dezember 2009, 18:52
von py_lo
Hallo,
ich bin hier gerade am leichten verzweifeln da mich mein Mathematikverstand hier wieder völlig im Stich lässt...
(mann könnte auch sagen bin zu blöd dafür

)
Ich habe also einen 31Band software EQ und möchte aber nur
8 Frequenzbänder einstellen. Die Frequenzen dazwischen muss ich
natürlich angleichen.
Linear ist es ja kein Problem - ich möchte aber gerne das sich eine
harmonische Sinusartige kurve ergiebt.
(wenns zu komliziert wird lasse ich es linear)
Nur um mal ausgedachte Werte in den Raum zu werfen:
(1.0 = +- 0dB )
Also vereinfacht:
17.0 : 1.0 : 1.0: 12.0 : 1.0 : 1.0 : 5.0 : 1.0 : 1.0 : 10.0 usw...
Linear (logo):
17.0 : 15.3 : 13.6 : 12.0 usw....
Aber wie ist denn der andere Ansatz?
Verfasst: Dienstag 15. Dezember 2009, 19:13
von Darii
Was ist denn jetzt dein konkretes Problem? Ist dir klar, dass die db-Skala selbst nicht linear ist?
Verfasst: Dienstag 15. Dezember 2009, 19:24
von py_lo
ja is mir klar... vergiß einfach die db - Angabe.
Mein Problem vielleicht etwas allgemeiner:
Ich habe ein x/y Koordinatensystem auf dem ich ein paar Punkte
eingetragen habe und möchte ein paar Zwischenwerte haben.
Nun möchte ich nicht einfach -bildlich gesprochen eine gerade linie zwischen diesen Punkten ziehen
sondern das ganze so verbinden als ob ich ein Kurvenlineal angesetzt habe.
Nutzen wollt ich es halt für den EQ, allerdings interessiert mich das ganze
auch einfach...
Verständlicher?
Verfasst: Dienstag 15. Dezember 2009, 19:50
von Darii
So würde es gehen
(f2-f1)*(sin(x-pi/2)+1)
mit f2 linker Frequenz, f1 rechter, x = pi/3 für 1. Mittenfrequenz, x=2pi/3 für 2. Frequenz.
Verfasst: Dienstag 15. Dezember 2009, 20:01
von py_lo
uiii super danke, dann werd ichs mal testen...
Verfasst: Dienstag 15. Dezember 2009, 21:17
von CM
Ich verstehe nicht, wie das die Fragestellung beantwortet. *kopfkratz* Für mich klang die ganz nach gewöhnlicher Interpolation (wozu man scipy.signal nehmen kann). Kann mir jemand sagen, wie die Fragestellung besser zu verstehen ist? (bin neugierig)
Gruß,
Christian
Verfasst: Dienstag 15. Dezember 2009, 21:37
von HWK
Ob der Sinus so schön ist? Du könntest ja mit numpy.polyfit ein Polynom durch die 8 Punkte berechnen. Mit numpy.poly1d erhälst Du dann die Werte in den Zwischenräumen auf dem Polynom.
MfG
HWK
Verfasst: Dienstag 15. Dezember 2009, 21:49
von py_lo
Ich verstehe nicht, wie das die Fragestellung beantwortet.
Da bin ich mir auch noch nicht sicher... scipy.signal - interessant aber
da schnall ich ja erst recht ab.
Ich will einfach nur die (*) Punkte mit ner harmonischen Kurve verbinden
und jeden belieben Punkt ermitteln können.
(. musste ich nehmen damit die Formatierung funktioniert.)
- mach gerade etwas Nachhilfe in Mathe
Also nur um deine Frage nochmal zu beantworten.
Polynom? Wenn ich mir die funktion anschaue - dann muss ich wohl
noch viel nachlesen bis ichs kapiert habe.
@HWK: Hast Du da ein kurzes Beispiel?
|
|......*
|.......................*
|................*
|----------------------
|
|.........*
|
|
|*
Verfasst: Dienstag 15. Dezember 2009, 21:52
von Darii
HWK hat geschrieben:Ob der Sinus so schön ist? Du könntest ja mit numpy.polyfit ein Polynom durch die 8 Punkte berechnen. Mit numpy.poly1d erhälst Du dann die Werte in den Zwischenräumen auf dem Polynom.
Wieso mit Kanonen auf Spatzen schießen? Für die zwei Punkte auf einer definierten Funktion muss ich nichts fitten, das kann man einfach ausrechnen. Und erst recht nicht brauche ich dafür eine zusätzliche Abhängigkeit in Form von numpy oder scipy.
Und selbstverständlich hab ich mich dabei auch vertan:
Verfasst: Dienstag 15. Dezember 2009, 22:08
von py_lo
Das erklärt die komischen negativen Werte, thx.
Verfasst: Dienstag 15. Dezember 2009, 22:17
von HWK
Man müsste halt einmal ausprobieren, welche Variante bessere Ergebnisse liefert. Hier ein Beispiel zu den anfangs ausgedachten Werten:
Code: Alles auswählen
>>> from numpy import *
>>> x = array([0, 3, 6, 9])
>>> y = array([17, 12, 5, 10])
>>> z = polyfit(x, y, 3)
>>> p = poly1d(z)
>>> p([1, 2, 4, 5, 7, 8])
array([ 16.41975309, 14.58024691, 9.19753086, 6.69135802,
4.64197531, 6.13580247])
MfG
HWK
Verfasst: Dienstag 15. Dezember 2009, 22:21
von py_lo
Ja, Danke werd ich testen...
Verfasst: Dienstag 15. Dezember 2009, 22:52
von py_lo
In diesem Fall hat Darii recht, langt völlig (für meine Zwecke).
Thema Erledigt - Danke nochmal.
Bin Happy!

Verfasst: Mittwoch 16. Dezember 2009, 01:10
von Darii
HWK hat geschrieben:Man müsste halt einmal ausprobieren, welche Variante bessere Ergebnisse liefert.
Warum sollte ein *Fit* mir irgendeinem dahergelaufenen Polynom bessere Ergebnisse liefern, als die exakte Lösung? Sorry, aber für das Bedürfnis irgendwas fitten zu wollen, was man auch einfach ausrechnen kann fehlt mir das Verständnis. Das kostet doch auch Rechenzeit...
Verfasst: Mittwoch 16. Dezember 2009, 09:13
von CM
Na ja, wenn es eine analytische Lösung gibt, klar, dann kann mans einfach berechnen. Aber bei "echten" Signalen, gibt es u. U. nur eine numerische Lösung. In diese Richtung zielte meine Frage. Dann nämlich muß man sich die Daten näher anschauen und auch wissen welche (physikalischen) Bedingungen herrschen. Sonst nämlich kann eine schöne und schnelle Lösung auch eine falsche sein.
Wie auch immer, wenn die Frage mit Deiner Antwort, Darii, beantwortet ist, ist ja alles in Butter.
Gruß,
Christian
Verfasst: Mittwoch 16. Dezember 2009, 12:58
von HWK
Darii hat geschrieben:Warum sollte ein *Fit* mir irgendeinem dahergelaufenen Polynom bessere Ergebnisse liefern, als die exakte Lösung? Sorry, aber für das Bedürfnis irgendwas fitten zu wollen, was man auch einfach ausrechnen kann fehlt mir das Verständnis. Das kostet doch auch Rechenzeit...
Ebenfalls sorry, aber für diese Überheblichkeit fehlt mir auch das Verständnis. Wie kommst Du darauf, dass der Sinus die exakte Interpolation zwischen zwei Frequenzen sein muss? Selbst, wenn dem so wäre, dann solltest Du nicht unnötig das math-Modul laden und Rechenzeit vergeuden, sondern die beiden Zwischenpunkte einfach so berechnen:
Code: Alles auswählen
dy = y2 - y1
y1_1 = y1 + 0.25 * dy
y1_2 = y1 + 0.75 * dy
MfG
HWK
Verfasst: Donnerstag 17. Dezember 2009, 10:01
von Darii
HWK hat geschrieben:Wie kommst Du darauf, dass der Sinus die exakte Interpolation zwischen zwei Frequenzen sein muss?
Weil der Threadstarter das so wollte?
Selbst, wenn dem so wäre, dann solltest Du nicht unnötig das math-Modul laden und Rechenzeit vergeuden, sondern die beiden Zwischenpunkte einfach so berechnen:
Code: Alles auswählen
dy = y2 - y1
y1_1 = y1 + 0.25 * dy
y1_2 = y1 + 0.75 * dy
MfG
HWK
Wunderbar, das reicht doch.