タイトルの通りwavファイルのデータを、フーリエ変換したいです。
こちらの記事をもとに下記のwavファイルデータ抽出部を作成しました。
C++
1#pragma comment ( lib, "winmm.lib" ) 2 3#include <windows.h> 4#include <tchar.h> 5#include <stdio.h> 6#include <stdlib.h> 7#include "sslib.h" 8 9 10// Waveファイルオープン関数 11bool openWave(TCHAR *filepath, WAVEFORMATEX &waveFormatEx, char** ppData, DWORD &dataSize) { 12 if (filepath == 0) 13 return false; 14 15 HMMIO hMmio = NULL; 16 MMIOINFO mmioInfo; 17 18 // Waveファイルオープン 19 memset(&mmioInfo, 0, sizeof(MMIOINFO)); 20 hMmio = mmioOpen(filepath, &mmioInfo, MMIO_READ); 21 if (!hMmio) 22 return false; // ファイルオープン失敗 23 24// RIFFチャンク検索 25 MMRESULT mmRes; 26 MMCKINFO riffChunk; 27 riffChunk.fccType = mmioFOURCC('W', 'A', 'V', 'E'); 28 mmRes = mmioDescend(hMmio, &riffChunk, NULL, MMIO_FINDRIFF); 29 if (mmRes != MMSYSERR_NOERROR) { 30 mmioClose(hMmio, 0); 31 return false; 32 } 33 34 // フォーマットチャンク検索 35 MMCKINFO formatChunk; 36 formatChunk.ckid = mmioFOURCC('f', 'm', 't', ' '); 37 mmRes = mmioDescend(hMmio, &formatChunk, &riffChunk, MMIO_FINDCHUNK); 38 if (mmRes != MMSYSERR_NOERROR) { 39 mmioClose(hMmio, 0); 40 return false; 41 } 42 DWORD fmsize = formatChunk.cksize; 43 DWORD size = mmioRead(hMmio, (HPSTR)&waveFormatEx, fmsize); 44 if (size != fmsize) { 45 mmioClose(hMmio, 0); 46 return false; 47 } 48 49 mmioAscend(hMmio, &formatChunk, 0); 50 51 // データチャンク検索 52 MMCKINFO dataChunk; 53 dataChunk.ckid = mmioFOURCC('d', 'a', 't', 'a'); 54 mmRes = mmioDescend(hMmio, &dataChunk, &riffChunk, MMIO_FINDCHUNK); 55 if (mmRes != MMSYSERR_NOERROR) { 56 mmioClose(hMmio, 0); 57 return false; 58 } 59 *ppData = new char[dataChunk.cksize]; 60 size = mmioRead(hMmio, (HPSTR)*ppData, dataChunk.cksize); 61 if (size != dataChunk.cksize) { 62 delete[] * ppData; 63 return false; 64 } 65 dataSize = size; 66 67 // ハンドルクローズ 68 mmioClose(hMmio, 0); 69 70 return true; 71} 72 73int main() { 74 75 // Waveファイルオープン 76 WAVEFORMATEX wFmt; 77 char *pWaveData = 0; //waveファイルのデータが入ってる部分 78 DWORD waveSize = 0; 79 if (!openWave(LPSTR("1secSin.wav"), wFmt, &pWaveData, waveSize)) { 80 printf("Open Failed"); 81 return 0; 82 } 83 printf("Open Success!!!\n"); 84}
この後にこちらのFFTライブラリにあるfft1()
関数を使用し、FFTをかけたいと考えており、まずpWaveData
から2^n乗分memcpy
を使用しコピー後にFFTしようと考えて以下のソースをprintf("Open Success!!!\n");
の下に書き足しました。
C++
1 //FFT用に2^n乗分コピーする; 今回は2^15で32768、つまり48kHzサンプリングした音の0.68秒分をコピーする 2 //今、1サンプルは16bitなので、16(bit数) * 32768(サンプル数)のメモリ量が必要(524288) 3 const int cpySize = (pow(2,15) * wFmt.wBitsPerSample); 4 char* cpyData[524288]; 5 //WAVEDataからコピー 6 memcpy(cpyData, pWaveData, cpySize); 7 double dbData = atof(LPSTR(cpyData)); 8 9 fft1(&dbData, 0,cpySize,0,0 );
この時、ハンドルされない例外が 0x00007FF684FF2DA8 (FFTWave.exe) で発生しました。とエラーが出ました。そこで次の点を教えていただきたいです。最終的にはFFTしたデータをCSVファイルの形で保存したいと考えています。
memcpy()
関数のコピー先のcpyData[]
にcpyData[cpySize]
とするとエラーが出る理由fft1()
関数の引数に持っていくためにdouble*型にする方法fft1()
関数の引数であるnとiterの意味- ハンドルされない例外が 0x00007FF684FF2DA8 (FFTWave.exe) で発生しました。とエラーが出る理由
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/11 10:28
2019/07/11 11:29
2019/07/11 11:33
2019/07/11 11:44