今回はpythonでホワイトノイズやピンクノイズを生成する方法をご紹介します。

ホワイトノイズはピンクノイズは睡眠導入に良いとか勉強に集中するのに良いとかいう話で,最近少しだけ話題になったりしているようです。

生成のコードは簡単ですが,実際に周波数特性を観察することで正しく生成できているか確認までしてみましょう!

長時間ホワイトノイズをYOUTUBEに投稿していますので直ぐに利用したい方はお使いください。

ホワイトノイズやピンクノイズって何?

これから生成する信号について少しだけ簡単な導入です。

一般にホワイトノイズとはパワースペクトルが全周波数で一定であるランダムなノイズを指します。

なぜ「ホワイト」かと言うと,光のスペクトルが一定のものは色として白になるからです。

ピンクノイズはパワースペクトルが周波数に反比例(-3dB/oct)するノイズです。

つまりホワイトノイズに比べて低域の方が強調されているようなノイズになっています。

可視光で低域(波長が長い)にいくと赤っぽくなりますのでピンクノイズと呼ばれています。

普段耳にする楽曲はホワイトよりもピンクに近いスペクトルになっていますので,スピーカのエイジングにピンクノイズを使ったりもします。

ちなみに余談ですが,虹は外側ほど波長が長く(赤っぽく)内側ほど波長が短く(紫っぽく)なります。

人間に見えない波長の長い光は赤外線,波長の短い光は紫外線なんて呼びますよね。

この他にも有色雑音と呼ばれるものにはブラウンノイズやブルーノイズなど様々ありますが,これらも可視光との対応でパワースペクトルの特徴によって名前が付けられています。

pythonでノイズ生成

それでは早速pythonでノイズを生成していきます。

生成したノイズはwavファイルとして出力していきますが,wavファイルの書き出しについての詳細は以下の記事をご参照ください。この記事の中のライブラリを使って書き出しを行います。

ホワイトノイズ

ホワイトノイズはnumpy.randomの乱数を使って非常に簡単に作ることができます。

以下インポート部を含んだ生成と書き出しのコードです。

import numpy as np
import wave_func as wf

fs = 48000
length = 2 ** 17
s = np.random.random(size=length)*2 - 1
wf.writeWave("./white_noise.wav", s)

次のような音声ファイルが生成されると思います。

時間波形や周波数特性も描画してみましょう。

fig, ax = plt.subplots()
t = np.linspace(0, length/fs, length)
ax.plot(t, s, color="steelblue")
ax.set_title("Time domain")
ax.set_xlabel("Time[s]")
ax.set_ylabel("Amplitude")
fig.tight_layout()
plt.show()

これで以下のような時間波形が出力されます(乱数のseedを固定していないので各自詳細は異なります)。

次に周波数特性です。

S = np.fft.rfft(s)
fig, ax = plt.subplots()
freq = np.linspace(0, fs/2, len(S))
ax.set_xscale("log")
ax.plot(freq, 20*np.log10(np.abs(S)), color="crimson")
ax.set_title("Frequency domain")
ax.set_xlabel("Frequency[Hz]")
ax.set_ylabel("Level[dB]")
fig.tight_layout()
plt.show()

きちんとホワイトノイズになっていることが分かりますね。

ピンクノイズ

ピンクノイズの作り方は幾つかありますが,ここでは簡単な方法で生成します。

具体的にはホワイトノイズをまず生成して,周波数領域でフィルタを掛けることで実現していきます。

それでは生成&書き出しのコードです。

fs = 48000
length = 2 ** 17
tmp = np.random.random(size=length)*2 - 1
S = np.fft.rfft(tmp)
fil = 1 / (np.arange(len(S))+1)
S = S * fil
s = np.fft.irfft(S)
s /= np.max(np.abs(s))
wf.writeWave("./pink_noise.wav", s)

次のような音になります。

時間波形と周波数特性の描画コードは同じなので結果だけ示します。

横軸を対数軸として線形に減衰しているのが分かりますね。

局所時間での周波数を見たい方もいらっしゃると思いますので,おまけでホワイトノイズとピンクノイズそれぞれのスペクトログラムも載せておきます。

全体の周波数特性を見るより少し安心かもしれませんね。

スペクトログラムの描画について知りたい方は以下の記事をご参照ください。

まとめ

お疲れ様でした。

今回はノイズの中でもよく用いられるホワイトノイズとピンクノイズの生成コードを紹介しました。

研究でもよく使われる音源なので自分好きな長さのものを生成できるようになっておくと便利かと思います。

何かご質問等ある方はTwitterアカウント(@moromisenpy)の方にお尋ね頂けますと幸いです。