有什么算法可以生成对$ 1 / f $(粉红色)噪声的良好伪随机近似,但又适合在整数DSP上以较低的计算成本实现?
#1 楼
有几个。该站点有一个合理的列表,但可能很旧:过滤白噪声使其变粉红色。
Voss算法。 -McCartney算法。
评论
$ \ begingroup $
如果该站点出现故障,您的答案就会消失,如果您提出每种解决方案的基础知识,那么以该站点为参考,答案将会大大改善。
$ \ endgroup $
– Kortuk
2011年10月9日17:25
$ \ begingroup $
@Kortuk:答案是社区Wiki,因此您可以自己这样做!那里的信息应该足以指向其他Web参考(例如datageist对于第一种选择的回答)。不过,我同意,更多细节会很好。
$ \ endgroup $
– Peter K.♦
2011年10月9日18:23
#2 楼
线性滤波Peter的答案中的第一种方法(即滤波白噪声)是一种非常简单的方法。在频谱音频信号处理中,JOS提供了一个低阶滤波器,可用于产生体面的近似值,并分析所得功率谱密度与理想值的匹配程度。线性滤波将始终产生近似值,但实际上可能无关紧要。释义:
没有精确的(有理,有限阶)滤波器可以从白噪声产生
粉红噪声。这是因为滤波器的理想幅度响应必须与无理函数成正比。$ 1 / \ sqrt {f} $,其中$ f $表示以Hz为单位的频率。但是,很容易
足以产生所需的近似程度的粉红色噪声,
包括感知上的精确度。如下:
B = [0.049922035, -0.095993537, 0.050612699, -0.004408786];
A = [1, -2.494956002, 2.017265875, -0.522189400];
它们被格式化为MATLAB过滤器函数的参数,因此为清楚起见,它们对应于以下传递函数:
$$
H(z)= {.041-.096z ^ {-1} + .051z ^ {-2}-.004z ^ {-3} \ over {} 1 -2.495z ^ {-1} + 2.017z ^ {-2}-.522z ^ {-3}}
$$
显然,在实践中最好使用系数的全精度。这是使用该滤镜产生的粉红噪声听起来像的链接:
对于定点实现,由于使用[-1,1)范围内的系数通常更方便,因此必须对传递函数进行一些重做。通常,建议将内容分解为二阶部分,但是这样做的部分原因(与使用一阶部分相对)是为了在根复杂时使用实系数。对于此特定滤波器,所有根都是实数,然后将其合并为二阶部分可能仍会得出一些分母系数> 1,因此三个一阶部分是一个合理的选择,如下所示:
$$
H(z)= {1-b_1z ^ {-1} \ over {1-a_1z ^ {-1}}}} \ space {1-b_2z ^ {-1} \ over {1- a_2z ^ {-1)}} \ space
{1-b_3z ^ {-1} \ over {1-a_3z ^ {-1}}}}
$$
其中
$$
b_1 = 0.98223157,\ space b_2 = 0.83265661,\ space b_3 = 0.10798089
$$
$$
a_1 = 0.99516897, \ space a_2 = 0.94384177,\ space a_3 = 0.55594526
$$
这些部分需要一些明智的排序选择,并且需要为每个部分选择一些增益因子,以防止溢出。我没有尝试过Peter答案中链接中给出的其他任何过滤器,但是可能会应用类似的考虑。首先是统一随机数的来源。如果库例程不适用于给定的平台,则最简单的方法之一是使用线性同余生成器。 TI在TMS320C5x(pdf)上的“随机数生成”中给出了有效定点实现的一个示例。各种其他方法的详细理论讨论可以在James Gentle的《随机数生成》和《蒙特卡洛方法》中找到。
资源
基于彼得答案中以下链接的几个资源值得重点介绍。
第一个基于过滤器的代码块引用了Orfanidis的《信号处理简介》。该链接提供了全文,[在附录B中]涵盖了粉红色和白色噪声的产生。正如评论所提到的,Orfanidis主要涵盖了Voss算法。
由Voss-McCartney Pink噪声发生器产生的频谱。在深入讨论了Voss算法的变体之后,在页面底部附近,以巨大的粉红色字母引用了此链接。与以前的某些ASCII图相比,它更容易阅读。
李文天的1 / f噪声书目。在Peter的资料来源和JOS中都引用了这一点。通常,它对1 / f噪声的引用数量令人眼花,乱,其历史可追溯到1918年。
评论
$ \ begingroup $
知道他如何提出这些滤波器系数吗?我想这只是对所需斜率的非线性拟合,但是我很想知道是否有更具体的算法。
$ \ endgroup $
– nibot
2012年4月26日在20:07
$ \ begingroup $
我最好的猜测是他论文中提到的一种近似技术。无论哪种方式,这都是很棒的读物。
$ \ endgroup $
–datageist♦
2012年4月26日在20:23
$ \ begingroup $
哇,那真是个文件!感谢您的链接。
$ \ endgroup $
– nibot
2012年4月26日在22:17
$ \ begingroup $
滤波器白噪声方法的问题在于,您无法获得与自相关时间序列相同的幅度相位关系。因此,如果您尝试模拟自然过程,则不应产生白噪声并对其进行滤波。您实际上应该按时间序列创建自相关噪声,即当前值取决于以前的值+噪声。参见统计“ AR”过程。您可以通过使用两种方法生成噪声,然后进行FFT进行测试,然后绘制实数与虚数(频域的复平面)。您会发现模式有很大的不同
$ \ endgroup $
– Paul S
16-2-17在1:10
$ \ begingroup $
Paul,您好,欢迎访问DSP.SE。如果您只关心噪声的声音(例如,在音频工作中),那么幅度谱就是主要问题。不过,如果您可以在新的答案中详细说明您的想法,那将是很棒的。我认为网站上还没有任何描述这种技术的东西。
$ \ endgroup $
–datageist♦
16-2-17的2:52
#3 楼
自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。和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。 Ed V
正如Corsini&Saletti在论文中所述,$ f_c≥10f_M $,其中$ f_c $是采样频率, f_M $是“我们将在其上生成噪声样本的频带的上限”。数字滤波器系数由其方程式(5.1)给出:
$$ a_i = exp [-2 \ pi10 ^ {(iN)/ h-\ gamma / 2h-c}] $$
$ $ b_i = exp [-2 \ pi10 ^ {(iN)/ h-c}] $$
其中c =1。要获得如上所示的C&S PSD,令c = 0且$ f_M = 0.5f_c $。
评论
$ \ begingroup $
Corsini和Saletti表示“此滤波器由N个级联的一阶部分组成,每个部分都有一个零极点对”和N个极点“相对于频率对数均匀分布,密度为h极频率十倍(p / d),N个零也随之跟随。”本文的“讨论”部分做得非常好,因此仅编程他们所说的事情就没有问题。我所拥有的只是我的旧硬拷贝和扫描副本。对于上面的PSD,我使用了3个极点/十年,并且PSD是均值减去和单边的。第五版
$ \ endgroup $
– Ed V
19年4月23日在22:11
评论
记忆如何?如果这不是问题而是计算,那么我想对所需的频率曲线进行随机相位iDFT并将其保存为设备中的静态const波表。@leftaroundabout-还是将随机白噪声的DFT乘以1 / f频率曲线,然后进行IDFT会具有更好的随机性?
白噪声本质上是常数函数的随机相位iFT,因此不应有太大区别。