AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Arrays skalieren/interpolieren

Ein Thema von aphexx · begonnen am 27. Nov 2010 · letzter Beitrag vom 28. Nov 2010
Antwort Antwort
aphexx

Registriert seit: 23. Apr 2010
19 Beiträge
 
#1

Arrays skalieren/interpolieren

  Alt 27. Nov 2010, 21:20
Hallo Leute!

Ich hab mal eine kleine Frage zum Thema Arrays (Floats),die ich gerne skalieren würde.
Also von Länge A auf Länge B bringen und dabei die Zwischenpunkte interpolieren.
Ich denke, dass man den Skalierungfaktor B/A braucht, aber wie geht es dann weiter?
Muss nichts Hochkompliziertes wie kubische Interpolation sein; ein kleiner Tipp/Link wär schon super.

Würde mich sehr über eine Antwort freuen!
  Mit Zitat antworten Zitat
Peter1999

Registriert seit: 13. Dez 2007
Ort: Dresden
88 Beiträge
 
Delphi XE2 Professional
 
#2

AW: Arrays skalieren/interpolieren

  Alt 27. Nov 2010, 22:05
Das einfachste wäre wohl eine lineare Interpolationsfunktion. Alternativ eignet sich auch ein Halbsinusübergang.
Das kommt aber auf den Verwendungszweck an: Akkustik, Audio, Betriebslasten, Messsignale (Dehnungen, Beschleunigungen, Kräfte) ???
Je nachdem, ob du die Abtastfrequenz erhöhst oder verringerst, musst du natürlich das Shannon-Theorem beachten, also ggf. zuvor einen FFT-Tiefpass anwenden.

Die Variante "ganz einfach" gibt es also nicht, wenn es physikalisch sinnvoll bleiben soll.

Viele Grüße,
Peter
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#3

AW: Arrays skalieren/interpolieren

  Alt 27. Nov 2010, 22:41
nur mal schnell hingeschludert
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TFarray=Array of Double;
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

Procedure Interpolate(src,dest:TFarray);
//20101127 by Thomas Wassermann
var
  i,a,b:Integer;
  vh,ivh:Double;
begin
  vh := high(src) / high(dest);
  for I := low(dest) to High(dest) do
      begin
      a := Trunc(i * vh);
      ivh := (i*vh) - Trunc(i * vh);
      b := a + 1;
      dest[i]:=(src[a] * (1-ivh)) + (src[b] * ivh) ;
      end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   a,b:TFarray;
   i:INteger;
begin
   SetLength(a,11);
   for I := 0 to High(a) do a[i]:=i;
   SetLength(b,21);
   Interpolate(a,b);
   Showmessage('a');// als Debuggerbrechpunkt
end;

end.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Peter1999

Registriert seit: 13. Dez 2007
Ort: Dresden
88 Beiträge
 
Delphi XE2 Professional
 
#4

AW: Arrays skalieren/interpolieren

  Alt 27. Nov 2010, 23:25
Das ist aber genau die Lösung, die nicht auf den Frequenzinhalt achtet und damit logischerweise die Spiegelfrequenzen nicht erfasst.
Physikalisch kann hier also totaler Unsinn entstehen!!
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#5

AW: Arrays skalieren/interpolieren

  Alt 27. Nov 2010, 23:33
@Peter1999

Da der Threadersteller nicht geschrieben hat wofür er es benötigt, wollte ich einfach mal einen Ball ins Spiel bringen. Für grafische Darstellungen würde o.g. verwendbare Ergebnisse liefern.

Bei den von Dir angeschnittenen Themen kann ich ohnehin nicht mitreden.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Peter1999

Registriert seit: 13. Dez 2007
Ort: Dresden
88 Beiträge
 
Delphi XE2 Professional
 
#6

AW: Arrays skalieren/interpolieren

  Alt 27. Nov 2010, 23:39
Das ist schon OK.
Als ersten Denkansatz ist deine Lösung auch zu verwenden.
Ich wollte auch nur darauf hinweisen, dass man sich deutlich mehr Mühe geben muss, wenn man mit den Daten dann auch tatsächlich arbeiten möchte (oder muss ).
  Mit Zitat antworten Zitat
aphexx

Registriert seit: 23. Apr 2010
19 Beiträge
 
#7

AW: Arrays skalieren/interpolieren

  Alt 28. Nov 2010, 12:09
Erstmal vielen Dank für die Vorschläge! Ich werd's gleich mal ausprobieren.

Um den usecase mal grob zu umreissen:
Ich arbeite (hobbymässig) an einer GUI für einen 3D-Renderer und steuere verschiedene Parameter mit Werten von 0 bis 1...
Nun hab ich mir gedacht, dass es ganz nützlich sein kann, wenn man bspw. eine Reihe von 200 Floats nun mal 1,33 multipliziert und bei 266 Einträgen landet, um beispielsweise eine (Parameter-) Animation zu strecken/stauchen.

Edit:
Deine Funktion klappt wunderbar, super!
Doch manchmal bekomme ich leider "Ungültige Gleitkommaoperation", wenn sich zu wenig Werte in den Arrays befinden (bspw. von 6 auf 3 runterskalieren),
aber das ist nicht weiter schlimm, da die Arrays i.d.R. wesentlich mehr Einträge beinhalten.
Ich werde nochmal schauen, ob ich einen Mini-Plotter einbaue, um das Ergebnis visuell zu überprüfen.
Zudem guck ich mal, ob ich es schaffe, die Interpolation auf Sin/Cos/Beziér abzuändern.

Danke nochmal! =)

Geändert von aphexx (28. Nov 2010 um 13:48 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 11:57 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