Oszilloskop programmieren, Eingang: Mikro



  • Hi @ all,

    ich möchte schon seit langem mal ein Oszilloskop programmieren.
    Ich möchte mehr oder weniger in Echtzeit die Signale, die ich vom Mikrofon auffange, auf dem Bildschirm graphisch ausgeben. Die Ausgabe wird aber kein Problem sein. Dafür benutze ich Allegro.

    Mein Problem ist, ich weiß nicht wie ich Signale vom Mirkofon empfangen kann und aus den Signalen dann Frequenz, Lautstärke, etc. auslesen kann.

    Ich benutze Dev-C++ unter WinXP mit Allegro und ggf. FMOD (kenn ich mich aber net aus). Mit der WinAPI kann ich auch einigermaßen umgehen, falls man die dazu braucht.

    Wie kann ich jetzt Signale über das Mikrofon empfangen und "verarbeiten"?
    Würd mich über schnelle Hilfe freuen. Und danke schonmal im voraus :).

    Liebe Grüße,
    Timo



  • Gibts bei DirectX da vielleicht was ?



  • Ich hab leider keine Ahnung...
    kenn mich mit DirektX überhaupt nicht aus. Wenn jemand was weiß... hab ein offenes Ohr.. (genaugenommen zwei.. ;))



  • Mich würde das auch extrem interessieren, da ich ganz ähnliche Sachen machen will. Ich such auch schon die ganze Zeit nach einer Möglichkeit. Was ich bisher gefunden habe:

    DirectSound(kompliziert) Ist vielleicht nicht so einfach mit dem Dev-C++ zu verwenden wie mit dem VC++. Ich verwende aber auch den Dev-C++.

    Deshalb probier ich gerade eine etwas ältere API aus, die sich nur durch das Interface von DirectSound unterscheidet. Dafür lade ich mir gerade das "Windows Platform SDK" herunter, weil mir da eine Bibliothek fehlt.

    Dazu dieser Link nochmal, der glaub ich auch schon mal irgendwo hier im Forum gepostet wurde: http://www.borg.com/~jglatt/tech/winapi.htm

    Im Moment stocher ich eher im Trüben herrum, ich wäre sehr dankbar, wenn du oder jemand anderes eine einfache Möglichkeit dafür findet. Wenn ichs hinkrieg meld ich mich auch mal hier.

    Zarniwoop



  • DSound das Capture Device.

    Wenn du eine anderer Bibliothek nehmen möchtest, pass auf, dass es nicht zu stark abstrahiert. Je höher du sampeln kannst umso besser für's Oszi.



  • Um das Signal dann in den Frequenzraum zu transformieren, benutzt man üblicherweise die Fast Fourier Transformation.



  • Tomas: Dass das mit ner Fourier Transformation geht hab ich auch schon gewusst, aber das war nicht die Frage.

    SeppSchrott: Du empfiehlst DirectSound? Geht das dann auch mit dem Dev-C++ ohne zu viel rumfrickeln zu müssen?

    Zarniwoop



  • Für DirectSound braucht man doch dann au die DirectX Libs, oder?

    Hab mich bei Wikipedia probiert über "Fast Fourier Transformation" schlau zu machen. Hab allerdings beim Anblick der Formeln das schnell wieder aufgegeben.

    Gibts noch andere Möglichkeiten? Evtl. noch mit anderen Libs?



  • Fourier Transformation ist weniger schwer als es aussieht. Der Satz von Fourier sagt aus, dass jede periodische Funktion eine Kombination von Sinuswellen ist. Heißt im Klartext und Praxisbezogen, dass wenn du dein Eingangs Signal fouriertransformierst, erhählst du alle beteiligten Frequernzen an dem Signal. Wenn du also auf dem Klavier ein A spielst und du Fouriertransformierst dieses Signal, erhählst du einen sehr starken Anteil von 440 Hz(wenn das Klavier richtig gestimmt ist) einen geringeren Anteil bei 880Hz(1. Oberton), 1320(2. oberton), 1760 Hz(3.Oberton) usw. Die Obertöne sind vom Instrument abhängig. Eine gute Bibliothek für FFT's ist die FFTW(einfach googlen).

    Jat jemand vielleicht ein Codebeispiel für das Capturen von Sound mit DirectSound?

    Zarniwoop



  • Ich hab jetzt n bissle rumexperimentiert und das hier mit fmod zusammengebastelt:

    #include <iostream>
    #include <string>
    
    #include <FMOD/fmod.h>
    #include <FMOD/fmod_errors.h> 
    
    int main()
    {
        FSOUND_SAMPLE *sptr = NULL;
        if (FSOUND_GetVersion() < FMOD_VERSION)
        {
            std::cout << "Error: You are using the wrong DLL version.  You should be using FMOD " << FMOD_VERSION << "\n";
    		std::cin.get();
            return 1;
        }
    
        if (!FSOUND_Init(32000, 64, 0))
        {
            std::cout << "Error: " << FMOD_ErrorString(FSOUND_GetError()) << "\n";
    		std::cin.get();
            return 1;
        }
    
        sptr = FSOUND_Sample_Alloc(FSOUND_FREE,500,FSOUND_OUTPUT_ALSA,22050,100,0,0);
    
        FSOUND_Record_StartSample(sptr,true);
        FSOUND_PlaySound(FSOUND_FREE, sptr);
    
    	std::cin.get();
    
    	FSOUND_Record_Stop();
    
    	if(sptr)
    		FSOUND_Sample_Free(sptr);
    
        FSOUND_Close();
    
        return 0;
    }
    

    Das was ich ins Mikrofon spreche wird fast gleichzeitig ausgegeben. Allerdings in extrem schlechter Qualität (kaum verständlich).

    Bei FMOD gibts die Funktion FSOUND_DSP_GetSpectrum, die mir etwas Hoffnung macht.

    Aber irgendwie kapier ich nicht so wirlich wie diese Funktion funktioniert. Und ich weiß nicht von welcher Quelle sie das Spektrum "ausliest".



  • Dago schrieb:

    Mein Problem ist, ich weiß nicht wie (...) ich aus den Signalen dann Frequenz, Lautstärke, etc. auslesen kann.

    Dago schrieb:

    Dass das mit ner Fourier Transformation geht hab ich auch schon gewusst, aber das war nicht die Frage.



  • TomasRiker: Oh, Entschuldigung, ich hatte das eher so verstanden, dass sein grundsätzliches Problem eher das Samplen des Audiosignals ist. Lag vielleicht daran, dass das genau mein Problem ist.

    Dago:Aber dein Code tut doch nur genau einmal etwas aufzeichnen und das dann genau einmal wiedergeben. Und wielang ist dieses Stück an Ton dann? Gibt es auch eine Möglichkeit an die konkreten gesampelten Werte zu kommen?

    Die schlechte Qualität könnte auch von deinem Mikrofon kommen.

    Zarniwoop



  • Das Mikrofon funktioniert einwandfrei. Habs getestet.

    Wenn ich die Aufnahme abspiele nachdem ich die Aufnhame gestoppt habe, ist die Qualität gut. D.h. es liegt wahrscheinlich daran, das Aufnahme und Ausgabe parallel laufen.

    In der Doku steht (FSOUND_Record_StartSample):

    If you want to play back the sample at the same time is is recording, you will have to play the sound and try and keep it just behind the recording cursor.

    Weiß allerdings nicht wie ich das verwirklichen soll. Hab einiges probiert, hat aber nichts geklappt.

    Dadurch das der 2. Parameter in FSOUND_Record_StartSample(sptr,true); auf true gesetzt ist, wird die Aufnahme immer wieder wiederholt, bis FSOUND_Record_Stop(); aufgerufen wird.



  • Du hast recht, ich hab deinen Code mal kompiliert und bei mir ist es genau dasselbe. Durch Verändern der Bitrate und der Samplelänge kann man die Tonhöhe des Rauschens verändern. Ist zwar ein sehr lustiger Effekt, aber eben leider nicht das Erwünschte. Ich schau mich jetztmal ein bisschen im FMOD-Forum um, vielleicht find ich da was.

    edit: So, die Suchfunktion hab ich jetzt lange genug bearbeitet, jetzt krame ich mal meine Englischkenntnisse hervor und frag einfach mal.

    Zarniwoop


Anmelden zum Antworten