在 Python 中生成噪声颜色
Generate colors of noise in Python
我想使用 Python 来生成不同颜色的噪声,就像维基百科提到的那样:https://en.wikipedia.org/wiki/Colors_of_noise.
例如,白色、粉色、布朗、蓝色 和 紫色 噪声。并希望拥有与网站相似的频谱。
如果我能只调整几个参数来完成它,那将是一个很大的帮助。任何链接或提示将不胜感激!非常感谢。
让我们使用 numpy 计算噪声并使用 matplotlib 绘制结果
import numpy as np
import matplotlib.pyplot as plt
def plot_spectrum(s):
f = np.fft.rfftfreq(len(s))
plt.loglog(f, np.abs(np.fft.rfft(s)))
这是 python 装饰器的一个很好的用例
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):
return 1/np.where(f == 0, float('inf'), np.sqrt(f))
函数 PSDGenrator
将一个函数和 returns 另一个函数作为输入,该函数将产生一个随机信号,其功率谱根据给定函数进行整形。
直线 S = S / np.sqrt(np.mean(S**2))
确保有色噪声将保留白噪声的能量。
我们来测试一下
plt.figure(figsize=(8, 8))
for G in [brownian_noise, pink_noise, white_noise, blue_noise, violet_noise]:
plot_spectrum(G(2**14))
plt.legend(['brownian', 'pink', 'white', 'blue', 'violet'])
plt.ylim([1e-3, None]);
python
中有一个处理有色噪声的库
https://pypi.org/project/colorednoise/
!pip install colorednoise
import colorednoise as cn
from matplotlib import pylab as plt
#input values
beta = 0 # the exponent: 0=white noite; 1=pink noise; 2=red noise (also "brownian noise")
samples = 2**16 # number of samples to generate (time series extension)
#Deffing some colores
A = cn.powerlaw_psd_gaussian(beta, samples)
#Ploting first subfiure
plt.plot(A, color='black', linewidth=1)
plt.title('Colored Noise for β='+str(beta))
plt.xlabel('Samples (time-steps)')
plt.ylabel('Amplitude(t)', fontsize='large')
plt.xlim(1,5000)
plt.show()
我想使用 Python 来生成不同颜色的噪声,就像维基百科提到的那样:https://en.wikipedia.org/wiki/Colors_of_noise.
例如,白色、粉色、布朗、蓝色 和 紫色 噪声。并希望拥有与网站相似的频谱。
如果我能只调整几个参数来完成它,那将是一个很大的帮助。任何链接或提示将不胜感激!非常感谢。
让我们使用 numpy 计算噪声并使用 matplotlib 绘制结果
import numpy as np
import matplotlib.pyplot as plt
def plot_spectrum(s):
f = np.fft.rfftfreq(len(s))
plt.loglog(f, np.abs(np.fft.rfft(s)))
这是 python 装饰器的一个很好的用例
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):
return 1/np.where(f == 0, float('inf'), np.sqrt(f))
函数 PSDGenrator
将一个函数和 returns 另一个函数作为输入,该函数将产生一个随机信号,其功率谱根据给定函数进行整形。
直线 S = S / np.sqrt(np.mean(S**2))
确保有色噪声将保留白噪声的能量。
我们来测试一下
plt.figure(figsize=(8, 8))
for G in [brownian_noise, pink_noise, white_noise, blue_noise, violet_noise]:
plot_spectrum(G(2**14))
plt.legend(['brownian', 'pink', 'white', 'blue', 'violet'])
plt.ylim([1e-3, None]);
python
中有一个处理有色噪声的库https://pypi.org/project/colorednoise/
!pip install colorednoise
import colorednoise as cn
from matplotlib import pylab as plt
#input values
beta = 0 # the exponent: 0=white noite; 1=pink noise; 2=red noise (also "brownian noise")
samples = 2**16 # number of samples to generate (time series extension)
#Deffing some colores
A = cn.powerlaw_psd_gaussian(beta, samples)
#Ploting first subfiure
plt.plot(A, color='black', linewidth=1)
plt.title('Colored Noise for β='+str(beta))
plt.xlabel('Samples (time-steps)')
plt.ylabel('Amplitude(t)', fontsize='large')
plt.xlim(1,5000)
plt.show()