You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何生成二维彩色噪声 二维1/f粉红噪声生成方法及Python库推荐

二维粉红噪声(1/f噪声)生成原理与实现

核心原理

二维粉红噪声属于1/f类彩色噪声,核心特征是功率谱密度和空间频率的一次方成反比,即 PSD(f) ∝ 1/f。目前通用的实现方案是频域滤波法:高斯白噪声的功率谱在全频段是平坦的,只需要在频域对不同频率的分量施加对应权重,调整功率谱到符合1/f的分布,再逆变换回空域即可得到目标噪声,该方法可直接扩展到任意高维噪声生成。

具体实现步骤

  • 生成与目标输出维度相同的标准正态分布高斯白噪声数组
  • 对该白噪声数组做二维快速傅里叶变换,得到频域复数矩阵
  • 生成对应维度的频率网格,计算每个频域位置的空间频率大小f,注意单独处理f=0的直流分量避免除以0
  • 给频域矩阵的每个元素乘以1/√f的系数(功率和幅度为平方关系,因此幅度乘1/√f即可得到功率随1/f衰减的效果)
  • 对调整后的频域矩阵做二维逆傅里叶变换,取结果的实部即为二维粉红噪声数组,可根据需求对结果做归一化处理到目标值域

小提示:直流分量可直接保留原始值或乘以固定系数,不会影响整体的1/f频谱特性,如需严格控制输出范围可在最后添加截断或归一化逻辑。

手写实现参考代码

import numpy as np
from scipy.fft import fft2, ifft2, fftfreq

def generate_2d_pink_noise(shape: tuple):
    h, w = shape
    # 生成标准正态分布白噪声
    white_noise = np.random.randn(h, w)
    # 转换到频域
    fft_noise = fft2(white_noise)
    # 生成频率网格
    fx = fftfreq(w)
    fy = fftfreq(h)
    fx_grid, fy_grid = np.meshgrid(fx, fy, indexing='xy')
    f = np.sqrt(fx_grid**2 + fy_grid**2)
    # 处理直流分量
    f[f == 0] = np.min(f[f > 0])
    # 频域滤波
    filtered_fft = fft_noise / np.sqrt(f)
    # 逆变换回空域,取实部
    pink_noise = np.real(ifft2(filtered_fft))
    # 可选:归一化到0~1范围
    pink_noise = (pink_noise - pink_noise.min()) / (pink_noise.max() - pink_noise.min())
    return pink_noise
支持高维1/f噪声生成的Python库
  • numpy + scipy:按上述逻辑自行实现,灵活度最高,可自定义任意维度、任意频谱斜率的彩色噪声,调整系数的指数即可生成白噪声(指数0)、粉红噪声(指数1)、布朗噪声(指数2)等不同类型的1/f类噪声
  • pinkpy:轻量级1/f噪声专用库,直接支持1~3维的彩色噪声生成,调用简单性能优异,示例代码:
import pinkpy
# 生成256*256的二维粉红噪声,exponent为频谱斜率
noise_2d = pinkpy.noise(shape=(256, 256), exponent=1)
# 生成三维1/f噪声
noise_3d = pinkpy.noise(shape=(128, 128, 128), exponent=1)
  • perlin-noise:如果需要带梯度连续性的类 Perlin 噪声风格的1/f噪声,可使用该库,支持任意维度生成,通过叠加不同倍频的噪声分量实现1/f功率谱特性
  • scipy.signal:也可通过空域滤波的方式生成,不过频域方案对高维场景实现更简单,计算效率也更高

内容的提问来源于stack exchange,提问作者ociredef

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 05:45:08