如何在numpy的频率范围内产生噪音?

mat*_*usc 5 python signal-processing numpy noise

我有一个主要信号,例如周期为200个样本的窦.

我想在这个信号上加一个噪音."噪声信号部分"的周期应在例如5-30个样本的范围内.

我认为这足以在这个范围内产生多个具有不同随机选择振幅的鼻窦:

noise = np.sin(np.array(range(N))/0.7)*np.random.random(1) + np.sin(np.array(range(N))/1.1)*np.random.random(1) + np.sin(np.array(range(N))/1.5)*np.random.random(1) 
Run Code Online (Sandbox Code Playgroud)

但是对于我的目的,这个解决方案仍然是"确定性的".

如何随机改变幅度和周期产生噪声?

Fra*_*kow 11

在这里,您可以找到Aslak Grinsted的matlab代码,创建具有指定功率谱的噪声.它可以很容易地移植到python:

def fftnoise(f):
    f = np.array(f, dtype='complex')
    Np = (len(f) - 1) // 2
    phases = np.random.rand(Np) * 2 * np.pi
    phases = np.cos(phases) + 1j * np.sin(phases)
    f[1:Np+1] *= phases
    f[-1:-1-Np:-1] = np.conj(f[1:Np+1])
    return np.fft.ifft(f).real
Run Code Online (Sandbox Code Playgroud)

您可以像这样使用它:

def band_limited_noise(min_freq, max_freq, samples=1024, samplerate=1):
    freqs = np.abs(np.fft.fftfreq(samples, 1/samplerate))
    f = np.zeros(samples)
    idx = np.where(np.logical_and(freqs>=min_freq, freqs<=max_freq))[0]
    f[idx] = 1
    return fftnoise(f)
Run Code Online (Sandbox Code Playgroud)

就我看来似乎工作似乎.聆听新创造的噪音:

from scipy.io import wavfile

x = band_limited_noise(200, 2000, 44100, 44100)
x = np.int16(x * (2**15 - 1))
wavfile.write("test.wav", 44100, x)
Run Code Online (Sandbox Code Playgroud)