両端から幅優先探索(BSF)って演算量を削減する|高速化の手法
tadanori
Aru's テクログ(Aruaru0)
音声データの学習をさせるときに、データ拡張としてノイズを加えたい場合があります。ここでは、ホワイトノイズやピンクノイズといったカラーノイズ(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はパワーが一定になっています。
stack overflowに紹介されていた方法です(リンク)。
以下がプログラムになります。
pink_noise(サンプル数)
といった形で利用します。
こちらは、white, blue, violet, white, brownianの5種類のカラーノイズを生成する関数が用意されています。
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を使った場合とほぼ同じです。
こちらを使っても問題なさそうです。
こちらのライブラリを使ってもカラーノイズを発生できます。
カラーノイズを生成する方法についてまとめました。
なお、Pytorchでデータ拡張を行いたい場合には、以下の記事が参考になります。
【Kaggle実装】生き物の声を聞き分けろ!音声検出で森の希少種を守る