Mikrofon auslesen und Frequenz bestimmen



  • Hi,

    Kann mir jemand sagen, wie ich das Mikrofon auslesen kann und dann die Frequenz des Tones bestimmen kann, der gerade aufgenommen wird ?
    Geht das überhaupt mit dem WinApi ?

    Danke und Gruß,
    Lusches :schland:



  • Auslesen ja, Frequenzbestimmung nein
    :schland:



  • Hi, guck dir mal WaveInOpen etc. an damit kannst du Töne direkt in einen Puffer aufnehmen.

    Desweiteren gibt es Verfahren um dann die Frequenzen die aufgenommen worden sind zu Trennen. Stichwort: Furier-Transformation



  • Hi, mit Schmitt-Trigger und Zahler, ohne FFT:

    #include <windows.h>
    #include <conio.h>
    #pragma comment(lib, "winmm")
    
    #define RECORD_TIME 1000 // one second
    short buffer[441*RECORD_TIME/10];
    
    int main()
    {
    	static WAVEFORMATEX format = {WAVE_FORMAT_PCM,1,44100,88200,2,16,0};
    	HWAVEIN hSound;
    	HANDLE hEvent = CreateEvent(0,0,0,0);
    
    	if (!waveInOpen(&hSound, WAVE_MAPPER, &format, (DWORD_PTR)hEvent, 0, CALLBACK_EVENT))
    	{
    		WAVEHDR hdr = {(LPSTR)buffer, sizeof(buffer), 0, 0, WHDR_BEGINLOOP|WHDR_ENDLOOP, 0, 0};
    
    		WaitForSingleObject(hEvent, RECORD_TIME/10);
    		WaitForSingleObject(hEvent, RECORD_TIME/10);
    
    		if (!waveInPrepareHeader(hSound, &hdr, sizeof(hdr)))
    		{
    			int a, state=0, count;
    
    			waveInStart(hSound);
    
    			while (!_kbhit() && !waveInAddBuffer(hSound, &hdr, sizeof(hdr)))
    			{
    				short peak = 0;
    				WaitForSingleObject(hEvent, RECORD_TIME+(RECORD_TIME/10));
    				count = 0;
    				for (a=0; a<(sizeof(buffer)/2); a++)
    				{
    					if (buffer[a] > peak) peak = buffer[a];
    					if (!state && buffer[a]>1000) // 20log(1000/16384) = -144dB
    					{
    						state = 1;
    						count++;
    					}
    					else if (state && buffer[a]<-1000)
    					{
    						state = 0;
    					}
    				}
    				printf("frequency: %d Hz  peak: %d\n", (count*1000)/RECORD_TIME, peak);
    			}
    			waveInUnprepareHeader(hSound, &hdr, sizeof(hdr));
    		}
    		waveInClose(hSound);
    	}
    	CloseHandle(hEvent);
    	return 0;
    }
    

Anmelden zum Antworten