Delphi-PRAXiS
Seite 2 von 10     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Circular spectrum visualizer (https://www.delphipraxis.net/200135-circular-spectrum-visualizer.html)

Delphi.Narium 23. Mär 2019 13:14

AW: Circular spectrum visualizer
 
Zitat:

Zitat von Visual Basic
The VBA Sqr function accepts one argument - a positive number - and will return the square root of that number as a Double data type.

Berechnet also die Quadratwurzel einer Zahl.

Zitat:

Zitat von Delphi
In Delphi code, the Sqr function returns the square of the argument.

X is a floating-point expression. The result, of the same type as X, is the square of X, or X*X.

Berechnet das Quadrat einer Zahl.

Die beiden sind also nicht identisch.

Zitat:

Zitat von Delphi
The Sqrt function returns the square root of a Number. The number must be a floating point type.

Berechnet also die Quadratwurzel einer Zahl.

VB sqr -> Delphi sqrt

EWeiss 23. Mär 2019 13:39

AW: Circular spectrum visualizer
 
Zitat:

VB sqr -> Delphi sqrt
Ja das hatte ich vorher..

VB sqr\Delphi sqrt
33\184

VB sqr\Delphi sqr
33\130

Was sagt das nun aus.

gruss

Michael II 23. Mär 2019 13:56

AW: Circular spectrum visualizer
 
Log(x) in Visual Basic entspricht ln(x) in Delphi.

Visual Basic Log

Wie oben erwähnt gibt es in VB eine überladene Funktion log(x,Basis), welche uns aber hier nicht weiter interessiert.


Der Autor logarithmiert das Spektrum mit ln().

Problem: Wenn das Spektrum gegen 0 geht, dann geht ln(Spektrum) gegen minus Unendlich.

Der Autor wendet hier einen kleinen "Trick" an, damit dies nicht geschieht.

Er hebt das gemessene Spektrum um 0.0001 an. (Das ist Basteln - keine Mathe)

Er rechnet also nicht ln(Spektrum) sondern ln(Spektrum+0.0001).

Weiter will der Autor eine Funktion, welche für Spektrum=0 den Wert 0 annimmt.

Da ln(0+0.0001) = -9.21034037197618 ist, addiert er nun 9.21034037197618 dazu.

Insgesamt

f(x) = ln( sqrt( Sp_Real^2 + Sp_Imag^2 ) + 0.0001 ) + 9.21034037197618.



Zu: sqrt. Sowohl in Delphi wie in Visual Basic liefert sqrt die Quadratwurzel einer Zahl zurück.

https://docs.microsoft.com/en-us/dot...ramework-4.7.2

Bist du sicher, dass im Original-VB-Code sqr steht? Das macht für mich irgendwie wenig Sinn.

Das Spektrum s besteht ja aus einem Realteil sr und einem Imaginärteil si.
Insgesamt s = sqrt( sr*sr + si*si ).

Wo ist der Link auf den Originalcode in VB?

EWeiss 23. Mär 2019 14:08

AW: Circular spectrum visualizer
 
Danke Michael für dein Interesse :)
Es ist mir wichtig das alle Datentypen VB6 via Delphi IO sind damit ich das ausschließen kann.
Dazu Nachher mehr.

Zitat:

Bist du sicher, dass im Original-VB-Code sqr steht? Das macht für mich irgendwie wenig Sinn.
Ja das bin ich im Anhang der Source.
Zitat:

Wo ist der Link auf den Originalcode in VB?
Auf den habe ich im ersten Beitrag verlinkt.. werde ihn aber hier hochladen.

Zitat:

Log(x) in Visual Basic entspricht ln(x) in Delphi.
Ist mir unverständlich warum ihr immer auf .NET verweist...
Es geht hier um VB6 nicht um VB.net das sind 2 paar Schuhe!
Deshalb habe ich auch immer extra VB6 addiert damit das nicht verwechselt wird.
Hier kannst du lesen welche werte bzw. Formeln für LOG\SQR gültig sind. SQRT gibt es nicht unter VB6
Zitat:

