![]() |
AW: Circular spectrum visualizer
Zitat:
Zitat:
Die beiden sind also nicht identisch. Zitat:
VB sqr -> Delphi sqrt |
AW: Circular spectrum visualizer
Zitat:
VB sqr\Delphi sqrt 33\184 VB sqr\Delphi sqr 33\130 Was sagt das nun aus. gruss |
AW: Circular spectrum visualizer
Log(x) in Visual Basic entspricht ln(x) in Delphi.
![]() 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. ![]() 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? |
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:
Zitat:
Zitat:
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. ![]() Zitat:
Delphi-Quellcode:
a := SQRT(x); // wäre noch zu klären
b := Power(2, a); Zitat:
Das ist definitiv falsch weil ich dann Vollausschlag habe wenn keine Musik läuft.
Delphi-Quellcode:
gruss
function TSpectrum.Log(x: Real): Real;
begin result := ln(x) / ln(10); end; |
AW: Circular spectrum visualizer
Für die Interessierten..
![]() 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:
warum er jetzt hier
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;
Code:
verwendet entschließ sich mir sollte eigentlich das gleiche sein wie
Len(Buffers(i).Header))
Code:
Wenn nicht muss ich es noch ändern.
Len(.Header))
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 |
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: ![]() |
AW: Circular spectrum visualizer
Zitat:
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. |
AW: Circular spectrum visualizer
Zitat:
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 |
AW: Circular spectrum visualizer
Zitat:
SizeOf(TWaveHeader) ist dann korrekt. Zitat:
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 |
AW: Circular spectrum visualizer
Und im von dir verlinkten VB6 steht klar:
Zitat:
Du kannst schlicht alle LOG() aus VB6 in Delphi durch ln() ersetzen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:09 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 by Thomas Breitkreuz