AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi FLOAT_INVALID_OPERATION und FLOAT_OVERFLOW nur 64Bit
Thema durchsuchen
Ansicht
Themen-Optionen

FLOAT_INVALID_OPERATION und FLOAT_OVERFLOW nur 64Bit

Ein Thema von venice2 · begonnen am 15. Jul 2021 · letzter Beitrag vom 19. Jul 2021
Antwort Antwort
venice2
(Gast)

n/a Beiträge
 
#1

AW: FLOAT_INVALID_OPERATION und FLOAT_OVERFLOW nur 64Bit

  Alt 16. Jul 2021, 20:51
Die Frage ist, ob die die Range-Prüfung ausgelöst wird. Wenn FLOAT_INV.. vorher kommt, liegt es zumindest nicht daran, dass du auf einen ungültigen Speicherbereich zugreift.
Wenn du auf Speicherbereich nach dem Array zugreift würdest, dann kann dadurch schon der Fehler FLOAT_INV ausgelöst werden, je nachdem was dort steht.
Da wie bereits erwähnt ein array of single bei 0 startet müsste auch sample bei 0 beginnen und auch in die anderen beiden schleifen dürften immer nur bis samplecount-1 laufen.
Ich sagte schon
Zitat:
FLOAT_INVALID_OPERATION kommt trotzdem auch mit deinem rangecheck
Also danach.
Und nein diese werden nicht ausgelöst.

Aber ein versuch war es wert.

Habe es deaktiviert und werde die Daten Faden ohne die Wave Daten zu glätten.
Die Funktion habe ich vor 20 Jahren von Klaus Langbein aus dem VB-Forum bekommen der ist aber leider verstorben.
Na ja wie dem auch sei.

Am ende ein Programm das ich alleine verwende daher nicht so wichtig.
Danke für euer Interesse.

Geändert von venice2 (16. Jul 2021 um 22:14 Uhr)
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#2

AW: FLOAT_INVALID_OPERATION und FLOAT_OVERFLOW nur 64Bit

  Alt 19. Jul 2021, 14:53
Falls mir doch noch jemand bei dem Problem helfen möchte hier ist der Quelltext.
Quelltext entfernt. Bei bedarf lade ich ihn nochmal hoch.

In uBass
procedure TBassPlayer.DrawData(PaintDC: HDC);
müssen diese Zeilen wieder aktiviert werden.

// TIA: array[1..512] of single;
// XFFT(TRA, TIA, -1, 1, 511);

und anschließend so ändern.
Delphi-Quellcode:
TIA: array[1..256] of single;
XFFT(TRA, TIA, -1, 1, 255);
die anderen bitte kommentiert lassen (ist nur ein Test)

DragDrop einen Ordner mit *.mp3 Dateien.
Wenn ein Titel gefällt diesen zu Favoriten addieren erst danach wird eine m3u erstellt mit den Lieblings Titeln.
Beim nächsten Start wird die m3u automatisch geöffnet.

Unter Plugins Settings muß "Use WaveFade" eingeschaltet sein um die Glättung der Wave Daten zu testen.
Mindest Voraussetzung Windows 10

Geändert von venice2 (19. Jul 2021 um 22:28 Uhr)
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: FLOAT_INVALID_OPERATION und FLOAT_OVERFLOW nur 64Bit

  Alt 19. Jul 2021, 19:42
Hallo Emil,

habe mir Dein Projekt angeschaut.

Zuerst : Deine Grafik ist echt gut. (Optik)

Dann habe ich mir die
procedure TBassPlayer.XFFT angeschaut.
Sehe da mehrere Probleme
1. Du willst ja was zurück , dann solltest Du zumindest die 2 Arrays als Var deklarieren.
aktuell schiebst Du die nur über den Stack in die procedure, da kommt niemals was zurück.
Also so:

procedure TBassPlayer.XFFT(var FR, FI: array of single; Sign, Sample, SampleCount: Integer); Innerhalb der procedure fehlt eine Abbruch-Bedingung in

Delphi-Quellcode:
         M := ((SampleCount) div 2);
      while M < J do
      begin
        J := J - M;
        M := M div 2;
        // Nachtragen
        if M=0 then break; // Hier steckst Du in einer endlosSchleife
      end;
Und leere Exceptblöcke sind böse. So eine methode sollte keine Exceptions werfen,
und wenn Doch willst Du das wissen


Und deine FloatingPoint Probleme:

Delphi-Quellcode:
procedure TBassPlayer.DrawData(PaintDC: HDC);
var
  k: integer;
  TRA: array[1..256] of single;
  TIA: array[1..256] of single;
begin

  // Render alle Bilder in den temporären Buffer TempBufferDC
   for k := 0 to 255 do
    TRA[k + 1] := WaveData[k] / 1.50;
