在没有 FFT 的情况下生成蓝/紫噪声

信息处理 fft 噪音 无限脉冲响应
2022-02-02 19:04:19

对于实时音频应用,我需要具有高频偏差的噪声,因此我对蓝噪声或紫噪声等事物感兴趣。

有没有办法在不使用 FFT 或 IIR 滤波器的情况下产生这种噪声?换句话说,一些计算成本更低的东西?

1个回答

比过滤噪声更便宜将很难。

到目前为止,我遇到的几乎所有彩色噪声的数值实现都是基于一些设计为尽可能白的随机数生成器,然后是一些噪声整形。

紫噪声本身有时被称为微分白噪声(至少根据维基百科),但在 DSP 中实现微分与设计具有特定高通特性的 FIR 没有什么不同,因此这也无济于事。

事实上,这就是我的“让我们在不到一分钟的时间内完成”尝试的样子;我是 GNU Radio 书呆子,所以这是我选择的 DSP 框架来完成蓝噪声发生器;我错误地将文件称为“紫罗兰色”/“紫罗兰色”,尽管噪音是蓝色的:

左:信号频谱的可视化; 右图:GNU Radio Companion 显示生成流程图 左:信号频谱的可视化(频率标度被任意设置为 MHz);右图:GNU Radio Companion 显示生成流图。π

解释这个流程图:这个想法是用滤波器来塑造噪声。现在,时域中的(FIR)过滤意味着卷积,这在计算上很糟糕。但是时间上的卷积是频域上的乘法。因此,就我的经验而言,信号->FFT->逐元素乘以常数向量->IFFT 通常比直接滤波更快,至少对于 PC 上长度为 >> 16 的滤波器而言。

通常,人们会使用现有的 FFT FIR 模块来实现这一点,这将负责应用重叠/相加,因此滤波器响应实际上与被复制的时域 FIR 相同,但是:我们不需要那个。在 DFT 之前不进行零填充,不进行重叠不会真正改变输入信号的白色特性。

由于 FFT 块已经带有应用窗口的选项,因此我为 FFT 选择了一个矩形(即常数 1)窗口(实际上是无操作),并range(0,fftlen/2)+range(fftlen/2,0,-1)为IFFT。

请注意,尽管您说您想将它用于音频应用程序,但我已经用复杂的噪声做到了这一点 - 原因很简单:(实模式修改的)FFT 对真实数据的效率不到它的两倍复杂,所以我只是告诉自己“好吧,那么你会得到两股紫色噪音;这也很好”。

为了您的聆听乐趣,我用文件接收器替换了接收器,并将结果转换为立体声 24 位 FLAC 文件;您可以下载音频文件,并在此 Github Gist中找到处于该状态的 GNU Radio 配套文件。

计算成本低一点

在我的 PC 工作站上对此进行了基准测试,移除了图形接收器。平均吞吐量约为。每秒 10315 IFFT,在我使用的 FFT 长度为 1024 时,等于 10.56 MS/s(而且,很多时间都花在生成白噪声上,因为我只使用了更高质量的 -高于需要的具有高斯形状的基于 MT19937 的噪声源)。这意味着每秒处理时间,你会得到两个紫色噪声流,价值 220 秒的 48 kHz 音频。换句话说,如果您有一个声卡来限制消耗的样本量,那么这个实际上占用两个 CPU 内核的流程图将只运行 1/220 的时间,即。如果您将其限制为在单个内核上运行,则消耗一个内核的 2%。

我声称这在计算上是廉价的。

现在,诚然,如果您在硬件中执行此操作,情况可能会有所不同,因为 FFT 可能会非常占用空间——但它可能仍然不是让您在音频速率上崩溃的原因;通过在频域中乘以斜坡,您无需存储 FIR 系数(您只需计算样本并临时生成因子),这比直接实现 FIR 便宜得多。