Cómo generar ruido de color 2D
Estoy intentando generar sin éxito una matriz 2D de ruido rosa. ¿Alguien puede explicarme cómo hacerlo? Si no es posible, ¿existe alguna biblioteca de Python que permita generar ruido de color (ruido 1/f) en 2D (o en dimensiones superiores)?
davy.ai
El ruido rosa también conocido como ruido 1/f, tiene una densidad espectral que disminuye a medida que la frecuencia aumenta. Para generar una matriz bidimensional de ruido rosa, se pueden seguir los siguientes pasos:
Aplica un filtro a la matriz de ruido blanco que genere la densidad espectral deseada. Para el ruido rosa, se puede utilizar un filtro que genere una ley de potencia 1/f. Una forma sencilla de hacerlo es dividir la matriz de ruido blanco por la raíz cuadrada de la frecuencia en cada punto en el dominio de Fourier, y luego tomar la transformada inversa de Fourier para obtener la matriz de ruido rosa filtrada.
Aquí hay un código de muestra que demuestra este proceso:
import numpy as np
from scipy import fftpack
Genera una matriz bidimensional de ruido blanco.
shape = (512, 512)
white_noise = np.random.rand(*shape)
Calcula la transformada de Fourier bidimensional de la matriz de ruido blanco.
f = fftpack.fftfreq(shape[0])[:, None] + 1j * fftpack.fftfreq(shape[1])[None, :]
white_noise_fft = fftpack.fft2(white_noise)
Genera el filtro 1/f en el dominio de Fourier.
pink_noise_filter = 1 / np.sqrt(np.abs(f))
pink_noise_filter[0, 0] = 0
Aplica el filtro a la matriz de ruido transformado por Fourier.
pink_noise_fft = white_noise_fft * pink_noise_filter
Calcula la transformada inversa de Fourier de la matriz de ruido filtrado para obtener el ruido rosa.
pink_noise = np.real(fftpack.ifft2(pink_noise_fft))
Alternativamente, se puede usar la biblioteca “colorednoise” en Python, la cual proporciona funciones para generar ruido rosa, azul y marrón en una o más dimensiones. Para instalar la biblioteca, simplemente escribe “pip install colorednoise” en la terminal. Aquí hay un ejemplo de cómo generar una matriz bidimensional de ruido rosa utilizando esta biblioteca:
import colorednoise as cn
shape = (512, 512)
pink_noise = cn.powerlaw_psd_gaussian(1, shape)
En este ejemplo, la función “powerlaw_psd_gaussian” genera una matriz bidimensional con una función de densidad espectral rosa. El parámetro “1” especifica el exponente de la ley de potencia de la densidad espectral, que determina el grado de rosa. Especificar 1 da verdadero ruido rosa. Aumentar este valor se acerca al ruido blanco, mientras que disminuirlo se acerca al ruido marrón.
Se debe tener en cuenta que el ruido rosa generado por el paquete colorednoise no es verdadero ruido rosa 1/f, sino simplemente un ruido de ley de potencia, por lo que existe una ligera diferencia en el cálculo.