🙌

Pythonで好みの長さのホワイトノイズを作成

2023/02/14に公開

動機

赤ん坊が生まれたので、ホワイトノイズを流して落ち着かせたくなりました。
ネットでも拾えるのですが、いかんせん長さが短かったりするので自作するに至りました。

ダイソーのスピーカーと安いmicroSDを組み合わせて、ずーっとノイズを流しっぱなしにすることができます。

コード

任意の長さで以下の種類のノイズを生成します。

  • ホワイトノイズ (white_noise)
  • ブルーノイズ (blue_noise)
  • バイオレットノイズ (violet_noise)
  • ブラウンノイズ (brownian_noise)
  • ピンクノイズ (pink_noise)

今日調べたんですが、ブラウンノイズはブラウニアンノイズやレッドノイズと呼ばれたりするみたいです。

import wave

import numpy as np

# 参考: https://stackoverflow.com/questions/67085963/generate-colors-of-noise-in-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))

filename = "white_noise.wav" # 任意のファイル名に変更
func = white_noise # 上にある関数を指定
minutes = 60 # 60分の場合
n_channels = 1 # 1 to 2
sample_width = 2 # 1 to 4

frame_rate = 44_100
n_frames = int(minutes*60 * frame_rate / (8/n_channels/sample_width))
noise = func(n_frames)

wavefile = wave.Wave_write(filename)
wavefile.setnchannels(n_channels)
wavefile.setsampwidth(sample_width)
wavefile.setframerate(frame_rate)
wavefile.setnframes(n_frames)
wavefile.writeframes(noise)

Discussion