기본적으로 Noise Cancelling을 지원한다는 이야기를 들어서
프로그램을 찾아 볼려니 보이지 않아서 한번 만들어 볼까는 호기심이 발동했다
(써글 호기심 ㄱ-)
조금 검색해보니, 구현이야 간단하지만 거리나 얼마나 큰 범위를 noise cancelling 할건지가 문제고
sound card에서 받아오는 time lag로 인해서 은근히 어렵다고 한다.
일단 winapi에서 제공하는 녀석들로 찾아 보니
MCI (Media Contol Interface) 라는게 있다.
SAPI (Speech API)도 있긴한데 TTS나 음성인식쪽이라 일단은 패스~
일단 대충 꼬라지를 보니..
step 1. 윈도우 레코드 프로그램 흉내내기 (파일로 저장)
step 2. 메모리 상에서 위상 뒤집기
step 3. 뒤집은 위상을 스피커로 출력하기
이런 순서가 될 듯 하다.
DWORD CMyRecordDlg::RecordWAVEFile(DWORD dwMilliSeconds) { UINT wDeviceID; DWORD dwReturn; MCI_OPEN_PARMS mciOpenParms; MCI_RECORD_PARMS mciRecordParms; MCI_SAVE_PARMS mciSaveParms; MCI_PLAY_PARMS mciPlayParms; // Open a waveform-audio device with a new file for recording. mciOpenParms.lpstrDeviceType = "waveaudio"; mciOpenParms.lpstrElementName = ""; if (dwReturn = mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT | MCI_OPEN_TYPE, (DWORD)(LPVOID) &mciOpenParms)) { // Failed to open device; don't close it, just return error. return (dwReturn); } // The device opened successfully; get the device ID. wDeviceID = mciOpenParms.wDeviceID; // Begin recording and record for the specified number of // milliseconds. Wait for recording to complete before continuing. // Assume the default time format for the waveform-audio device // (milliseconds). mciRecordParms.dwTo = dwMilliSeconds; if (dwReturn = mciSendCommand(wDeviceID, MCI_RECORD, MCI_TO | MCI_WAIT, (DWORD)(LPVOID) &mciRecordParms)) { mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL); return (dwReturn); } // Play the recording and query user to save the file. mciPlayParms.dwFrom = 0L; if (dwReturn = mciSendCommand(wDeviceID, MCI_PLAY, MCI_FROM | MCI_WAIT, (DWORD)(LPVOID) &mciPlayParms)) { mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL); return (dwReturn); } if (MessageBox("Do you want to save this recording?", "", MB_YESNO) == IDNO) { mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL); return (0L); } // Save the recording to a file named TEMPFILE.WAV. Wait for // the operation to complete before continuing. mciSaveParms.lpfilename = "tempfile.wav"; if (dwReturn = mciSendCommand(wDeviceID, MCI_SAVE, MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID) &mciSaveParms)) { mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL); return (dwReturn); } return (0L); } [참고 : http://www.codeproject.com/KB/audio-video/Voice_Recording.aspx] |
Offset Size Name Description The canonical WAVE format starts with the RIFF header: 0 4 ChunkID Contains the letters "RIFF" in ASCII form (0x52494646 big-endian form). 4 4 ChunkSize 36 + SubChunk2Size, or more precisely: 4 + (8 + SubChunk1Size) + (8 + SubChunk2Size) This is the size of the rest of the chunk following this number. This is the size of the entire file in bytes minus 8 bytes for the two fields not included in this count: ChunkID and ChunkSize. 8 4 Format Contains the letters "WAVE" (0x57415645 big-endian form). The "WAVE" format consists of two subchunks: "fmt " and "data": The "fmt " subchunk describes the sound data's format: 12 4 Subchunk1ID Contains the letters "fmt " (0x666d7420 big-endian form). 16 4 Subchunk1Size 16 for PCM. This is the size of the rest of the Subchunk which follows this number. 20 2 AudioFormat PCM = 1 (i.e. Linear quantization) Values other than 1 indicate some form of compression. 22 2 NumChannels Mono = 1, Stereo = 2, etc. 24 4 SampleRate 8000, 44100, etc. 28 4 ByteRate == SampleRate * NumChannels * BitsPerSample/8 32 2 BlockAlign == NumChannels * BitsPerSample/8 The number of bytes for one sample including all channels. I wonder what happens when this number isn't an integer? 34 2 BitsPerSample 8 bits = 8, 16 bits = 16, etc. 2 ExtraParamSize if PCM, then doesn't exist X ExtraParams space for extra parameters The "data" subchunk contains the size of the data and the actual sound: 36 4 Subchunk2ID Contains the letters "data" (0x64617461 big-endian form). 40 4 Subchunk2Size == NumSamples * NumChannels * BitsPerSample/8 This is the number of bytes in the data. You can also think of this as the size of the read of the subchunk following this number. 44 * Data The actual sound data. [참고 : http://ccrma.stanford.edu/courses/422/projects/WaveFormat/] |
'모종의 음모 > noise cancelling' 카테고리의 다른 글
waveInOpen() waveOutOpen() (0) | 2009.03.26 |
---|---|
sampling rate 관련 의문 (2) | 2009.03.26 |
wav format 관련 문서 (0) | 2009.03.26 |
openGL audio spectrum visualization - sndpeek (0) | 2009.03.19 |
MCI Reference (2) | 2009.03.19 |