Pure Data入門講座 vol. 2 〜時間波形 / 周波数波形〜

By terada, 2015年9月30日


前回の第1回目Pure Data入門講座と言うことで、音の録音と再生が出来るプログラムを作ってみました。なんとなくPure Dataで書くプログラムがどんな感じかつかめたでしょうか?

今回の第2回目Pure Data入門講座も基礎編ということで簡単な波形の解析か出来るオシロスコープを作ってみます。オシロスコープとは時間とともに信号の変化の様子を観測出来る測定器のことです。ここでは音信号の時間波形と周波数波形を観測出来るプログラムを作ります。時間波形と周波数波形を観測出来るプログラムは広い範囲で応用できるのでぜひ試しに作ってみてください。

Pdで音の時間波形を表示しよう

前回は1秒間の音の波形をグラフに表示しました。今回はもっと短い時間の波形を、時間とともに変化させながら表示します。まずは波形を表示する部分を前回同様このように作りましょう。

pd02_01pd02_02

ここで一つだけ変更を加えます。array1のサイズを44100から1764に変更します。これが何を意味するかと言うと、サンプリング周波数 = 1秒間のデータの数だったので、グラフの横軸を1764 / 44100 = 0.04 秒に変更したことになります。サンプリング周波数 × 時間 = データ点数時間 = データ点数 / サンプリング周期という関係を覚えておくと計算が簡単です。男声の基本周波数が125 Hz(周期 1 / 125 = 0.008 s)くらいなので、これくらいのグラフのサイズの方が波形の変化を見やすくなります。さてこの状態からあと二つパーツを加えます。

pd02_03

“metoro 100”と四角いボックスを追加しました。metoroとはメトロノームの様にある間隔でbangを出力する関数です。出力する間隔は ms (1/1000秒)の単位で指定します。この場合は 100 msごとにbangを出力します。また四角いボックスはToggleボックスと呼ばれるパーツで、チェックボックスの様な機能を持つパーツです。ここまで出来たら、実行モードにしてDSPをオンの状態でToggleボックスをクリックしてみてください。うまく行けばPCに取りこんでいる音の波形が表示されると思います。このように音の時間波形を短い間隔で表示することができます!

Pdで音の周波数波形を表示しよう

それでは次に音の周波数波形を表示するプログラムを作ります。まずは波形を表示する領域array2を作ります。array2のサイズは368点としておきます、この数字の理由はまた後で解説します。また”キャンパスのプロパティ”というボックスも表示されていると思うので、ここの”Y値の範囲”を”始点: 100, 終点: 0″に変えておいてください。

 pd02_06

続いて音の周波数を求めるプログラムを作りますが、少々長くなるのでこのままではスペースが足りずにプログラムが見づらくなってしまいます。そんな時はサブパッチと呼ばれるパーツを作ると便利です。ここでは下図のように”pd freq”というサブパッチを作ってみました。配置すると右図の様に新しいパッチfreqが作成されます。このようにパッチの中にサブパッチを作って見やすいプログラムを作ることも出来ます。

pd02_04pd05

サブパッチにプログラムを書く前にちょっとだけ信号処理のお話をしましょう。信号の周波数を求めるにはフーリエ変換と呼ばれる作業が必要になります。ディジタル信号処理では信号をある点数分切り取ってフーリエ変換をして周波数を求めます。切り取った時間信号をx(n)としたとき、離散フーリエ変換をした信号X(k)から、信号の周波数成分を表わす振幅周波数特性は10 \log_{10} | X(k) | ^2という計算で求められます。これをそれぞれのパッチで書くとこのようになります。

pd02_08pd02_07

それぞれのボックスを簡単に説明すると

  • block~ 4096: 信号を4096点づつ切り出す
  • inlet~ (左側): 親パッチからの音入力
  • inlet (右側): 親パッチからのbang入力
  • rfft~ : 離散フーリエ変換→ 左側から実部、右側から虚部を出力
  • *~: かけ算 → この場合実部と虚部を二乗している
  • +~ : 足し算
  • sqrt~: 平方根
  • rmstodb~ : 実効値をdB値へ(1を100 dBへ変換)
  • clip~ : 最大値と最小値でデータをカット

という処理をしています。数式をそのままプログラムで表現していることがわかります。さてここで先程array2のサイズを368点にした理由ですが、周波数の表示範囲に関係しています。今ブロックサイズ(信号を切り出すサイズ)を4096点に指定しているので、ちょうど4096点目のデータがサンプリング周波数の44100 Hzに相当します。なので368点目のデータは44100 × 368 / 4096 = 3962.109375…となり約4 kHzを表わすことになるので、array2の右端の周波数は約4 kHzを表示することになります。周波数 = サンプリング周波数 × (データ点数 / ブロックサイズ)という関係を覚えておくと便利です。

さてもっともシンプルな時間波形と周波数波形を表示するプログラムを作ってみました。実際は、周波数波形を表示するには窓関数をかけたりすることでよりはっきりと周波数特性を表示することも出来ます。また波形の軸を変換出来るとより使い勝手が向上すると思います。信号の時間波形と周波数波形を見ることはどのような音が作られているかを確認するとても大事な手法です。ぜひ様々なプログラムで利用してください!

pd02_09

世田谷区三軒茶屋の大人の学び場Soraoto。サイエンスカフェなどのイベント、各種セミナー・講演などを行う大人の学び場です。英会話教室も行っておりますので、受付はお問い合わせフォームから、気軽にお申し込みください。

logo2