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; }