ピンク()擬似ランダムノイズ生成


20

(ピンク)ノイズへの優れた擬似ランダム近似を生成するためのアルゴリズムで、整数DSPの低計算コストでの実装に適したものは何ですか?1/f


メモリはどうですか?それが心配ではないが、計算が必要な場合は、目的の周波数曲線のランダム位相iDFTを実行し、デバイスに静的constウェーブテーブルとして保存します。
左辺約

@leftaroundabout-または、ランダムホワイトノイズのDFTに1 / f周波数曲線を掛けてから、IDFTを実行すると、ランダム性が向上しますか?
hotpaw2

1
ホワイトノイズ基本的に定数関数のランダム位相iFTであるため、それほど大きな違いはありません。

回答:


11

6
そのサイトがダウンした場合、答えは消えます。各ソリューションの基本を引き継ぐと、サイトを参照として使用して、答えが大幅に改善されます。
-Kortuk

@Kortuk:答えはコミュニティWikiですので、自分で自由にやってください!そこにある情報は、他のWeb参照(最初のオプションに対するデータガイストの答えなど)を指すのに十分なはずです。しかし、私はより多くの詳細が良いことに同意します。
ピーターK.

20

線形フィルタリング

ピーターの答えの最初のアプローチ(ホワイトノイズのフィルタリング)は、非常に簡単なアプローチです。でスペクトルオーディオ信号処理、JOSを生成するために使用することができる低次フィルタ与えるまともな近似を伴って、解析結果のパワースペクトル密度は、理想的に一致どれだけの。線形フィルタリングは常に近似値を生成しますが、実際には問題にならない場合があります。JOSを言い換えると:

ホワイトノイズからピンクノイズを生成できる正確な(合理的な有限次数の)フィルターはありません。これは、フィルターの理想的な振幅応答が無理関数に比例する必要があるため です。ここで、はHz単位の周波数を示します。ただし、知覚的に正確なものを含め、任意の近似度でピンクノイズを生成するのは簡単です。 f1/ff

彼が与えるフィルターの係数は次のとおりです。

B = [0.049922035, -0.095993537, 0.050612699, -0.004408786];
A = [1, -2.494956002, 2.017265875, -0.522189400];

これらは、MATLABフィルター関数へのパラメーターとしてフォーマットされているため、明確にするために、次の伝達関数に対応します。

H(z)=.041.096z1+.051z2.004z312.495z1+2.017z2.522z3

明らかに、実際には係数の完全な精度を使用することをお勧めします。そのフィルターを使用して生成されたピンクノイズがどのように聞こえるかへのリンクを次に示します。

固定小数点の実装では、通常[-1,1)の範囲の係数を使用する方が便利なため、伝達関数の再加工が適切に行われます。一般的に、推奨事項は2次セクション分割することですが、その理由の一部は(1次セクションを使用するのではなく)根が複雑な場合に実際の係数を操作するためです。この特定のフィルターの場合、すべての根は実数であり、それから2次セクションに結合すると、おそらく1以上の分母係数が得られるため、次のように3つの1次セクションが妥当な選択です。

H(z)=1b1z11a1z1 1b2z11a2z1 1b3z11a3z1

どこで

a 1 = 0.99516897 a 2 = 0.94384177 a 3 = 0.55594526

b1=0.98223157, b2=0.83265661, b3=0.10798089
a1=0.99516897, a2=0.94384177, a3=0.55594526

オーバーフローを防ぐには、これらのセクションの順序を慎重に選択し、各セクションのゲイン係数を選択する必要があります。Peterの回答のリンクに記載されている他のフィルターは試していませんが、おそらく同様の考慮事項が当てはまります。

白色雑音

明らかに、フィルタリングアプローチでは、そもそも一様な乱数のソースが必要です。ライブラリルーチンが特定のプラットフォームで使用できない場合、最も単純なアプローチの1つは、線形合同ジェネレーターを使用することです。効率的な固定小数点実装の1つの例は、TMS320C5xでの乱数生成(pdf)で TIによって提供されています。さまざまな他の方法の詳細な理論的議論は、ジェームズ・ジェントルによる乱数生成とモンテカルロ法にあります。

資源