Quadratwurzel: SQR
Die Funktion SQR berechnet die positive Quadratwurzel einer nicht-negativen Zahl x. Für negative Argumente wird ein Fehler ausgelöst. Es gilt: SQR(x)^2 = x.
a = SQR(x)
b = a ^ 2
Die Variable b enthält den gleichen Wert wie x.
wenn in Delphi dann so?
Delphi-Quellcode:
a := SQRT(x); // wäre noch zu klären
b := Power(2, a);
Zitat:

Wie oben erwähnt gibt es in VB eine überladene Funktion log(x,Basis), welche uns aber hier nicht weiter interessiert.
Nein gibt es nicht nur zur Richtigstellung! Nochmal VB6 nicht VB.Net

Das ist definitiv falsch weil ich dann Vollausschlag habe wenn keine Musik läuft.
Delphi-Quellcode:
function TSpectrum.Log(x: Real): Real;
begin

   result := ln(x) / ln(10);
end;
gruss

EWeiss 23. Mär 2019 14:09

AW: Circular spectrum visualizer
 
Für die Interessierten..
Fangen wir beim Anfang an. Und die Quelle

Integer VB = SmallInt in Delphi..

Initialisieren von WaveIn.

Code:
Public Type BUFFER
    Data() As Integer
    Header As WAVEHDR
End Type
Delphi-Quellcode:
TBuffer = Record
  Data: array of SmallInt;
  Header: TWAVEHDR;
end;
Code:
ReDim Buffers(3)
    For i = 0 To UBound(Buffers)
         With Buffers(i)
             ReDim .Data(count - 1)
             .Header.lpData = VarPtr(.Data(0))
             .Header.dwBufferLength = count * 2
             .Header.dwFlags = 0
             .Header.dwLoops = 0
             ret = waveInPrepareHeader(hWave, .Header, Len(.Header))
             If ret Then ShowMessage ret: Exit Function
         End With
    Next i

    For i = 0 To UBound(Buffers)
        ret = waveInAddBuffer(hWave, Buffers(i).Header, Len(Buffers(i).Header))
        If ret Then ShowMessage ret: Exit Function
    Next i
   
    ret = waveInStart(hWave)
    If ret Then ShowMessage ret: Exit Function
   
    InitCapture = True
Delphi-Quellcode:
SetLength(Buffers, 3);
  for i := 0 to High(Buffers) do
  begin
    SetLength(Buffers[i].Data, round(count - 1));
    Buffers[i].Header.lpData := @Buffers[i].Data[0];
    Buffers[i].Header.dwBufferLength := round(count * 2);
    Buffers[i].Header.dwFlags := 0;
    Buffers[i].Header.dwLoops := 0;
    mres := waveInPrepareHeader(WaveIn, @Buffers[i].Header, SizeOf(TWAVEHDR));
    if mres <> 0 then
    begin
      SetMessage(mres);
      exit;
    end;
  end;

  for i := 0 to High(Buffers) do
  begin
    mres := waveInAddBuffer(WaveIn, @Buffers[i].Header, SizeOf(TWAVEHDR));
    if mres <> 0 then
    begin
      SetMessage(mres);
      exit;
    end;
  end;

  mres := waveInStart(WaveIn);
  if mres <> 0 then
  begin
    SetMessage(mres);
    exit;
  end;

  Result := True;
warum er jetzt hier
Code:
Len(Buffers(i).Header))
verwendet entschließ sich mir sollte eigentlich das gleiche sein wie
Code:
Len(.Header))
Wenn nicht muss ich es noch ändern.

Auf die Zuweisungen des Headers habe ich keinen Einfluss die Datentypen sind so wie sie gegeben sind.
Ich muss DWORD in Delphi verwenden wo es angesagt ist und kann mich diesbezüglich nicht auf die Typen von VB6 einlassen.
Wenn das OK ist dann sollte die Initialisierung eigentlich korrekt sein.

Denke das ist übersichtlich und sollte für den Anfang nicht zu viel sein um zu überblicken ob alles OK ist.

Wenn ihr auch der Meinung seid geht es im nächsten Beitrag weiter.

