Frequenzen erkennen



  • Ich arbeite gerade an einem neuen Übertragungssystem. Wichtig ist dabei eine Art Modem das erkennen soll welcher Ton mit welcher Frequenz und Lautstärke gerade durch die Leitung kommt. Ich habe aber leider nicht die Kenntnis (oder die Möglichkeit) jemals ein Modem mit solchen Fähigkeiten zu bauen. Deswegen soll vorerst die Soundkarte herhalten. Die soll über den Aufnahmekanal die einzelnen Frequenzen erkennen und entsprechende Meldung machen. Ich hab bereits im Intenet gesucht aber nirgendswo steht wie man es schafft die Frequenz des Tones der gerade von der Soundkarte aufgenommen wird rausbekommt.

    Ich hab vorher nur VB programmiert, ohne jemals das WIN API zu benutzten und bin erst auf c++ umgestiegen. Ich hab also noch wenig Ahnung vom WIN API.



  • Eine Fourier-Analyse köntne da helfen soweit ich weiß 🙂 (-->Google)



  • Schon, aber wie komm ich an die Daten dafür....
    Ich hab mal was über WaveIn und WaveOut in der MSDN gelesen, hab aber keine Ahnung wie ich die einsetzen soll.



  • Hi!
    Also an die Daten zu kommen ist nichtmal so schwer.
    Mal grob ausgedrückt musst du folgendes machen:

    WaveInCaps WaveCaps;
    for(int i=0; i<waveInGetNumDevs()-1; i++)
    {
       result = waveInGetCaps(I,WaveCaps,48);
       cout "(" << i << ") " << WaveCaps.ProductName << "\n";
    }
    // dann den user auswählen lassen von 0 bis waveInGetNumDevs()-1
    // und das in Device abspeichern
    int DevHandle;
    WaveFormatEx WaveFMT;
    WaveFMT.FormatTag      = 1;
    WaveFMT.Channels       = 1;
    WaveFMT.SamplesPerSec  = 11025; // BlockAlign * SamplesPerSec
    WaveFMT.AvgBytesPerSec = 11025; // (Channels * BitsPerSample) / 8
    WaveFMT.BlockAlign     = 1;
    WaveFMT.BitsPerSample  = 8;
    WaveFMT.ExtraDataSize  = 0;
    
    waveInOpen(&DevHandle,Device,&WaveFMT,0,0,0);
    waveInStart(DevHandle);
    
    char WaveData[512];
    WaveHdr WaveHead;
    WaveHead.lpData         = &WaveData[0];
    WaveHead.dwBufferLength = 512;
    waveInPrepareHeader(DevHandle,&WaveHead,32);
    ...
    while !quit
    {
       ...
       waveInAddBuffer(DevHandle,&WaveHead,32);
       // nun steht im WaveData-Array die Amplitudenwerte (0 - 256)
       // die man jetzt noch grafisch darstellen könnte
       ....
    }
    ...
    waveInUnprepareHeader(DevHandle,&WaveHead,32);
    waveInReset(DevHandle);
    waveInClose(DevHandle);
    ...
    

    ich hoffe das nützt Dir was. Was mich selber interessieren würde,
    wie man z.B. aus diesen Werten eine simple ja/nein abfrage bauen könnte.

    mfg olli



  • Also erstmals Danke.
    Aber was macht:

    WaveFormatEx WaveFMT; 
    WaveFMT.FormatTag      = 1; 
    WaveFMT.Channels       = 1; 
    WaveFMT.SamplesPerSec  = 11025; // BlockAlign * SamplesPerSec 
    WaveFMT.AvgBytesPerSec = 11025; // (Channels * BitsPerSample) / 8 
    WaveFMT.BlockAlign     = 1; 
    WaveFMT.BitsPerSample  = 8; 
    WaveFMT.ExtraDataSize  = 0;
    

    😕



  • Und das hier:

    char WaveData[512]; 
    WaveHdr WaveHead; 
    WaveHead.lpData         = &WaveData[0]; 
    WaveHead.dwBufferLength = 512; 
    waveInPrepareHeader(DevHandle,&WaveHead,32);
    


  • Wie kann ich den LineIn-Eingang abfragen ???



  • Was willst du denn abfragen 😕 - Wie du die Daten davon einliest steht doch schon in diesem Thread 🙄



  • Ich wollt wissen ob ich was ich einstellen muss damit nur der Line-In abgehört wird und nicht das Mikro.



  • manuell, oder durch das Programm? Falls ersteres: das kannst du auswählen, wenn du einen Doppelklick auf den Lautsprecher im System-Tray machst und dann auf Aufnahme gehst 🙄



  • Sollte das Prog selber machen
    (sorry für die lange wartezeit)



  • Ich hoffe ihr könnt mir helfen:
    Ich hab den obigen Code ausprobiert und die Fehler behoben.
    Jetzt kommt aber beim Linken die Fehler Meldung:

    *-------------------Konfiguration: WaveIn - Win32 Debug--------------------
    Linker-Vorgang läuft...
    Main.obj : error LNK2001: Nichtaufgeloestes externes Symbol __imp__waveInClose@4
    Main.obj : error LNK2001: Nichtaufgeloestes externes Symbol __imp__waveInReset@4
    Main.obj : error LNK2001: Nichtaufgeloestes externes Symbol __imp__waveInUnprepareHeader@12
    Main.obj : error LNK2001: Nichtaufgeloestes externes Symbol __imp__waveInAddBuffer@12
    Main.obj : error LNK2001: Nichtaufgeloestes externes Symbol __imp__waveInPrepareHeader@12
    Main.obj : error LNK2001: Nichtaufgeloestes externes Symbol __imp__waveInStart@4
    Main.obj : error LNK2001: Nichtaufgeloestes externes Symbol __imp__waveInOpen@24
    Main.obj : error LNK2001: Nichtaufgeloestes externes Symbol __imp__waveInGetDevCapsA@12
    Main.obj : error LNK2001: Nichtaufgeloestes externes Symbol __imp__waveInGetNumDevs@0
    Debug/WaveIn.exe : fatal error LNK1120: 9 unaufgeloeste externe Verweise
    Fehler beim Ausführen von link.exe.

    WaveIn.exe - 10 Fehler, 0 Warnung(en)*

    mmsystem.h und winmm.lib hab ich eingfügt.. an was kanns den noch liegen?



  • Kann es sein, dass du die lib nur in der Release-Version hinzugefügt hast?



  • Hallo !

    Wenn ich die Schnellüberwachung für WaveData einschalte stehen da nur Zahlen und Zeichen drin z.B. " -51 '€' ". Kann mir da jemand helfen oder ist das normal ?



  • Evtl. versucht die Schnellüberwachung einfach die Daten als ASCI-Zeichen zu interpretieren



  • Sieht eher so aus als ob WaveData nicht initialisiert ist...
    Wann genau sieht das denn so aus?
    Bevor die Struktur befüllt wird oder hinterher?



  • Das ist mein Sourcecode vielleicht hilft der ja das Problem zu lösen.

    VOID GetAudioData()
    {
    #define CHK(mmr) if(mmr!=MMSYSERR_NOERROR){MessageBox(0,"Fehler",0,0);}
    
    	HWAVEIN			hWaveIn;
    	MMRESULT		mmR;
    	WAVEFORMATEX	lpWaveFormatEx;
    	WAVEHDR			lpWaveHeader;
    	char			pBuff[512];
    	int				i=0;
    
    	lpWaveFormatEx.wFormatTag     =1; 
    	lpWaveFormatEx.nChannels      =1; 
    	lpWaveFormatEx.nSamplesPerSec =11025;
    	lpWaveFormatEx.nAvgBytesPerSec=11025; 
    	lpWaveFormatEx.nBlockAlign     =1; 
    	lpWaveFormatEx.wBitsPerSample  =8;
    
    	lpWaveHeader.lpData        =&pBuff[0]; 
    	lpWaveHeader.dwBufferLength=512;
    	lpWaveHeader.dwFlags	   =0L;
    	lpWaveHeader.dwLoops	   =0L;
    
    	mmR=waveInOpen(&hWaveIn,0,&lpWaveFormatEx,0,0,0);
    	CHK(mmR);
    
    	mmR=waveInStart(hWaveIn); 
    	CHK(mmR);
    
    	mmR=waveInPrepareHeader(hWaveIn,&lpWaveHeader,sizeof(WAVEHDR));
    	CHK(mmR);
    
    	while (i<1000) //nicht sehr sinnvoll aber praktisch (Testschleife)
    	{ 
    		waveInAddBuffer(hWaveIn,&lpWaveHeader,sizeof(WAVEHDR));
    		i++;
    		pBuff; //Stelle für Schnellüberwachung
    	} 
    
    	waveInUnprepareHeader(hWaveIn,&lpWaveHeader,sizeof(WAVEHDR)); 
    	waveInReset(hWaveIn); 
    	waveInClose(hWaveIn);
    }
    


  • pBuff ist ja ein Array vom Typ char - deswegen versucht die Schnellüberwachung den Inhalt als Sting zu interpretieren 😉



  • Aber wie komme ich denn nun genau an diese Werte die in dem Array stehen ?
    Ich habe schon

    int wert=atoi(pBuff[0]);
    

    probiert aber da kommt eine unbehandelte Ausnahme.



  • Ich würde denken, dass du einfach casten kannst, also:

    int wert = (int)pBuff[0];
    

    Wenn du den Wert unbedingt in einem Int haben musst - eigentlich kannst du ja auch direkt mit pBuff[0] arbeiten (ist ja auch schon eine Zahl)


Anmelden zum Antworten