Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Lineare Interpolation (https://www.delphipraxis.net/50013-lineare-interpolation.html)

Six 19. Jul 2005 17:58


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:
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)
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.

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

marabu 19. Jul 2005 19:03

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

Six 19. Jul 2005 19:11

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

Mystic 19. Jul 2005 19:25

Re: Lineare Interpolation
 
Vielleicht hilft das ja weiter:
http://de.wikipedia.org/wiki/Arithmetische_Reihe
http://de.wikipedia.org/wiki/Arithmetische_Folge

mschaefer 19. Jul 2005 19:42

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

Mystic 19. Jul 2005 20:08

Re: Lineare Interpolation
 
Zitat:

Zitat von mschaefer
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 101.

Das ist ein schwarzer Balken zuviel. ;)

Six 19. Jul 2005 20:18

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

marabu 19. Jul 2005 20:25

Re: Lineare Interpolation
 
Hallo Six,

Zitat:

Zitat von Six
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

verstehe mich nicht falsch, aber WO hast du die allgemeine Hochschulreife erworben? Sind Folgen und Reihen kein Stoff der Klassen 11 bis 13?

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...

Six 19. Jul 2005 20:33

Re: Lineare Interpolation
 
Hi marabu,

Zitat:

verstehe mich nicht falsch, aber WO hast du die allgemeine Hochschulreife erworben? Sind Folgen und Reihen kein Stoff der Klassen 11 bis 13?
Nein, du hast schon recht, als ich's mir gerade bei Wiki angesehen habe fiel's mir dann auch wie Schuppen von den Augen, allein schon wegen der vollständigen Induktion (hatte sogar mathe LK :oops: ). Ich konnte einfach in dem Zusammenhang nichts damit anfangen und ehrlich gesagt, jetzt wo ich wieder weiß was es ist (ist ja eigentlich ne ganz selbstverständliche Sache) hilft mir das auch nicht viel weiter...

Delphi-Quellcode:
So ein Mist - jetzt hast du die Grafik rausgeredet - das hätte spannend werden können...
Wieso denn eigentlich, die Grafik war doch bereits (Stümperhaft) realisiert :zwinker:
Es ging halt nur um ne art Vorschau...

Tja, dann warten wir mal....

lg

Six

mschaefer 20. Jul 2005 12:55

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 05:36 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz