粉红()伪随机噪声生成


20

有什么算法可以生成对(粉红色)噪声的良好伪随机近似,但又适合在整数DSP上以较低的计算成本实现?1个/F


记忆如何?如果这不是问题,而是计算,那么我想对所需的频率曲线进行随机相位iDFT并将其保存为设备中的静态const波表。
2011年

@leftaroundabout-还是将随机白噪声的DFT乘以1 / f频率曲线,然后进行IDFT具有更好的随机性?
hotpaw2 2011年

1
白噪声基本恒定的功能的随机相IFT,所以它不应该太大的差别。
大约

Answers:


11

6
如果该站点出现故障,您的答案就会消失,如果您要提出每种解决方案的基础知识,那么以该站点为参考,答案将会大大改善。
2011年

@Kortuk:答案是社区Wiki,因此您可以自己这样做!那里的信息应该足以指向其他Web参考(例如datageist对于第一种选择的回答)。不过,我同意,更多细节会很好。
彼得·K。

20

线性滤波

Peter的答案中的第一种方法(即过滤白噪声)是一种非常简单的方法。在频谱音频信号处理中,JOS提供了一个低阶滤波器,可用于产生体面的近似值,并分析所得功率谱密度与理想值的匹配程度。线性滤波将始终产生近似值,但实际上可能无关紧要。释义:

没有可以从白噪声产生粉红色噪声的精确(有理,有限阶)滤波器。这是因为滤波器的理想幅度响应必须与无理函数1 / 成正比。 ,其中f表示以Hz为单位的频率。但是,很容易产生粉红色噪声,达到任何所需的近似程度,包括感知上的精确度。1个/FF

他给出的滤波器系数如下:

B = [0.049922035, -0.095993537, 0.050612699, -0.004408786];
A = [1, -2.494956002, 2.017265875, -0.522189400];

它们被格式化为MATLAB过滤器函数的参数,因此为清楚起见,它们对应于以下传递函数:

Hž=.041-.096ž-1个+.051ž-2-.004ž-31个-2.495ž-1个+2.017ž-2-.522ž-3

显然,在实践中最好使用系数的全部精度。这是使用该滤镜产生的粉红噪声听起来像的链接:

对于定点实现,由于使用[-1,1)范围内的系数通常更方便,因此必须对传递函数进行一些重做。通常,建议将内容分解为二阶部分,但是这样做的部分原因(与使用一阶部分相对)是为了在根复杂时使用实系数。对于此特定滤波器,所有根都是实数,然后将其组合成二阶部分可能仍会得出一些分母系数> 1,因此三个一阶部分是一个合理的选择,如下所示:

Hž=1个-b1个ž-1个1个-一种1个ž-1个 1个-b2ž-1个1个-一种2ž-1个 1个-b3ž-1个1个-一种3ž-1个

哪里

b1个=0.98223157 b2=0.83265661 b3=0.10798089
一种1个=0.99516897 一种2=0.94384177 一种3=0.55594526

为防止溢出,需要对这些部分进行一些明智的排序选择,并为每个部分选择一些增益因子。我还没有尝试过Peter答案中链接中给出的其他任何过滤器,但可能会应用类似的考虑。

白噪声

显然,过滤方法首先需要一个统一的随机数源。如果库例程不适用于给定平台,则最简单的方法之一是使用线性同余生成器。TI在TMS320C5x(pdf)上的随机数生成中给出了一种有效的定点实现方式的示例。各种其他方法的详细理论讨论可以在James Gentle的《随机数生成》和《蒙特卡洛方法》中找到。

资源资源

基于Peter答案中以下链接的一些资料值得重点介绍。

  • 第一个基于过滤器的代码块引用了Orfanidis的《信号处理简介》。该链接提供了全文,[在附录B中]涵盖了粉红色和白色噪声的产生。正如评论所提到的,Orfanidis主要涵盖了Voss算法。

  • Voss-McCartney粉红噪声发生器产生的频谱。在广泛讨论了Voss算法的变体之后,在页面底部附近,以巨大的粉红色字母引用此链接。与前面的某些ASCII图相比,它更容易阅读。

  • 李文天的“ 1 / f噪声参考书目”。在Peter的资料来源和JOS中都引用了这一点。通常,它对1 / f噪声的参考数量令人眼花,乱,其历史可追溯至1918年。


知道他如何提出这些滤波器系数吗?我想这只是对所需斜率的非线性拟合,但是我很想知道是否有更具体的算法。
nibot 2012年

我最好的猜测是他论文中提到的一种近似技术。无论哪种方式,这都是很棒的读物。
datageist

哇,那真是个文件!感谢您的链接。
nibot 2012年

1
滤波器白噪声方法的问题在于,您不会获得与自相关时间序列相同的幅度相位关系。因此,如果您尝试模拟自然过程,则不应产生白噪声并对其进行滤波。实际上,您应该按时间序列创建自相关噪声,即当前值取决于先前值+噪声。参见统计“ AR”过程。您可以通过以下两种方法生成噪声来进行测试:FFT,然后绘制实数与虚数(频域的复平面)。您会注意到这种模式有很大的不同
Paul S

保罗,您好,欢迎来到DSP.SE。如果您只关心噪声的声音(例如,在音频工作中),那么幅度谱就是主要问题。不过,如果您可以在新的答案中详细说明您的想法,那将是很棒的。我认为网站上尚无任何描述该技术的信息。
datageist

1

自1990年以来,我一直在使用Corsini和Saletti的算法:G。Corsini,R。Saletti,“ A 1 / f ^伽马功率谱噪声序列发生器”,IEEE仪器仪表与测量学报,第37(4)页,1988年12月,第615页-619。伽玛指数介于-2和+2之间。就我的目的而言,它运作良好。埃德

如果尝试添加屏幕快照,那么下图将显示一个示例,说明Corsini和Saletti算法的性能如何(至少是我在1990年编程的时候)。采样频率为1 kHz,gamma = 1,并且对1000个32k FFT PSD进行了平均。

通过Corsini和Saletti算法获得1 / f噪声的PSD


这是我之前发表的有关Corsini和Saletti(C&S)噪声发生器的文章的后续内容。接下来的两个图显示了C&S生成器在产生低频(gamma> 0)和高频(gamma <0)噪声方面的性能如何。第三张图比较了C&S发生器的1 / f噪声PSD(与我的第一篇文章相同)和Orfanidis教授的出色著作中给出的示例B.9 1 / f发生器(eqn B.29,第736页)。所有这些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。第五版 低频PSD 高频PSD 比较2个1 / f噪声发生器

FC10F中号FCF中号

一种一世=ËXp[-2π10一世-ñ/H-γ/2H-C]
b一世=ËXp[-2π10一世-ñ/H-C]
F中号=0.5FC


1
Corsini和Saletti指出“此滤波器由N个级联的一阶部分组成,每个部分都有一个零极点对”,并且N个极点“相对于频率对数均匀分布,每频率十倍频点的密度为h个极点(p / d),然后紧跟着N个零。” 本文的“讨论”部分做得非常好,因此仅编程他们所说的事情就没有问题。我所拥有的只是我的旧硬拷贝和扫描副本。对于上面的PSD,我使用了3个极点/十年,并且PSD是均值减去和单边的。Ed V
Ed V
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.