在 Python 中生成噪声颜色

Posted

技术标签:

【中文标题】在 Python 中生成噪声颜色【英文标题】:Generate colors of noise in Python 【发布时间】:2021-04-14 05:27:36 【问题描述】:

我想使用 Python 生成不同颜色的噪声,就像***提到的那样:https://en.wikipedia.org/wiki/Colors_of_noise。

例如,WhitePinkBrownianBlueViolet噪音。并且希望有类似的光谱,就像网站一样。

如果我可以调整一些参数来完成它,那将是一个很大的帮助。任何链接或提示将不胜感激!非常感谢。

【问题讨论】:

我不明白你的问题,“调整几个参数”到什么? 【参考方案1】:

让我们使用 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))
        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 将一个函数作为输入并返回另一个函数,该函数将产生一个随机信号,其功率谱根据给定函数进行整形。

让我们测试一下

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]);

【讨论】:

我也不明白你的回答,不过谢谢。 我为您提供了产生具有所需光谱分布和单一能量的噪声的函数。尝试例如brownian_noise(2**16) 它将产生样本或布朗噪声。 感谢您的帮助@user12750353!但我想知道为什么BrownianPink 是一样的?他们不应该有所不同吗? 抱歉,打错了,Pink 应该有一个平方根。固定。 因为是归一化频率,即频率除以采样率,所以从0到0.5(奈奎斯特频率)【参考方案2】:

有一个库可以在 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 中生成噪声颜色的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中生成空间白噪声音频

柏林噪声的每顶点法线?

Matlab中randrandnrandirands的区别以及用randn生成白噪声的示例

Matlab中randrandnrandirands的区别以及用randn生成白噪声的示例

ISP基础(04):图像噪声及去噪声

Python-给图像添加椒盐噪声和高斯噪声