プログラミング
記事内に商品プロモーションを含む場合があります

Pythonでカラーノイズ(ピンクノイズ、ホワイトノイズ)を生成する|サウンドデータ

Aru

サウンドデータ・音声データを取り扱う時に、ノイズ成分を加えたい場合があります。この記事では、ホワイトノイズとピンクノイズといったカラーノイズ(colerdnoise)の生成方法について解説します。ノイズ成分の追加は、特にディープラーニングのモデルの学習時などに活用できます。

ディープラーニングの学習で、色々なデータ拡張も一緒に行いたい場合は、Audiomentationsをお勧めします。このライブラリにも色ノイズを付加する機能が入っています。

Audiomentations|音声向けデータ拡張ライブラリの使い方
Audiomentations|音声向けデータ拡張ライブラリの使い方

方法1:ライブラリ(colorednoise)を使う

色ノイズを発生させるcolorednoiseというパッケージがあるのでこれを利用して色ノイズを生成することが可能です。

インストール

pipでインストールできます。

pip install colorednoise

使い方

使い方は簡単です。引数はbetaと生成したいサンプル数(samples)です。

betaの値で生成するノイズの種類を変更できます。

  • beta = 0 … ホワイトノイズ
  • beta = 1 … ピンクノイズ
  • beta = 2 … ブラウンノイズ

以下は、生成するサンプルプログラムです。

import colorednoise as cn
from matplotlib import pylab as plt
import numpy as np

def plot_spectrum(s):
    f = np.fft.rfftfreq(len(s))
    return plt.loglog(f, np.abs(np.fft.rfft(s)))[0]

plt.style.use('dark_background')
plt.figure(figsize=(12, 8), tight_layout=True)

for beta,  c in zip(
        [2, 1, 0], 
        ['brown', 'hotpink', 'white']):
    A = cn.powerlaw_psd_gaussian(beta, 30*50_000)
    plot_spectrum(A).set(color=c, linewidth=3)

plt.legend(['brownian', 'pink', 'white'])
plt.suptitle("Colored Noise")
plt.ylim([1e-3, None])
plt.show()

実行すると以下のグラフが生成されます。pinkのグラフを見ると周波数が10倍になるとパワーが10デシベル減衰するピンクノイズになっているようです。

また、whiteはパワーが一定になっています。

ノイズ出力
Screenshot

方法2:自作する

以下のプログラムはstack overflowに紹介されていたものです(リンク)。

pink_noise(サンプル数)といった形で利用します。

こちらは、white, blue, violet, white, brownianの5種類のカラーノイズを生成する関数が用意されています。

ライブラリでなくプログラム中に埋め込むメリットは、変更の容易性です。例えば入出力をnumpyでなくtorchのテンソルにするといった変更が簡単に行えます

import numpy as np
import matplotlib.pyplot as plt

def plot_spectrum(s):
    f = np.fft.rfftfreq(len(s))
    return plt.loglog(f, np.abs(np.fft.rfft(s)))[0]

def noise_psd(N, psd = lambda f: 1):
        X_white = np.fft.rfft(np.random.randn(N))
        S = psd(np.fft.rfftfreq(N))
        # Normalize S
        S = S / np.sqrt(np.mean(S**2))
        X_shaped = X_white * S
        return np.fft.irfft(X_shaped)

def PSDGenerator(f):
    return lambda N: noise_psd(N, f)

@PSDGenerator
def white_noise(f):
    return 1

@PSDGenerator
def blue_noise(f):
    return np.sqrt(f)

@PSDGenerator
def violet_noise(f):
    return f

@PSDGenerator
def brownian_noise(f):
    return 1/np.where(f == 0, float('inf'), f)

@PSDGenerator
def pink_noise(f):
    # 周波数に反比例する 1/0=infを出力
    return 1/np.where(f == 0, float('inf'), np.sqrt(f))


plt.style.use('dark_background')
plt.figure(figsize=(12, 8), tight_layout=True)
for G, c in zip(
        [brownian_noise, pink_noise, white_noise, blue_noise, violet_noise], 
        ['brown', 'hotpink', 'white', 'blue', 'violet']):
    plot_spectrum(G(30*50_000)).set(color=c, linewidth=3)
plt.legend(['brownian', 'pink', 'white', 'blue', 'violet'])
plt.suptitle("Colored Noise")
plt.ylim([1e-3, None])

plt.show()

結果をみると、ピンクとホワイト、ブラウンはcoloerdnoiseを使った場合とほぼ同じです。

ノイズの出力(2)
Screenshot

こちらを使っても問題なさそうです。

まとめ

カラーノイズを生成する方法についてまとめました。

音声データを使ったディープラーニングのモデル学習については、以下の記事が参考になります。

【Kaggle実装】生き物の声を聞き分けろ!音声検出で森の希少種を守る

私も、2024年度に参加しています。

あわせて読みたい
BirdCLEF 2024に挑戦| Kaggleチャレンジ記録
BirdCLEF 2024に挑戦| Kaggleチャレンジ記録

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT ME
ある/Aru
ある/Aru
IT&機械学習エンジニア/ファイナンシャルプランナー(CFP®)
専門分野は並列処理・画像処理・機械学習・ディープラーニング。プログラミング言語はC, C++, Go, Pythonを中心として色々利用。現在は、Kaggle, 競プロなどをしながら悠々自適に活動中
記事URLをコピーしました