我尝试生成粉红色噪声的2D阵列失败。有人能给我解释一下怎么做吗?否则,是否有允许生成2D(或更高维度(彩色噪声(1/f噪声(的python库?
这里和相关问题(如何生成粉红色噪声图像?(中给出的答案为您提供了大部分信息,但我想我应该制定一个完整的步骤来展示一切是如何结合在一起的。
尤其是当人们在理解";频率矩阵";。
将白噪声转换为粉红噪声
- 生成一些白噪声:
whitenoise = np.random.uniform(0, 1, (256, 256))
- 傅立叶变换并将低频移到中心(这使得生成"频率矩阵"更直观(:
ft_arr = np.fft.fftshift(np.fft.fft2(whitenoise))
- 生成";频率矩阵";。在1-D的情况下,这将是与变换给出的幅度相对应的实际频率的阵列。在2-D的情况下,这是离偏移傅立叶空间的中心的距离,离边缘越远,在该点捕获的频率就越大。这可以通过
np.meshgrid
和np.hypot
生成:_x, _y = np.mgrid[0:ft_arr.shape[0], 0:ft_arr.shape[1]]
f = np.hypot(_x - ft_arr.shape[0] / 2, _y - ft_arr.shape[1] / 2)
然后我们将傅立叶空间除以频率pink_ft_arr = ft_arr / f
- 去除由于具有零频率分量而出现的奇点。(也许有一种更聪明的方法可以做到这一点,但无论如何,这都给了我预期的输出(:
pink_ft_arr = np.nan_to_num(pink_ft_arr, nan=0, posinf=0, neginf=0)
- 将傅立叶空间粉红色噪声转换回图像空间:
pinknoise = np.fft.ifft2(np.fft.ifftshift(pink_ft_arr)).real
然后可以使用matplotlibsplt.imshow
绘制,或者将其缩放到某个合理的范围内,并将其写为图像。
白色噪声,来自np.random.uniform
以上产生的粉红色噪声。
-
在2D中生成白噪声,例如使用
np.random.randn
-
计算它(
numpy.fft.fft2
(的FFT_2D -
将结果(2D频谱(乘以
1/f**2
矩阵,以如下方式计算:1/f_along_x * 1/f_along_y
。这就是我如何解释N维中粉红色噪声的定义,但我不确定我是正确的!编辑:Cris Luengo版本(请参阅下面的评论(-1/sqrt(f_x**2+f_y**2)
-对我来说似乎更好,但由您决定使用哪种2d粉红色噪声的定义。 -
使用IFFT_2D获得粉红噪声图像(numpy.fft.ifft2(