• 締切済み

ハミング窓関数とFFT(高速フーリエ変換)を用いて音(WAVE)ファイルを周波数解析したいのですが

FFTを用いてドレミの周波数解析のプログラムを作ろうと勉強しています。 そこで理論的にわかっていないため質問させていただきました。 ハミング窓の使い方についてです。 ドレミファソラシドと1secごとに変化していくWAVEファイルがあった場合。(0-1秒=ド 1-2秒=レ) 1:0~50msハミング窓を与えてやる 2:その区間をFFTする。(データ数は512で考える) 3:求まった基本周波数からドレミの判定を行う 4:50msずらす 5:1に戻る ※汚いですが手書きで自分の↑のイメージを書いて見ました。http://www.jpdo.com/link/1/img/49864.jpg このようにして9秒まで分割して計算すればドレミの解析が出来るはずだと思っているのですが、どうやってハミング窓を0~50msなどという風に使えばいいのかがわかりません。 このあたりの概念がさっぱりなので、 どうすれば0~50msの区間をハミング窓で得られるのか。 ハミング窓で得た区間をFFTするにはどう考えるのか。 を是非教えてください。

みんなの回答

  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.2

>for(i=0; i<8000 ;i=i+j){ > for(j=0; j<4000 ;j++){ > /*元のWAVEデータに窓関数を掛ける*/ > } >} これだと、i=i+j の、jは未定義ってことになってしまいますが。 for(i=0; i<8000-0.05*8000; i+=0.03*8000) { // 30msごとずらす  for(j=0; j<0.05*8000; j++) { // 50ms幅の窓関数をかける   clippedData[j] = data[i+j] * hamming[j];   fftresult = FFT(clippedData);  } } みたいな感じになるはずです。

_tatu
質問者

お礼

なるほど 参考になります。 これを参考にしてちょっと色々といじってみます。ありがとうございました。 また質問があったときはよろしくお願いします!

  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.1

フローはだいたい合ってると思います。 で、肝心の質問なんですが、 >どうすれば0~50msの区間をハミング窓で得られるのか ていう質問の意味がよく分かりません。 つまり1~5のうちの何が分からないと言っているのですか? 台(サポート)が0~50msがなるハミング関数がわからないってことですか?

_tatu
質問者

お礼

日本語が変で申し訳ないです。 自分もよくわかってないため日本語にうまくできないのですが 1:の 一定区間ごとにハミング関数を掛ける方法がわかりません。 時間ごとの周波数変化を見るためには、区間で分割してハミング関数をかけてFFTすればいい。 これはわかっているのですが、区間で分割するってどうするんだろう?と。 JPGの方でもイメージは掴めているのですが、実際どう使えばいいのかがわかりません。 例えば1秒のWAVEでサンプリング周波数が8000の場合 >for(i=0; i<8000 ;i=i+j){ > for(j=0; j<4000 ;j++){ > /*元のWAVEデータに窓関数を掛ける*/ > } >} このようにすれば、0-50msと50-100msには同じ形の窓関数が適用されるという事でしょうか? 1つのファイルを何個かに区切って窓関数を掛けたりDFTする方法とかがよくわかりません。