AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Circular spectrum visualizer
Thema durchsuchen
Ansicht
Themen-Optionen

Circular spectrum visualizer

Ein Thema von EWeiss · begonnen am 22. Mär 2019 · letzter Beitrag vom 23. Jun 2019
Antwort Antwort
Seite 2 von 10     12 34     Letzte »    
EWeiss
Projekt entfernt..

Geändert von EWeiss (24. Jul 2019 um 05:46 Uhr)
 
Delphi.Narium

 
Delphi 7 Professional
 
#11
  Alt 23. Mär 2019, 14:14
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 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 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
  Mit Zitat antworten Zitat
EWeiss
 
#12
  Alt 23. Mär 2019, 14:39
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
  Mit Zitat antworten Zitat
Michael II

 
Delphi 11 Alexandria
 
#13
  Alt 23. Mär 2019, 14:56
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?
Michael Gasser
  Mit Zitat antworten Zitat
EWeiss
 
#14
  Alt 23. Mär 2019, 15:08
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

Geändert von EWeiss (19. Jun 2019 um 07:14 Uhr)
  Mit Zitat antworten Zitat
EWeiss
 
#15
  Alt 23. Mär 2019, 15:09
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

Geändert von EWeiss (23. Mär 2019 um 15:13 Uhr)
  Mit Zitat antworten Zitat
Michael II

 
Delphi 11 Alexandria
 
#16
  Alt 23. Mär 2019, 15:50
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
Michael Gasser
  Mit Zitat antworten Zitat
TiGü

 
Delphi 10.4 Sydney
 
#17
  Alt 23. Mär 2019, 15:55
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.
  Mit Zitat antworten Zitat
EWeiss
 
#18
  Alt 23. Mär 2019, 15:57
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
  Mit Zitat antworten Zitat
EWeiss
 
#19
  Alt 23. Mär 2019, 16:01
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

Geändert von EWeiss (23. Mär 2019 um 16:06 Uhr)
  Mit Zitat antworten Zitat
Michael II

 
Delphi 11 Alexandria
 
#20
  Alt 23. Mär 2019, 16:03
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.
Michael Gasser
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 10     12 34     Letzte »    


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 19:27 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