AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Lineare Interpolation

Lineare Interpolation

Ein Thema von Six · begonnen am 19. Jul 2005 · letzter Beitrag vom 21. Jul 2005
Antwort Antwort
Seite 1 von 4  1 23     Letzte » 
Six

Registriert seit: 2. Jun 2005
42 Beiträge
 
#1

Lineare Interpolation

  Alt 19. Jul 2005, 18:58
Hallo!

Also es geht um lineare Interpolation (zumindest glaube ich das ).
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] = 'Anthen
      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. ).

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

Six
Miniaturansicht angehängter Grafiken
sound3_121.jpg   sound2_100.jpg  
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Lineare Interpolation

  Alt 19. Jul 2005, 20:03
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
  Mit Zitat antworten Zitat
Six

Registriert seit: 2. Jun 2005
42 Beiträge
 
#3

Re: Lineare Interpolation

  Alt 19. Jul 2005, 20:11
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
  Mit Zitat antworten Zitat
Benutzerbild von Mystic
Mystic

Registriert seit: 18. Okt 2003
Ort: Flerzheim
420 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Lineare Interpolation

  Alt 19. Jul 2005, 20:25
Vielleicht hilft das ja weiter:
http://de.wikipedia.org/wiki/Arithmetische_Reihe
http://de.wikipedia.org/wiki/Arithmetische_Folge
Jan Steffens
Der Fachwortgenerator - 100% Schwachsinn --- Der UPnP Router Manager - Kommentare erwünscht!
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.029 Beiträge
 
Delphi XE3 Enterprise
 
#5

Re: Lineare Interpolation

  Alt 19. Jul 2005, 20:42
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
Martin Schaefer
  Mit Zitat antworten Zitat
Benutzerbild von Mystic
Mystic

Registriert seit: 18. Okt 2003
Ort: Flerzheim
420 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Lineare Interpolation

  Alt 19. Jul 2005, 21:08
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.
Jan Steffens
Der Fachwortgenerator - 100% Schwachsinn --- Der UPnP Router Manager - Kommentare erwünscht!
  Mit Zitat antworten Zitat
Six

Registriert seit: 2. Jun 2005
42 Beiträge
 
#7

Re: Lineare Interpolation

  Alt 19. Jul 2005, 21:18
Hi mschefer,

das was du sagst (2) geht genau in die richtige Richtung

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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Lineare Interpolation

  Alt 19. Jul 2005, 21:25
Hallo Six,

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...
  Mit Zitat antworten Zitat
Six

Registriert seit: 2. Jun 2005
42 Beiträge
 
#9

Re: Lineare Interpolation

  Alt 19. Jul 2005, 21:33
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 ). 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...

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
Es ging halt nur um ne art Vorschau...

Tja, dann warten wir mal....

lg

Six
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.029 Beiträge
 
Delphi XE3 Enterprise
 
#10

Re: Lineare Interpolation

  Alt 20. Jul 2005, 13:55
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?
Martin Schaefer
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:24 Uhr.
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