在Python中生成噪声的颜色

Jef*_*Lai 17 python audio signal-processing

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

例如,白色粉色布朗蓝色紫色噪声。并希望有类似的频谱,就像网站一样。

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

Bob*_*Bob 25

让我们使用 numpy 计算噪声并使用 matplotlib 绘制结果

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]

Run Code Online (Sandbox Code Playgroud)

这是 python 装饰器的一个很好的用例

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]

Run Code Online (Sandbox Code Playgroud)

该函数PSDGenrator将一个函数作为输入并返回另一个函数,该函数将产生一个随机信号,其功率谱根据给定函数进行整形。

该线S = S / np.sqrt(np.mean(S**2))确保有色噪声保留白噪声的能量。

我们来测试一下

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))
Run Code Online (Sandbox Code Playgroud)

一致的彩色噪音

  • 因为它是归一化频率,即频率除以采样率,所以它从0到0.5(奈奎斯特频率) (2认同)
  • @Ash,谢谢您的反馈,这是为了保留白噪声的能量。 (2认同)

小智 5

python 中有一个处理彩色噪声的库

\n

https://pypi.org/project/colorednoise/

\n
!pip install colorednoise\nimport colorednoise as cn\nfrom matplotlib import pylab as plt\n\n#input values\nbeta = 0         # the exponent: 0=white noite; 1=pink noise;  2=red noise (also "brownian noise")\nsamples = 2**16  # number of samples to generate (time series extension)\n\n#Deffing some colores\nA = cn.powerlaw_psd_gaussian(beta, samples)\n\n#Ploting first subfiure\nplt.plot(A, color=\'black\', linewidth=1)\nplt.title(\'Colored Noise for \xce\xb2=\'+str(beta))\nplt.xlabel(\'Samples (time-steps)\')\nplt.ylabel(\'Amplitude(t)\', fontsize=\'large\')\nplt.xlim(1,5000)\nplt.show()\n
Run Code Online (Sandbox Code Playgroud)\n

在此输入图像描述

\n