プロが教えるわが家の防犯対策術!

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するにはどう考えるのか。
を是非教えてください。

A 回答 (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);
 }
}
みたいな感じになるはずです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/11/14 00:47

フローはだいたい合ってると思います。



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

日本語が変で申し訳ないです。
自分もよくわかってないため日本語にうまくできないのですが

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する方法とかがよくわかりません。

お礼日時:2007/11/13 01:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!