gruss

Michael II 23. Mär 2019 14:50

AW: Circular spectrum visualizer
 
Besten Dank für deine VB6 SQR Klarstellung (dein Link):

SQR() in VB entspricht sqrt() ["square root"] in Delphi.
Verwende also wie bereits weiter oben vorgeschlagen in deiner uSound.pas unbedingt sqrt und nicht sqr.
Beispiel VB6: SQR(25)=5 - Delphi sqr(25)=25*25=625 Delphi sqrt(25)=5.


Du hast nach Tönen gesucht:
Wenn du nicht selbst eine WAV Datei schreiben willst (zum Beispiel mit MathLab und Co), dann findest du hier Töne:

https://www.wavtones.com/functiongenerator.php

TiGü 23. Mär 2019 14:55

AW: Circular spectrum visualizer
 
Zitat:

Zitat von EWeiss (Beitrag 1428489)
warum er jetzt hier
Code:
Len(Buffers(i).Header))
verwendet entschließ sich mir sollte eigentlich das gleiche sein wie
Code:
Len(.Header))
Wenn nicht muss ich es noch ändern.

Einfach nochmal genau hingucken.
Beim ersten Mal nimmt er ein With-Statment, deswegen kann er Len(.Header) schreiben.
Beim zweiten Mal hat er kein With und muss deswegen Buffers[i] davor schreiben.

Auch auf die Gefahr hin, dass es wieder als persönlicher Angriff aufgefasst wird:
Es wäre empfehlenswert, wenn du dir ein Grundlagenwerk Mathematik der Oberstufe zu legst. Ein suchen bei Internetbuchhandlungen nach "Mathematik Abitur" sollte zum Ziel führen.
Entsprechende Websites und Tutorials gehen natürlich auch.

EWeiss 23. Mär 2019 14:57

AW: Circular spectrum visualizer
 
Zitat:

Verwende also wie bereits weiter oben vorgeschlagen in deiner uSound.pas unbedingt sqrt und nicht sqr.
Somit ist das 100% geklärt ;)
Wäre schön wenn das bei den anderen Datentypen auch der fall wäre.. um zu einem gleichen er Ergebnis zu gelangen.
Danke für die Richtigstellung.

gruss

EWeiss 23. Mär 2019 15:01

AW: Circular spectrum visualizer
 
Zitat:

Beim zweiten Mal hat er kein With und muss deswegen Buffers[i] davor schreiben.
Ja sorry habe ich übersehen habe selbst über 15 Jahre VB6 Anwendungen geschrieben im Eifer des Gefechts kann das schon mal passieren.
SizeOf(TWaveHeader) ist dann korrekt.

Zitat:

Es wäre empfehlenswert, wenn du dir ein Grundlagenwerk Mathematik der Oberstufe zu legst. Ein suchen bei Internetbuchhandlungen nach "Mathematik Abitur" sollte zum Ziel führen.
Entsprechende Websites und Tutorials gehen natürlich auch.
Danke für den Ratschlag kein Problem.. ;)
Aber ich fange jetzt mit 61 Jahren nicht mehr an mir höhere Mathematik anzueignen es geht doch nur um eine Portierung als Example für meine Bibliothek.

Es freut mich trotzdem wenn hier einige dabei sind die mir weiterhelfen möchten.
Zumal der Thread auch interessant ist für VB6 Umsteiger.. ja es gibt noch genug davon.

gruss

Michael II 23. Mär 2019 15:03

AW: Circular spectrum visualizer
 
Und im von dir verlinkten VB6 steht klar:

Zitat:

Natürlicher Logarithmus: LOG
LOG berechnet den Logarithmus zur Basis e (die Eulersche Zahl, e ist ungefähr 2.718282). Dies ist der sogenannte natürliche Logarithmus. Es sind nur positive Argumente erlaubt.
VB6 LOG() entspricht also in Delphi ln()

Du kannst schlicht alle LOG() aus VB6 in Delphi durch ln() ersetzen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:15 Uhr.
Seite 2 von 10     12 34     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