職場の音をフーリエ変換(ShanonAdventCalendar2017・7日目)

このエントリーをはてなブックマークに追加
この記事はShanonAdventCalendar2017・7日目の記事です。

こんにちはKomaDです。

突然ですが、皆様はどんなオフィスでお仕事されていますでしょうか。巨大な自社ビルから、自宅の押入れまで様々な環境があると思いますが、どこにいても気になるのが職場の音環境です。

私は社会人になりたてだった頃に、隣席の大変お世話になった先輩が机が揺れるぐらいの強さでEnterキーを押されるので柔らかいリストレストを購入して対策したり、人の声が気になるときにサーバ室に長時間こもって作業をして体調を崩すなど、音環境について色々関心を持って取り組んできました。

今日は今のオフィスの音を調べてみようと思い、プログラムを作って見ました。

コードは次の手順で実行できます。

1. マイクがついているPCを用意します。

2. 公式サイト(https://processing.org/)で Processing をダウンロードします。
  *ちなみに動作確認は、Ver. 3.3.5でやってます。

3. minim というライブラリを使っているので、 Processing の Contribution Manager でライブラリを追加します。
  *Mac版のProcessingなら、メニューのスケッチ>ライブラリをインポート>ライブラリを追加で呼び出せます。

4. 下のコードを貼り付けて実行します。

// 標準サウンドライブラリのMinimを使用
import ddf.minim.analysis.*;
import ddf.minim.*;
Minim minim;

// オーディオ入力
AudioInput in;

// FFT 高速フーリエ変換のクラス
FFT fft;

// 事前準備
void setup()
{
  size(600, 300);
  minim = new Minim(this);

  // ステレオオーディオ入力を取得、FFTに渡します
  in = minim.getLineIn(Minim.STEREO, 512);
  fft = new FFT(in.bufferSize(), in.sampleRate());
}

// 描画します
void draw()
{
  // 背景色
  background(0);
  // 線の色
  stroke(255);

  // 高速フーリエ変換を行う
  fft.forward(in.mix);

  // 棒グラフを描画します
  int specSize = fft.specSize();
  for (int i = 0; i < specSize; i++)
  {
    // それぞれの周波数について、画面横幅に対する位置を決めます
    float x = map(i, 0, specSize-100, 0, width);
    
    // それぞれの周波数の音量について縦の線を描画して表現します
    line(x, height, x, height - fft.getBand(i) * 15);
  }
}

// プログラム終了
void stop()
{
  minim.stop();
  super.stop();
}


うまく動いたでしょうか、実行できれば黒い画面にマイクが拾った音からそれぞれの周波数でどのくらい音が出ているか白い線で表示されるはずです。
これだけだとスマートフォンの録音アプリなどと変わりませんが、ProcessingはArduinoなどと簡単に連携できるので、環境音が大きくなってきたらLEDをチカチカさせて警告したり、対抗してビープ音を発したりする拡張もできると思います。

ちなみにこれでしばらくオフィスの音を眺めていたのですが、意外と人の話し声や物音よりも自分のキーボードの打鍵音などの方が大きいようで、元々それなりに静かな環境にいたことがわかりました。

周りの音が気になってしまうのは、自分の心が鍛えられていなかっただけだったと気づき、今は反省をしています。
あと、これを動かしているといろんな騒音に興味が湧いて、周りで人が話したり物音が立つたびに、どの辺の周波数の音が出ているのか気になって、逆にオフィスが騒がしくなるのが楽しみになりました。

年末年始で世間も騒がしい時期になりますが、全ての音を受け入れる広い心を鍛えるために少しでもお役に立てたら幸いです。
次の記事
« Prev Post
前の記事
Next Post »
Related Posts Plugin for WordPress, Blogger...