Frequenz aus dem Mic-Eingang filtern

  • Hey @ all,

    ich möchte herausfinden, welcher Ton gerade in mein Mic geht. Also wenn ich z.b. auf meinem Keybaord ein "a" Spiele, soll mir eine DLL/UDF dann den Wert 440Hz zurückgeben. Ist dies in AutoIt mittels einer DLL oder ähnlichem möglich?

    mfG
    Developer30

    "Je mehr Käse, desto mehr Löcher; je mehr Löcher, desto weniger Käse. Ergo: Je mehr Käse, desto weniger Käse. 8| "
    "Programmers never die: they just GOSUB without RETURN"
    "I tried to change the world but I couldn't find the source code."

    Einmal editiert, zuletzt von Developer30 (27. Juli 2010 um 16:45)

  • Mit AutoIt nur schwerlich denke ich.
    Prinzipiell könntest du ein kurzes Stück aufnehmen und darüber dann eine diskrete Fourier-Transformation laufen lassen.
    Dann erhälst du die Amplituden der einzelnen Frequenzen.
    Die reine AutoIt-Umsetzung wär wohl bisschen aufwendig und von der Performance wohl nicht so prickelnd.

  • diskrete Fourier-Transformation

    und wie geht das?

    "Je mehr Käse, desto mehr Löcher; je mehr Löcher, desto weniger Käse. Ergo: Je mehr Käse, desto weniger Käse. 8| "
    "Programmers never die: they just GOSUB without RETURN"
    "I tried to change the world but I couldn't find the source code."

  • Zitat

    mittels einer DLL


    Er will ja so etwas ähnliches wie die Bass-Dll haben, wo es am besten eine UDF zu gibt, denke ich, nicht den ganzen Code selber schreiben ^^.

    Nur keine Hektik - das Leben ist stressig genug

  • ]und wie geht das?


    Das kann ich dir nicht schlüssig und verständlich innerhalb eines Posts erklären.
    Ich habe dir das Werkzeug genannt - nicht mehr.
    Jetzt kannst du ja erstmal (so würde man es normalerweise machen wenn man einen Hinweis erhält) google anschmeißen und schauen was dort eigentlich passiert.
    Das dies hohe Mathematik ist und nur sehr schwer zu durchsteigen sage ich hiermit aber schon vorher.
    Da dies aber sehr oft benötigt wird, wird es sehr wahrscheinlich sehr viele Dlls geben welche eine diskrete Fourier-Transformation (genauer gesagt eine Fast-Fourier-Transformation= "FFT") durchführen.
    Du hast nun also die Antwort auf die Frage nach was du schauen musst wenn du dein Vorhaben wie gewollt per Dll durchführen willst.

  • Mit der Bass.dll würde das in etwa so funktionieren:

    Spoiler anzeigen
    [autoit]

    #AutoIt3Wrapper_UseX64=n
    #include "Bass.au3"
    #include "BassExt.au3"

    [/autoit] [autoit][/autoit] [autoit]

    OnAutoItExitRegister("_FreeBass")
    HotKeySet("{ESC}", "_Exit")

    [/autoit] [autoit][/autoit] [autoit]

    _BASS_Startup()
    _BASS_EXT_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    _BASS_RecordInit(-1)

    [/autoit] [autoit][/autoit] [autoit]

    $hRecord = _BASS_RecordStart(44100, 2, 0, $BASS_EXT_RecordProc)
    $tFFT = DllStructCreate("float[4096]")
    $pFFT = DllStructGetPtr($tFFT)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    _BASS_ChannelGetData($hRecord, $pFFT, $BASS_DATA_FFT8192)
    $fMax = 0
    $fFreq = 0
    For $i = 1 To 4096
    If DllStructGetData($tFFT, 1, $i) > $fMax Then
    $fMax = DllStructGetData($tFFT, 1, $i)
    $fFreq = $i * 44100 / 8190
    EndIf
    Next
    ToolTip("Frequency: " & Round($fFreq, 1) & "Hz")
    Sleep(50)
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

    [/autoit] [autoit][/autoit] [autoit]

    Func _FreeBass()
    _BASS_RecordFree()
    EndFunc ;==>_FreeBass

    [/autoit]

    die nötigen Dateien findest du hier: Audio Meter (Peak, VU, Stereoscope und Korrelationsgradmesser)

    mfgE

  • genau das hab ich gesucht :thumbup:
    THX :thumbup:


    Developer30

    "Je mehr Käse, desto mehr Löcher; je mehr Löcher, desto weniger Käse. Ergo: Je mehr Käse, desto weniger Käse. 8| "
    "Programmers never die: they just GOSUB without RETURN"
    "I tried to change the world but I couldn't find the source code."