(粉红色)噪声的良好伪随机近似,但又适合在整数 DSP 上以低计算成本实现?
粉色的 (1 / f1/f) 伪随机噪声生成
线性滤波
彼得回答中的第一种方法(即过滤白噪声)是一种非常简单的方法。在Spectral Audio Signal Processing中,JOS 提供了一个低阶滤波器,可用于产生一个像样的近似值,并分析得到的功率谱密度与理想值的匹配程度。线性滤波总是会产生一个近似值,但这在实践中可能并不重要。用 JOS 来解释:
没有可以从白噪声中产生粉红噪声的精确(有理、有限阶)滤波器。这是因为滤波器的理想幅度响应必须与无理函数成正比 , 在哪里以赫兹为单位表示频率。但是,很容易生成任何所需近似程度的粉红噪声,包括感知上的精确。
他给出的滤波器系数如下:
B = [0.049922035, -0.095993537, 0.050612699, -0.004408786];
A = [1, -2.494956002, 2.017265875, -0.522189400];
它们被格式化为MATLAB filter function的参数,因此为了清楚起见,它们对应于以下传递函数:
显然,在实践中最好使用系数的全部精度。这是使用该过滤器生成的粉红噪声听起来像的链接:
对于定点实现,由于使用 [-1,1) 范围内的系数通常更方便,因此需要对传递函数进行一些修改。通常,建议将事物分解为二阶部分,但部分原因(与使用一阶部分相反)是为了在根复杂时方便使用实系数。对于这个特定的滤波器,所有的根都是实数,然后组合成二阶部分可能仍会产生一些分母系数 >1,因此三个一阶部分是合理的选择,如下所示:
在哪里
需要对这些部分进行一些明智的排序选择,并结合为每个部分选择一些增益因子来防止溢出。我没有尝试过彼得答案中链接中给出的任何其他过滤器,但可能会适用类似的考虑。
白噪声
显然,过滤方法首先需要一个均匀随机数的来源。如果库例程不适用于给定平台,最简单的方法之一是使用线性同余生成器。TI 在TMS320C5x 上的随机数生成 (pdf)中给出了高效定点实现的一个示例。可以在James Gentle的随机数生成和蒙特卡洛方法中找到对各种其他方法的详细理论讨论。
资源
基于彼得答案中以下链接的几个来源值得强调。
第一个基于滤波器的代码块参考了 Orfanidis的 Signal Processing简介。全文可在该链接上找到,[在附录 B] 中涵盖了粉红噪声和白噪声的生成。正如评论所提到的,Orfanidis 主要涵盖了 Voss 算法。
Voss-McCartney 粉红噪声发生器产生的频谱。在页面底部附近,在对 Voss 算法的变体进行了广泛讨论之后,此链接以巨大的粉红色字母引用。它比前面的一些 ASCII 图表更容易阅读。
李文天关于 1/f 噪声的参考书目。这在 Peter 的源代码和 JOS 中都有引用。一般而言,它对 1/f 噪声的引用数量令人眼花缭乱,可以追溯到 1918 年。
自 1990 年以来,我一直在使用 Corsini 和 Saletti 的算法:G. Corsini、R. Saletti,“A 1/f^gamma 功率谱噪声序列发生器”,IEEE Transactions on Instrumentation and Measurement,37(4),1988 年 12 月,615 -619。伽马指数介于 -2 和 +2 之间。它适用于我的目的。埃德
如果添加屏幕截图的尝试有效,下图显示了 Corsini 和 Saletti 算法执行情况的示例(至少在我在 1990 年对其进行编程时)。采样频率为 1 kHz,gamma = 1,平均 1000 个 32k FFT PSD。
这是我之前关于 Corsini 和 Saletti (C&S) 噪声发生器的帖子的后续。接下来的两个图显示了 C&S 发生器在生成低频 (gamma > 0) 和高频 (gamma < 0) 噪声方面的表现。第三个图比较了 C&S 生成器的 1/f 噪声 PSD(与我的第一篇文章相同)和 Orfanidis 教授的优秀著作(eqn B.29, p. 736)中给出的示例 B.9 1/f 生成器。所有这些 PSD 都是 1000 个 32k FFT PSD 的平均值。它们都是单边的和均值相减的。对于 C&S PSD,我使用 3 个极点/十倍频,并指定 4 个十倍频(0.05 到 500 Hz)作为所需的可用范围。所以 C&S 发生器有 n = 12 个极对和零对。采样频率为 1 kHz,奈奎斯特为 500 Hz,分辨率元素刚刚超过 0.0305 Hz。埃德五世
正如 Corsini 和 Saletti 在他们的论文中所说,, 在哪里是采样频率和是“我们将在其上生成噪声样本的频带的上限”。数字滤波器系数由公式 (5.1) 给出: