2014-02-17 3 views
2

이것은 wav 파일과 fft 모두에서 처음 사용하는 작업입니다. 주어진 다음 코드 :C++ wav 파일 데이터에 FFT 적용

char* loadWAV(const char* fn, int& chan, int& samplerate, int& bps, int& size){ 
     char buffer[4]; 
     ifstream in(fn, ios::binary); 
     in.read(buffer, 4);                //ChunkID "RIFF" 
     if(strncmp(buffer, "RIFF", 4) != 0){ 
       cerr << "this is not a valid wave file"; 
       return NULL; 
     } 
     in.read(buffer,4);                //ChunkSize 
     in.read(buffer,4);                //Format "WAVE" 
     in.read(buffer,4);                // "fmt " 
     in.read(buffer,4);                // 16 
     in.read(buffer,2);                // 1 
     in.read(buffer,2);                // NUMBER OF CHANNELS 
     chan = convertToInt(buffer,2); 
     in.read(buffer,4);                // SAMPLE RATE 
     samplerate = convertToInt(buffer,4); 
     in.read(buffer,4);                // ByteRate 
     in.read(buffer,2);                // BlockAlign 
     in.read(buffer,2);                // bits per sample 
     bps = convertToInt(buffer,2); 
     in.read(buffer,4);                // "data" 
     in.read(buffer,4); 
     size = convertToInt(buffer,4); 
     char * data = new char[size]; 
     in.read(data,size); 
     return data; 
} 

데이터 포인터에 필요한 정보가 포함되어 있다고 가정하지만이 정보를 식별하는 방법을 모르겠습니다. this을 참조로 사용하고 있지만 "올바른 채널 왼쪽 채널"특성과이 데이터를 FFT에서 사용하도록 준비하는 방법을 알지 못합니다. 감사합니다. 감사합니다. 감사합니다. 감사합니다. 감사합니다. 감사합니다.

편집 : 또한 누군가가이 수준에서 wav 형식의 파일로 작동하는 데 좋은 지침을 가르쳐 줄 수 있다면 크게 감사하겠습니다. 미리 감사드립니다.

+0

데이터를 원하는 형식을 알고 있습니까? FFT 함수가 기대하는 것은 무엇입니까? – RJFalconer

+0

왼쪽/오른쪽에 대해 : 스테레오 소스가 샘플 크기의 두 배 (ByteRate에 numChannels를 곱하는 방법 참조)가 있고 왼쪽/오른쪽이 스트리밍 인터리빙 될 것이라고 말하고 있습니다 ("청크 2Size"에는 양측이 포함되어 있음) . – RJFalconer

+0

Gnu 옥타브 소스의 wavread.m 파일을 살펴 보았습니다.이 파일을 읽을 때 고려해야 할 논리가 있습니다. C++로 복사하려고합니다. 나는 맥박 탐지를하려고 노력 중이며, 옥타브의 wavread 함수에서 생성 된 벡터의 모습에서 FFT가 필요하지 않을 수도 있습니다. 시간에 대해 음모를 꾸미면 시간이지나면서 주파수가 나옵니다. 이제 오디오를 재생하면서 데이터를 동기화하고 펄스 감지를 수행하는 방법을 알아야합니다. –

답변

1

데이터는 PCM 패킷입니다.

는 출발점으로이 질문을 시도해보십시오

질문의 FFT 부분에 대해서는 https://dsp.stackexchange.com/을 고려해보십시오.

+0

gnu 옥타브 소스 (wavread.m)에서 코드를 사용하려고 생각했습니다. 편리하게 데이터를 벡터로 읽어 들여 적절한 주파수를 제공했습니다. 그것을 C++ 함수로 변환하는 것입니까? 이것은 데이터를 직접 처리해야하고 데이터 스트림을 오디오와 동기화하는 방법을 찾아야한다는 것을 의미합니다. 별도의 샘플 버퍼에서 wav 스트림을 재생할 때 openal을 사용한다면 다중 스레드를 사용해야합니까? –

+0

나는 펄스 탐지를하려고하는데, 최종 목표는 로봇을 wav 파일로 춤추는 것이다. 감사. –

+1

많은 질문이 있습니다. RE : C++, 당신이 편안하게 느끼는 언어를 사용하십시오. C++은 좋은 방법입니다. RE : 스트림을 동기화하면 대개 매우 어렵습니다. RE : 다중 스레드, 가장 가능성이 있지만 제작자 - 소비자 패턴으로 전환하기 전에 하나의 큰 버퍼에서 작업하는 데 집중해야합니다. 희망이 도움이됩니다. – RJFalconer