![]() |
Lineare Interpolation
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo!
Also es geht um lineare Interpolation (zumindest glaube ich das :gruebel: ). Ich zerbreche mir über das Problem nun schon seit längerer Zeit den Kopf und finde es eigentlich beschähment, nicht selber auf die Lösung zu kommen, aber was solls. Ich hoffe ihr könnt mir weiterhelfen. Mein Problem: Ich möchte sowas wie in Bild 1 hinbekommen (Anhang). Ihr seht dort einen Ausschnitt aus einem Audioprogramm. Es geht aber eigentlich nur um die Abstände und Länge der Balken. Wie ihr seht, werden die Balken und deren Abstände untereinander immer schmaler und genau so etwas versuche ich zu programmieren. Es gibt als Vorgabe also nur eine Anfangsfrequenz (im Beispiel 5 Hz) und eine Endfrequenz (im Beispiel 20 Hz), sowie eine beliebige Zeitvorgabe. Nun soll zwischen den beiden Werten, wie gezeigt interpoliert werden. Auch soll es absteigend möglich sein, also z.B. von 20 Hz auf 10 Hz und gleichbleibend (also für eine gewisse Zeit 5 Hz, dann wieder ansteigen auf 10 Hz absteigen auf 2 Hz etc.). Was mir bislang gelungen ist, seht ihr in Bild zwei. Leider stimmen die Abstände in manchen Fällen nicht, wie zum Beispiel der dünne Streifen in der Mitte oder auch die beiden rechten Streifen. Ich glaube übrigens nicht, das dies an der "Auflösung" liegt. Hier ist der zuständige Sourcecode:
Delphi-Quellcode:
Ich hoffe das ganze ist einigermaßen verständlich. Es wird quasi erst eine Tabelle mit den Werten erstellt und "An" und "Aus" bedeutet dann eben Balken zeichnen oder nicht.
procedure TForm1.XYZTest(P1x, P1y, P2x, P2y: integer);
var GesamtzahlEinheiten, AbstandAnfang, AktuellerAbstand, AnzahlDurchlaeufe: integer; Steigung, m: double; i, n: integer; begin Steigung := ABS((P2y - P1y) / (P2x - P1x)); AbstandAnfang := P1y; AktuellerAbstand := AbstandAnfang; for i := P1x to P2x do begin if i mod AktuellerAbstand = 0 then begin JvStringGrid2.Cells[1, Tabellenzeiger] := IntToStr(i); if Aus then JvStringGrid2.Cells[0, Tabellenzeiger] := 'Aus' else JvStringGrid2.Cells[0, Tabellenzeiger] := 'An'; JvStringGrid2.InsertRow(JvStringGrid2.RowCount + 1); Aus := not Aus; n := Round(P1y - (Steigung * P1x)); m := Steigung; AktuellerAbstand := Round(m * i + n); Inc(Tabellenzeiger); end; end; // Tabelle Umsetzen JvStringGrid2.RemoveRow(JvStringGrid2.RowCount - 1); for i := 1 to JvStringGrid2.RowCount do begin PaintBox1.Canvas.Brush.Color := clblack; PaintBox1.Canvas.Brush.Style := bssolid; if JvStringGrid2.Cells[0, i] = 'An' then PaintBox1.Canvas.Rectangle(StrToInt(JvStringGrid2.Cells[1, i - 1]), 0, StrToInt(JvStringGrid2.Cells[1, i]), PaintBox1.Height); end; end; // XYZ (TForm1) das sieht dann z.B. so aus: An 0 Aus 10 An 20 Aus 29 An 38 usw. Diese Tabelle wird dann in die Zeichnung auf der Paintbox umgesetzt (Das geschieht alles nur zu Testzwecken, daher ist der Code auch noch unsauber, unschön etc. :wink: ). Aufgerufen wurde das ganze für das Beispiel hiermit: procedure TForm1.Button7Click(Sender: TObject); begin TabellenZeiger := 0; Aus := False; XYZTest(0, 5, 250, 10); end; Also, wie ihr seht versuche ich das ganze mit Hilfe einer Linearen Funktion zu lösen. Aufgrund der Aussetzer (wie oben beschrieben) bezweifele ich allerdings mittlerweile, das dies der Richtige Weg ist. Auch wenn ich die Richtung ändere, also beispielsweise von 10 auf 5 Hz RUNTER möchte, produziert die Funktion nur undefinierbaren "Müll". Das Problem ließe sich zwar mit einer anfänglichen Abfrage lösen, aber wie gesagt, ich bin überhaupt im Zweifel und vielleicht besteht ja auch nur ein klitzekleiner Fehler, etwas, dass ich übersehen habe... Ich hoffe ihr versteht mein Problem. Wäre toll, wenn ihr mir helfen könntet :thumb: Six |
Re: Lineare Interpolation
Hallo Six,
du möchtest die Ein- und Ausschaltzeitpunkte für ein Signal mit linear gleitender Schaltfrequenz berechnen? Ich erwarte da ein festes Verhältnis von Ton- zu Pausendauer. Das Zeitfenster für einen Ton samt zugehöriger Pause ist der Kehrwert der Signalfrequenz. Die Zeitfenster bilden dann eine arithmetische Folge (nur bei linearem Gleiten, sonst eine geometrische). Über die allgemeine Summenformel für arithmetische Reihen sollte sich das Delta berechnen lassen. Damit kannst du dann das Zeitfenster für jedes Signal angeben und durch das Pausenverhältnis kannst du die exakten Schaltzeiten bestimmen. Vergib mir, wenn ich Blödsinn verzapfe, aber meine Mathematik-Kenntnisse stammen aus grauer Vorzeit... Grüße vom marabu |
Re: Lineare Interpolation
Hi marabu,
danke für deine Hilfe, aber leider verstehe ich hier nur Bahnhof, ich bin Schüler und habe gerade mein Abitur gemacht, deswegen verzeihe mir bitte, dass ich Dinge wie: "lineare Gleiter", "arithmetische/geometrische Folge" oder "allgemeine Summenformel" noch nie gehört habe :? Könntest du mir das vielleicht ein wenig genauer erklären? Danke schonmal im Vorraus! lg Six |
Re: Lineare Interpolation
Vielleicht hilft das ja weiter:
![]() ![]() |
Re: Lineare Interpolation
Moin zusammen,
würde das mal in zwei einzelne Aufgaben zerlegen. 1. Funktion die bei einer gegebenen Freuqenz diese Frequenz zeichnet. Da die Frezenz in Hz angegeben ist, und 1 Hz = "1 Schwingung pro Sekunde" ist so ist ein 1Hz ein schwarzer Balken/weißer Balken /schwarzer Balken pro Sekunde: oder in Zahlen 10. Für das grafikgelumpse habe ich noch nie viel übergehabt, das mag mal jemand anderes programmieren.... 2. Funktion die drei Werte von Dir bekommt Wert 1: Startfrequenz Wert 2: Endfrequenz Wert 3: Zeitschrittweite (in Sekunden/Minuten) (in welcher Zeit muß von Freuq. 1 zu Frequ. 2 gewechselt sein?) Zunächst mal soweit, den jetzt kommt "Adelheid und ihre Mörder" und danach kommen wir dann zur Auflösung.... Grüße // Martin /Edit: Thanks Mystik ! /Edit |
Re: Lineare Interpolation
Zitat:
|
Re: Lineare Interpolation
Hi mschefer,
das was du sagst (2) geht genau in die richtige Richtung :thumb: Das "Grafikgelumpse" ist im Grunde auch völlig egal, es diente mir nur dazu zu SEHEN, was ich da fabriziert habe. Die Prozedur um das am Ende in eine Soundfile umzuwandeln steht sowieso schon. Es geht eben nur darum diese Tabelle mit den Richtigen Werten zu füllen. Daraus entsteht dann am Ende das Soundfile. Dann bin ich mal gespannt auf die Auflösung. @ Mystik: Danke für die Links! Six |
Re: Lineare Interpolation
Hallo Six,
Zitat:
Du musst jetzt solange Geduld haben bis Evelyn Hamann und Tilo Prückner den Martin aus ihrem Bann entlassen, dann schauen wir uns gemeinsam an, was er so produziert (GRÜNE Balken, Martin, mit Bäuchen an den Flanken...) und dann sehen wir weiter. Heitere Grüße vom marabu So ein Mist - jetzt hast du die Grafik rausgeredet - das hätte spannend werden können... |
Re: Lineare Interpolation
Hi marabu,
Zitat:
Delphi-Quellcode:
Wieso denn eigentlich, die Grafik war doch bereits (Stümperhaft) realisiert :zwinker:
So ein Mist - jetzt hast du die Grafik rausgeredet - das hätte spannend werden können...
Es ging halt nur um ne art Vorschau... Tja, dann warten wir mal.... lg Six |
Re: Lineare Interpolation
Moin, zusammen,
wie gesagt die Graphic mit Canvas zeichnen, das mögen mal andere machen. Jetzt bezeiehe ich mich mal banal auf die Überschrift: lineare Interpolation! Gleich heisst es: Nein fürchterlich - so einfach?!!!! Was haben wir zwei Zeitpunkte Y1 und Y2. Dann haben wir zwei Hertzzahleb X1 und X2 plus Linearität: Mehr nicht! Linear ist eine Gerade und wir haben auf dieser jihuu zwei Punkte. Also: b + a*x = y ( "·" sind Tabulatorpunkte zum Einrücken) I: 1. Gleichung: b + Hertz(1) * a = Zeitpunkt(1) 2. Gleichung: b + Hertz(2) * a = Zeitpunkt(2) --------------------------------------------- 2-1: ( Hertz(2)-Hertz(1) ) * a = Zeitpunkt(2) - Zeitpunkt(1) II: Daraus basteln wir uns nun die Geradensteigung a (oft wird die auch gerne m genannt) ····· Zeitpunkt(2)-Zeitpunkt(1) a = ----------------------------- ····· Hertz(2) - Hertz(1) III: Fein das gefundene a stezen wir mal in Gleichung 2 ein ···················· Zeitpunkt(2)-Zeitpunkt(1) b + Hertz(2) * ----------------------------- = Zeitpunkt(2) ···················· Hertz(2) - Hertz(1) und lösen das nach b auf ································· Zeitpunkt(2)-Zeitpunkt(1) b = Zeitpunkt(2) - Hertz(2) * ----------------------------- ······························· Hertz(2) - Hertz(1) IV: Da uns nun a und b bekannt sind stellen wir die allgemeine Funktionsgleichung auf: ·y ·········= ································b················· ······· +········· a* x ············ ················································ Zeitpunkt(2)-Zeitpunkt(1)··· · Zeitpunkt(2)-Zeitpunkt(1) Zeitpunkt(y) = Zeitpunkt(2) - Hertz(2) * -------------------------- + ----------------------- * Hertz(x) ·············································· Hertz(2) - Hertz(1) ···········Hertz(2) - Hertz(1) etwas umstellen ·y ·········= ································a*x··············· ········· +········· b ············ ········································Zeitpunkt( 2)-Zeitpunkt(1)····· Hertz(2)*Zeitpunkt(1)- Hertz(1) * Zeitpunkt(2) Zeitpunkt(y) =··Hertz(x) * ----------------------------··+ ------------------------------------------------- ·······································Hertz(2) - Hertz(1)························ Hertz(2) - Hertz(1) ············· V: Man kann das natürlich auch nach der Hertzzahl umstellen (die Zwischenritte nich mit dieser Eingabeform..) ··································Hertz(1) - Hertz(2)·· Hertz(x) =·(··Hertz(2) * ----------------------------- * ( Zeitpunkt(2) - Zeitpunkt(x) ) ·······························Zeitpunkt(1)-Zeitpunkt(2) Also das ist das ganze linear. Das umsetzen in Pascal dürfte wohl kaum das Problem sein. Wenn es dann doch nicht mehr linear sein soll, sagt mal bescheid. PS: Liebe Admins: könnte man in die Eingabe Tabulatorsprünge einbauen? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz