Как генерировать шум в частотном диапазоне с помощью numpy?
У меня есть основной сигнал, например синус с периодом 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)
Но это решение все еще слишком "детерминировано" для моей цели.
Как я могу генерировать шум со случайно изменяющейся амплитудой и точка?
1 ответ:
Здесь вы найдете код matlab от Aslak Grinsted, создающий шум с заданным спектром мощности. Его можно легко портировать на 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
Вы можете использовать его для вашего случая следующим образом:
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)
Кажется, работает, насколько я вижу. Для прослушивания Вашего только что созданного шума:
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)