STFT)を実装してみます。音声信号スペクトルの時間変化を解析する手法です。ある一定の長さの信号サンプルを切り出し、それに窓関数をかけてからフーリエ変換という手順を切り出す範囲を少しずつずらしながら行います。音声を再生しながらリアルタイムにフーリエ変換する必要があるので高速フーリエ変換(2011/6/18)を使ってみます。Playerなどの音楽プレイヤーでよく見るスペクトルアナライザ(っぽいもの)を作ります。今まで離散フーリエ変換(2011/6/11)や高速フーリエ変換(2011/6/18)を試したときには、切り出した波形サンプルをそのままフーリエ変換していました。一般的に、切り出した波形に窓関数をかけてからフーリエ変換する方がよいとのこと。フーリエ変換は切り出した範囲が周期関数であることを仮定していますが、適当に切り出すと端っこがきれいにつながらず周期関数にならないという問題があるためです。窓関数をかけることで端っこがなめらかにつながり周期関数にできます。窓関数を使う理由は、窓関数を用いる理由のページがわかりやすかったです。Numpyの窓関数を試してみます。1))show()実行すると、のようになります。functionsを見ると、Numpyには5種類の窓関数があります。ちなみにScipyにはもっと多くの窓関数があります。いう使い分けをするのか、いまいちよくわかりませんが、実際に使われるのは、ハミング窓とハニング窓(ハン窓)だそうです。次に、窓関数をかけないときとかけたときでスペクトルがどのように変化するかを試してみます。窓関数をかけるには、元の信号に窓関数の信号を単に掛け算するだけです。show()実行結果は、のようになります。combined.wavは440Hzと880Hzの2つの正弦波を混ぜた信号です。作り方は、正弦波の合成(2011/6/7)を参照。左側はオリジナルの信号とそのスペクトル、右側がハミング窓をかけた信号とそのスペクトルです。今回は、512サンプルを切り出してFFTしてますが、オリジナルの信号は切り出した区間の左端と右端の位置がずれていて周期関数になってません(ちょっとわかりにくいけど)。このように両端が不連続になるとそのスペクトルは440Hzと880Hz以外の成分も含まれてしまい、スペクトルのピークのすそが広がっていることがわかります。窓関数をかけると左端と右端が0に近くなって滑らかにつながり周期関数になります。窓関数をかけるとスペクトルのピークが鋭くなる様子がわかります。スペクトルアナライザ最後に、短時間フーリエ変換を用いてスペクトルアナライザを作ります。matplotlibは、単にグラフを描画するだけではなく、アニメーションさせることもできます。アニメーションさせるにはwxPythonというライブラリが必要なので実行する場合は別途インストールしてください。update)plt.show()tamsu02.wavは、波形を見る(2011/5/19)で紹介した音楽ファイルです。元は、MP3なのでffmpegで8000Hz、16bitのWAVEに変換しています。ここでは、512サンプルを切り出してハミング窓をかけてからFFTしてスペクトルを求めています。その後、128サンプルだけ窓をずらしてハミング窓をかけてからFFTというのを何度も繰り返しています。上のプログラムを実行すると下のようにスペクトルの変化が動画で表示されます。(3)(2012/7/7)の続き。今回は、SPTKでフーリエ...2012-04-15線形予測分析(LPC)Pythonで音声信号処理(2011/05/14)の第20回目。以前、ケプス...2012-02-25メル周波数ケプストラム係数(MFCC)Pythonで音声信号処理(2011/05/14)の第19回目。今回は、音声...2012-02-11ケプストラム分析Pythonで音声信号処理(2011/05/14)の第18回目。»プロフィールid:aidiary人工知能とその関連分野に興味があります。)はてなブログをはじめよう!aidiaryさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。