Hallo zusammen,
ich habe mir ein kleines Script zusammengebastelt, welches folgendes tun sollte:
- 1kHz. Sinuston ausgeben
- Eigene Ausgabe bezüglich Frequenz und Pegel messen
- Mikrofoneingang bezüglich Frequenz und Pegel messen.
Die ersten beiden Punkte habe ich schon geschafft und das scheint gut zu funktionieren. Doch nun müsste ich noch die Frequenz des Tones am Mikrofoneingang und dessen Pegel messen. Das klappt nicht.
Zur Erklärung ich habe einfach den Kopfhörer Ausgang mit dem Mikrofon Eingang verbunden und sollte somit +/- das gleiche Ergebnis erhalten. Letzten Endes ist dann natürlich kein einfaches Kabel dazwischen, sondern ein Gerät, welches geprüft werden soll.
Hier mal mein SCHNELL zusammengebasteltes Test-Script:
Spoiler anzeigen
#include "Bass.au3"
#include "BassConstants.au3"
Dim $File = "1kHz.wav", $hMusic, $fftstruct, $fft, $Recordstruct, $Record, $hRecord
Dim $TmpData = 0, $TmpNr = 0, $TmpLevel = 0, $Level = 0, $Timer
_BASS_STARTUP ("BASS.dll") ;Open Bass.DLL.
_BASS_Init(0, -1, 44100, 0, "") ;Initalize bass.
$hMusic = _BASS_StreamCreateFile(False, $File, 0, 0, 0)
_BASS_ChannelPlay($hMusic, 1)
$fftstruct = DllStructCreate("float[4096]")
_BASS_ChannelGetData($hMusic, DllStructGetPtr($fftstruct), $BASS_DATA_FFT8192)
For $i = 0 To 4095
$TmpData = Round(DllStructGetData($fftstruct, 1, $i + 1) * 100)
If $fft < $TmpData Then ;Bestimme den Ort des Maximalwerts der FFT Analyse
$fft = $TmpData
$TmpNr = $i+1
EndIf
Next
$FrequencyOut = Round(22000 / 4096 * $TmpNr) ;Max 22kHz.
$Timer = TimerInit()
While 1
Sleep(10)
$TmpLevel = _BASS_ChannelGetLevel($hMusic) ;Get Sound Level for max 500ms
If $Level < $TmpLevel Then $Level = $TmpLevel
If TimerDiff($Timer) > 500 Then ExitLoop
WEnd
_BASS_RecordInit(-1)
$hRecord = _BASS_RecordStart(44100,1,0,"Bass_Callback_Record",0)
$Recordstruct = DllStructCreate("float[4096]")
_BASS_ChannelGetData($hRecord, DllStructGetPtr($Recordstruct),$BASS_DATA_FFT8192)
$TmpData = 0
$Record = 0
$TmpNr = 0
For $i = 0 To 4095
$TmpData = Round(DllStructGetData($Recordstruct, 1, $i + 1) * 100)
If $Record < $TmpData Then ;Bestimme den Ort des Maximalwerts der FFT Analyse
$Record = $TmpData
$TmpNr = $i+1
EndIf
Next
MsgBox(0,$i+1,$Record & "/" & $TmpNr)
MsgBox(0,"Ausgabe","Frequenz: " & $FrequencyOut & "Hz." & @LF & "Maximalpegel: " & $Level)
_BASS_Free()
_BASS_RecordFree()
Exit
Func Bass_Callback_Record($handle, $buffer, $length, $user)
Return 1
EndFunc
Die dafür notwendigen externen Dateien sind im hier (autoit.de/wcf/attachment/8844/) enthalten.
Vielleicht kann mit ja jemand helfen. Ich verstehe auch nicht, was eine Callback Funktion sein soll......
Vielen Dank für Eure gnädigen und geduldigen Antworten!
Grüsse
Veronesi