이것은 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 형식의 파일로 작동하는 데 좋은 지침을 가르쳐 줄 수 있다면 크게 감사하겠습니다. 미리 감사드립니다.
데이터를 원하는 형식을 알고 있습니까? FFT 함수가 기대하는 것은 무엇입니까? – RJFalconer
왼쪽/오른쪽에 대해 : 스테레오 소스가 샘플 크기의 두 배 (ByteRate에 numChannels를 곱하는 방법 참조)가 있고 왼쪽/오른쪽이 스트리밍 인터리빙 될 것이라고 말하고 있습니다 ("청크 2Size"에는 양측이 포함되어 있음) . – RJFalconer
Gnu 옥타브 소스의 wavread.m 파일을 살펴 보았습니다.이 파일을 읽을 때 고려해야 할 논리가 있습니다. C++로 복사하려고합니다. 나는 맥박 탐지를하려고 노력 중이며, 옥타브의 wavread 함수에서 생성 된 벡터의 모습에서 FFT가 필요하지 않을 수도 있습니다. 시간에 대해 음모를 꾸미면 시간이지나면서 주파수가 나옵니다. 이제 오디오를 재생하면서 데이터를 동기화하고 펄스 감지를 수행하는 방법을 알아야합니다. –