質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

1回答

4295閲覧

C++でWAVファイルのデータをFFTにかける

YMD_kts

総合スコア23

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/07/11 09:57

タイトルの通り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) で発生しました。とエラーが出る理由

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

memcpy(cpyData, pWaveData, cpySize);

これ、どんだけのサイズをコピーしてるんでしょうか

fft1(&dbData, 0,cpySize,0,0 );

んで、この関数の定義がないようですが、第一引数がどーみても間違ってるように思えます

投稿2019/07/11 10:20

編集2019/07/11 10:25
y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2019/07/11 10:28

おお、バグ?で回答の編集ができん。。 最終行は以下 んで、この関数の定義がないようですが、第一引数がどーみても間違ってるように思えます
YMD_kts

2019/07/11 11:29

回答有り難うございます。 wavデータから2の15乗サンプルコピーしたく、16bitでサンプリングしてあるため2^15*16bitコピーしようと思ったのですが、memcpyの定義を確認したら最期の指定サイズはbyteでしたので8で割算したいと思います。 第1引数には実数部だと思うのでwavデータを入れました
y_waiwai

2019/07/11 11:33

WAVデータは入ってませんぜ atof関数って何なのか調べてみよう
YMD_kts

2019/07/11 11:44

あ、アルファベット類のデータは0になりますね...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問