Gstreamer でピンクノイズを出力したり、スペクトルを測定したりしてみる

マイクを使ったイベントでは、スピーカーやミキサーで調整することがあると思います。しかし、 PA 作業をミスするとハウリングが発生し、悲しいことになります。勉強会イベントではまだましですが、音楽系のイベントでは最悪の事態と行ってもよいでしょう。
ハウリングの原因には、マイクとスピーカーの位置関係、ボリュームの上げすぎ、話者がマイクから離れすぎなどがありますが、部屋や箱の共振というのも原因の一つです。ハウリングは単一周波数で発生することが多いので、あらかじめノイズを発生させて部屋や箱の周波数特性を調べ、その部分をイコライザーでカットすることで防ぐことができます。
Linux マシンで、このテストを行うため、 GStreamer でノイズを発生させたり、マイクからの信号を周波数スペクトルに変換したりしてみます。まだ、現場で使ったことは無いのですが、今後試してみる予定です。

まずは、音を出すところから。

$ gst-launch-1.0 audiotestsrc ! autoaudiosink
…
Freeing pipeline ...

この audiotestsrc エレメントを調べてみます。

$ gst-inspect-1.0 audiotestsrc
…
Element Properties:
…
  wave                : Oscillator waveform
                        flags: 読み込み可能, 書き込み可能, コントロール可能
                        Enum "GstAudioTestSrcWave" Default: 0, "sine"
                           (0): sine             - Sine
                           (1): square           - Square
                           (2): saw              - Saw
                           (3): triangle         - Triangle
                           (4): silence          - Silence
                           (5): white-noise      - White uniform noise
                           (6): pink-noise       - Pink noise
                           (7): sine-table       - Sine table
                           (8): ticks            - Periodic Ticks
                           (9): gaussian-noise   - White Gaussian noise
                           (10): red-noise        - Red (brownian) noise
                           (11): blue-noise       - Blue noise
                           (12): violet-noise     - Violet noise
  freq                : Frequency of test signal
                        flags: 読み込み可能, 書き込み可能, コントロール可能
                        Double. Range:               0 -           20000 Default:             440 
…

audiotestsrc エレメントの Element Property: の wave と freq でいろいろ調整できることが分かります。今回は pink-noise を出力したいので以下のようにします。

$ gst-launch-1.0 audiotestsrc wave=pink-noise ! autoaudiosink

スピーカーからピンクノイズが発生します。ヘッドフォン端子などからミキサーにつなぐと、会場にピンクノイズを流せます。くれぐれも音量には注意してください。

さて、本当にピンクノイズが出ているのか、スペクトルを見てみます。最初は 440Hz と 4400Hz のスペクトルを表示してみます。それっぽいところにピークが立つと思います。

$ gst-launch-1.0 audiotestsrc ! audioconvert ! spectrascope ! videoconvert ! autovideosink
…
$ gst-launch-1.0 audiotestsrc freq=4400 ! audioconvert ! spectrascope ! videoconvert ! autovideosink
…

では早速、pink-noise を見てみます。

$ gst-launch-1.0 audiotestsrc wave=pink-noise ! audioconvert ! spectrascope ! videoconvert ! autovideosink
…

pink-noise のスペクトルが見えたでしょうか?それでは、マイク(デフォルトの音声入力)から入力してみます。

$ gst-launch-1.0 autoaudiosrc ! audioconvert ! spectrascope ! videoconvert ! autovideosink
…

マイクの前で話したり手を叩いたりすると、スペクトルが変化する様子が解ると思います。

実際には、ピンクノイズを出力した状態でスペクトルを測定し、ピークが立っている波長をイコライザーで落として上げることになります。ハウリングのないイベントになるといいですね。