Peterの回答の以下のリンクに基づくいくつかの情報源は、強調する価値があります。

  • コードの最初のフィルターベースのチャンクは、Orfanidisによる信号処理の概要を参照しています。全文はそのリンクで入手でき、[付録Bで]ピンクとホワイトの両方のノイズ生成について説明しています。コメントが言及しているように、Orfanidisは主にVossアルゴリズムをカバーしています。

  • Voss-McCartneyピンクノイズジェネレーターによって生成されるスペクトル。Vossアルゴリズムのバリエーションについて詳細に説明した後、ページの下部にあるこのリンクは、巨大なピンク色の文字で参照されています。上記のASCIIダイアグラムのいくつかよりも読みやすくなっています。

  • ウェンティアン・リーによる1 / fノイズに関する書誌。これは、PeterのソースとJOSの両方で参照されています。一般に1 / fノイズに関する目を見張るほどの数の参照があり、1918年までさかのぼります。


彼がどのようにしてこれらのフィルター係数を思いついたのでしょうか?私はそれが望ましい勾配への単なる非線形適合であると思いますが、より具体的なアルゴリズムがあるかどうか知りたいと思います。
-nibot

私の最良の推測は彼の論文で言及された近似技術の1つでしょう。どちらの方法でも素晴らしい読み物です。
データガイスト

うわー、それはかなりのドキュメントです!リンクをありがとう。
-nibot

1
フィルターホワイトノイズ法の問題は、自己相関時系列で行うのと同じ振幅位相関係が得られないことです。したがって、自然なプロセスをエミュレートしようとしている場合、ホワイトノイズを生成してフィルタリングしないでください。実際には、自己相関ノイズを時系列として作成する必要があります。つまり、現在の値は前の値+ノイズに依存します。統計の「AR」プロセスを参照してください。これをテストするには、両方の方法、次にFFTを使用してノイズを生成し、実数対虚数(周波数領域の複素平面)をプロットします。あなたは、パターンに大きな違いに気付くでしょう
ポール・S

こんにちはPaul、DSP.SEへようこそ。ノイズがどのように聞こえるかに注意するだけの場合(たとえば、オーディオの動作)、振幅スペクトルが主な関心事です。ただし、新しい回答で自分の考えを詳しく説明できれば素晴らしいと思います。私はまだそのテクニックを説明しているサイトに何かあるとは思わない。
データガイスト

1

1990年からCorsiniとSalettiのアルゴリズムを使用しています。G。Corsini、R。Saletti、「A 1 / f ^ガンマパワースペクトルノイズシーケンスジェネレータ」、IEEE Transactions on Instrumentation and Measurement、37(4)、1988年12月、615 -619。ガンマ指数は-2〜+2です。私の目的にはうまくいきます。エド

このスクリーンショットを追加する試みが機能する場合、以下の図は、Corsini and Salettiアルゴリズムのパフォーマンスの例を示しています(少なくとも1990年にプログラミングしたとき)。サンプリング周波数は1 kHz、ガンマ= 1で、1000個の32k FFT PSDが平均化されました。

CorsiniおよびSalettiアルゴリズムによる1 / fノイズのPSD


これは、以前のCorsini and Saletti(C&S)ノイズジェネレーターに関する投稿に続きます。次の2つの図は、低周波数(ガンマ> 0)および高周波数(ガンマ<0)ノイズの生成に関してC&Sジェネレーターがどれだけうまく機能するかを示しています。3番目の図は、C&Sジェネレーター(私の最初の投稿と同じ)の1 / fノイズPSDと、Orfanidis教授の優れた書籍(eqn B.29、p。736)にある例B.9 1 / fジェネレーターを比較しています。これらのPSDはすべて、1000個の32k FFT PSDの平均です。それらはすべて一方的であり、平均減算されています。C&S PSDでは、3極/ 10年を使用し、4桁(0.05〜500 Hz)を使用可能な範囲として指定しました。したがって、C&Sジェネレーターにはn = 12の極とゼロのペアがありました。サンプリング周波数は1 kHz、ナイキストは500 Hz、分解能要素は0.0305 Hzをわずかに上回りました。エドV 低周波PSD 高周波PSD 2つの1 / fノイズジェネレーターの比較

fc10fMfcfM

ai=exp[2π10(iN)/hγ/2hc]
bi=exp[2π10(iN)/hc]
fM=0.5fc


1
CorsiniおよびSaletti状態「このフィルターは、それぞれが実極ゼロペアをもつN個のカスケードされた1次セクションで構成され、N個の極は「周波数10進ごとにh個の極の密度で周波数対数に関して均一に分布/ d)、それに応じてN個のゼロが続きます。」論文のディスカッションセクションは非常にうまくできていたので、彼らが言ったことをプログラミングするだけで問題はありませんでした。私が持っているのは私の古いハードコピーとそのスキャンされたコピーだけです。上記のPSDでは、3極/ 10年を使用しましたが、PSDは平均減算と片側です。エドV
エドV
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.