投稿

2019の投稿を表示しています

ホワイトノイズを生成する

イメージ
最近まで、ホワイトノイズを作るには、一様乱数を使えばよいと思っていた。 たしかに一様乱数でも、ちゃんと周波数特性が均一なホワイトノイズになる。シンセやAudacity等でホワイトノイズを生成すると、たいてい一様乱数が出てくる。 しかし、信号処理の世界では 正規乱数 (値が正規分布的に分布する乱数)を使うほうが一般的らしい。 正規乱数によるホワイトノイズのことを「ホワイトガウシアンノイズ」と呼ぶこともある。 なぜ一般的な信号処理で「正規乱数によるノイズ信号」(ガウシアンノイズ)を使いがちなのかというと、正規乱数は「最も平均的なノイズ信号」といえるからだ。 あらゆる雑音信号をたくさん集めて平均していくと、集めれば集めるほど正規乱数に近づいていく(これは 中心極限定理 から言える)。 また、ガウシアンノイズは数学的に扱いやすい性質がいろいろとあり(ここでは詳細は省く)、数式上の利便性もある。 調べたところ、正規乱数のメジャーな生成方法には、おおよそ3種類があるらしい。 1. 一様乱数を12回足して6を引く(近似) 中心極限定理をそのまま利用した方法。 一様乱数を たくさん足し合わせて平均 すれば、正規乱数に近いものが得られる。 近似なので精度は高くないが、ちょっとした用途ならこれで十分かもしれない。 また、乱数を1つ作るのにループを要するため、大量に生成する場合には遅いという話も聞く。 亜種として「16回足して8を引く」実装もある(例: Web上で音声合成ができる  PinkTrombone )。 要するに $2N$ 回足して $N$ を引けばよい。 2. ボックス・ミュラー法 2つの一様乱数 $ 0 < a, b < 1 $ をもとに、2つの正規乱数 $ x, y $ を生成する方法。 $ x = \sqrt{-2 \log a} \cos 2 \pi b $ $ y = \sqrt{-2 \log a} \sin 2 \pi b $ おそらく最も教科書的でよく知られている方法で、実装も簡単。 三角関数・対数・平方根といった数学関数を使うことになるので、オーディオ信号生成のように大量の乱数が必要な用途ではもっと高速化したくなるケースがあるかもしれない。 3. ジッグラト・アルゴリズム 超ざっくりいうと、ルックアップテーブルを使う方法。