有什么算法可以生成对(粉红色)噪声的良好伪随机近似,但又适合在整数DSP上以较低的计算成本实现?
有什么算法可以生成对(粉红色)噪声的良好伪随机近似,但又适合在整数DSP上以较低的计算成本实现?
Answers:
线性滤波
Peter的答案中的第一种方法(即过滤白噪声)是一种非常简单的方法。在频谱音频信号处理中,JOS提供了一个低阶滤波器,可用于产生体面的近似值,并分析所得功率谱密度与理想值的匹配程度。线性滤波将始终产生近似值,但实际上可能无关紧要。释义:
没有可以从白噪声产生粉红色噪声的精确(有理,有限阶)滤波器。这是因为滤波器的理想幅度响应必须与无理函数1 / √成正比。 ,其中f表示以Hz为单位的频率。但是,很容易产生粉红色噪声,达到任何所需的近似程度,包括感知上的精确度。
他给出的滤波器系数如下:
B = [0.049922035, -0.095993537, 0.050612699, -0.004408786];
A = [1, -2.494956002, 2.017265875, -0.522189400];
它们被格式化为MATLAB过滤器函数的参数,因此为清楚起见,它们对应于以下传递函数:
显然,在实践中最好使用系数的全部精度。这是使用该滤镜产生的粉红噪声听起来像的链接:
对于定点实现,由于使用[-1,1)范围内的系数通常更方便,因此必须对传递函数进行一些重做。通常,建议将内容分解为二阶部分,但是这样做的部分原因(与使用一阶部分相对)是为了在根复杂时使用实系数。对于此特定滤波器,所有根都是实数,然后将其组合成二阶部分可能仍会得出一些分母系数> 1,因此三个一阶部分是一个合理的选择,如下所示:
哪里
为防止溢出,需要对这些部分进行一些明智的排序选择,并为每个部分选择一些增益因子。我还没有尝试过Peter答案中链接中给出的其他任何过滤器,但可能会应用类似的考虑。
白噪声
显然,过滤方法首先需要一个统一的随机数源。如果库例程不适用于给定平台,则最简单的方法之一是使用线性同余生成器。TI在TMS320C5x(pdf)上的随机数生成中给出了一种有效的定点实现方式的示例。各种其他方法的详细理论讨论可以在James Gentle的《随机数生成》和《蒙特卡洛方法》中找到。
资源资源
基于Peter答案中以下链接的一些资料值得重点介绍。
第一个基于过滤器的代码块引用了Orfanidis的《信号处理简介》。该链接提供了全文,[在附录B中]涵盖了粉红色和白色噪声的产生。正如评论所提到的,Orfanidis主要涵盖了Voss算法。
Voss-McCartney粉红噪声发生器产生的频谱。在广泛讨论了Voss算法的变体之后,在页面底部附近,以巨大的粉红色字母引用了此链接。与前面的某些ASCII图相比,它更容易阅读。
李文天的“ 1 / f噪声参考书目”。在Peter的资料来源和JOS中都引用了这一点。通常,它对1 / f噪声的参考数量令人眼花,乱,其历史可追溯至1918年。
自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(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。第五版