// Das Array TIA liegt auf dem Stack da ist zu 100% Müll drin
// Also:

  fillchar(TIA, sizeof(TIA), #0);


  XFFT(TRA, TIA, -1, 1, 255);
//
Mit diesen Änderungen läuft es bei mir durch ohne Probleme

Gruss Fritz
Fritz Westermann
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#4

AW: FLOAT_INVALID_OPERATION und FLOAT_OVERFLOW nur 64Bit

  Alt 19. Jul 2021, 19:53
@FritzW erstmal Danke das du dir das angeschaut hast.
Manchmal ist es schwer ohne den Quelltext zu zeigen etwas vernünftig erklären zu wollen.
Hatte schon befürchtet das es niemanden interessiert.

Zitat:
Zuerst : Deine Grafik ist echt gut. (Optik)
Danke!

Zitat:
1. Du willst ja was zurück , dann solltest Du zumindest die 2 Arrays als Var deklarieren.
aktuell schiebst Du die nur über den Stack in die procedure, da kommt niemals was zurück.
Also so:
Jep! Das ist sehr schlecht ist mir ehrlich gesagt gar nicht aufgefallen.
Werde es beheben.

Zitat:
Und leere Exceptblöcke sind böse. So eine methode sollte keine Exceptions werfen,
und wenn Doch willst Du das wissen
Gebe ich dir recht.
Wollte nur mal grundsätzlich rausspringen können wenn was fehl schlägt. Aber bringt beim debuggen von Float exeptions eh nichts.

Zitat:
Mit diesen Änderungen läuft es bei mir durch ohne Probleme
Werde deine Einstellungen übernehmen und anschließend eine Meldung abgeben wie es hier läuft.
Nochmals Danke.

Geändert von venice2 (19. Jul 2021 um 20:11 Uhr)
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#5

AW: FLOAT_INVALID_OPERATION und FLOAT_OVERFLOW nur 64Bit

  Alt 19. Jul 2021, 20:10
Bitte überprüfe nochmals das var in der XFFT das verändert mir die Visualisierung.
Siehe beide Pics.

Es läuft auch ohne var durch! Super keine Exception mehr.

Das erste visualisiert mehr in Richtung Wave das zweite zeigt mir mehr ein Spectrum.
Bin mir jetzt nicht sicher ob das so sein muß da die Glättung Funktion wie gesagt von Klaus war und dieser lebt leider nicht mehr. Kann ihn also nicht fragen.
Das erste sieht mir persönlich besser aus.

Aber wichtig die Fehler sind erst einmal weg. Danke.

Funktionieren die Visualisierungen, Sonique bei dir? (Interesse halber)

Eventuell kann ich das Auswählen lassen.
Füge eine neue Abfrage ""SmoothWaveData" in der Preference hinzu dann kann man auswählen ob XFFT durchlaufen werden soll oder nicht.
Ich denke Var ist in Ordnung und das Resultat abhängig davon auch.

Durch die Glättung soll ja eine Art Spektrum aus den Wave Daten entstehen.
Hast mir sehr geholfen

Geändert von venice2 (21. Jul 2021 um 20:15 Uhr)
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#6

AW: FLOAT_INVALID_OPERATION und FLOAT_OVERFLOW nur 64Bit

  Alt 19. Jul 2021, 22:24
Das var ist Richtig. (Habe auch nichts anderes erwartet)
habe es aber geändert das man es auch ohne Glättung verwenden kann.
Siehe Smooth the Wave Data"

Delphi-Quellcode:
procedure TBassPlayer.DrawData(PaintDC: HDC);
var
  k: integer;
  TRA: array[1..256] of single;
  TIA: array[1..256] of single;
begin

  if gBin.SmoothWaveData = 1 then
  begin
    for k := 0 to 255 do
      TRA[k + 1] := WaveData[k];

    Fillchar(TIA, SizeOf(TIA), #0);
    XFFT(TRA, TIA, -1, 1, 255);
  end
  else
    for k := 0 to 255 do
      TRA[k + 1] := WaveData[k] / 1.50;

  // Render alle Bilder in den temporären Buffer TempBufferDC
  for k := 1 to 256 do
  begin
    if TRA[k] < 0 then
      TRA[k] := 0;

    BitBlt(TempBufferDC, k - 1, trunc(Abs(FHeight - TRA[k])), 1, FHeight,
      PicFlame[FCurentFlame].Canvas.Handle, 0, 0, SRCCOPY);
  end;

  FadeBackBuffer(TempBufferDC);

  BitBlt(PaintDC, 0, 0, FWidth, FHeight, TempBufferDC, 0, 0, SRCCOPY);
end;
Delphi-Quellcode:
procedure TBassPlayer.XFFT(var FR, FI: array of single; Sign, Sample, SampleCount: Integer);
// Wave Daten glätten
var
  Q, J, M, L, le, le1, ip: integer;
  tr, ti, s, ur, ur1, ui, wr, wi: single;

begin

    J := 1;
    for Q := Sample to (SampleCount - 1) do
    begin
      if Q < J then
      begin
        s := FR[Q];
        FR[Q] := FR[J];
        FR[J] := s;
        s := FI[Q];
        FI[Q] := FI[J];
        FI[J] := s;
      end;

      M := ((SampleCount) div 2);
      while M < J do
      begin
        J := J - M;
        M := M div 2;
        if M = 0 then
          break;
      end;
      J := J + M;
    end;

    for L := 1 to 8 do
    begin
      le := trunc(Power(2, L));
      le1 := le div 2;
      ur := 1;
      ui := 0;
      wr := Cos(PI / le1);
      wi := Sign * Sin(PI / le1);


      for J := 1 to le1 do
      begin
        Q := J;
        while Q < (SampleCount) do
        begin
          ip := Q + (le1 - 1);
          tr := FR[ip] * ur - FI[ip] * ui;
          ti := FR[ip] * ui + FI[ip] * ur;
          FR[ip] := FR[Q] - tr;
          FI[ip] := FI[Q] - ti;
          FR[Q] := FR[Q] + tr;
          FI[Q] := FI[Q] + ti;
          Q := Q + le;
        end;

        ur1 := ur * wr - ui * wi;
        ui := ur * wi + ui * wr;
        ur := ur1;
      end;

    end;

    for Q := Sample to (SampleCount) do
    begin
      FR[Q] := FR[Q] * DivN;
      FI[Q] := FI[Q] * DivN;
    end;
end;

Geändert von venice2 (21. Jul 2021 um 20:15 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 13:14 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