频域 (stfft) 中的白噪声生成产生周期性模式

信息处理 噪音 IFFT 周期性的
2022-02-12 14:15:29

我为即将发布的 SynthEdit 创建了一组频谱处理模块,实现了短时间 fft,所以我现在对这件事很有经验,但最近遇到了一个意想不到的问题,看起来比乍一看更棘手:噪声生成在频域。我有这个想法,添加一个模块来生成白噪声fft帧,这样当需要在spectral.process链中注入噪声源时,他可以避免用噪声发生器加专用FFT浪费cpu。好吧,事情看起来很简单:只需生成由随机 bin 组成的光谱帧(每个 bin 包含随机实部和虚部,范围为 -k / +k,其中 k 是适合在 IFFT 之后具有或多或少归一化输出水平的缩放因子)。好吧,我遇到了一个意想不到的问题:产生的白噪声(IFFT 之后)具有清晰可听的周期性,其长度是所选 fft 帧大小的长度。经过仔细调查,我意识到不幸的是,这是显而易见且可预期的行为,并且通过 ifft 产生白噪声可能是一项比预期更具挑战性的任务。我试图解释原因(请记住,我是一名熟练的编码人员,并且在数学方面非常有经验,但并没有像这里经常出现的那样用太高级的数学来处理这个问题,所以请耐心等待)。简而言之,按照我刚才解释的方式进行操作,您最终会在后续帧之间产生清晰可听的不连续性。主要是因为 fft 帧具有非 null.lenght,因此包含时间信息而不仅仅是频谱信息。考虑白噪声频带限制为单个 bin 频率的极端情况:第一帧将具有随机幅度为 1 且随机相位为 pi/2 的分量。在下一帧中,您可能有 0.2 的随机幅度和 4/5 pi 的随机相位。您在帧、周期之间存在不连续性。即使全局信号由许多具有随机幅度和相位的频率组成,每个单个频率在下一帧都会经历不连续性,这将作为具有周期性跳跃的白噪声在全局范围内被听到。我在这里搜索了其他线程(很少),其中解决了频域中产生白噪声的问题,但从未提及这个大问题。我还没有找到一个简单的解决方案。如果有人可能有一个,他是受欢迎的,我提前感谢他。谢谢 第一帧将具有随机幅度为 1 和随机相位为 pi/2 的分量。在下一帧中,您可能有 0.2 的随机幅度和 4/5 pi 的随机相位。您在帧、周期之间存在不连续性。即使全局信号由许多具有随机幅度和相位的频率组成,每个单个频率在下一帧都会经历不连续性,这将作为具有周期性跳跃的白噪声在全局范围内被听到。我在这里搜索了其他线程(很少),其中解决了频域中产生白噪声的问题,但从未提及这个大问题。我还没有找到一个简单的解决方案。如果有人可能有一个,他是受欢迎的,我提前感谢他。谢谢 第一帧将具有随机幅度为 1 和随机相位为 pi/2 的分量。在下一帧中,您可能有 0.2 的随机幅度和 4/5 pi 的随机相位。您在帧、周期之间存在不连续性。即使全局信号由许多具有随机幅度和相位的频率组成,每个单个频率在下一帧都会经历不连续性,这将作为具有周期性跳跃的白噪声在全局范围内被听到。我在这里搜索了其他线程(很少),其中解决了频域中产生白噪声的问题,但从未提及这个大问题。我还没有找到一个简单的解决方案。如果有人可能有一个,他是受欢迎的,我提前感谢他。谢谢 在下一帧中,您可能有 0.2 的随机幅度和 4/5 pi 的随机相位。您在帧、周期之间存在不连续性。即使全局信号由许多具有随机幅度和相位的频率组成,每个单个频率在下一帧都会经历不连续性,这将作为具有周期性跳跃的白噪声在全局范围内被听到。我在这里搜索了其他线程(很少),其中解决了频域中产生白噪声的问题,但从未提及这个大问题。我还没有找到一个简单的解决方案。如果有人可能有一个,他是受欢迎的,我提前感谢他。谢谢 在下一帧中,您可能有 0.2 的随机幅度和 4/5 pi 的随机相位。您在帧、周期之间存在不连续性。即使全局信号由许多具有随机幅度和相位的频率组成,每个单个频率在下一帧都会经历不连续性,这将作为具有周期性跳跃的白噪声在全局范围内被听到。我在这里搜索了其他线程(很少),其中解决了频域中产生白噪声的问题,但从未提及这个大问题。我还没有找到一个简单的解决方案。如果有人可能有一个,他是受欢迎的,我提前感谢他。谢谢 每个频率在下一帧都会经历不连续性,这将作为具有周期性跳跃的白噪声在全球范围内被听到。我在这里搜索了其他线程(很少),其中解决了频域中产生白噪声的问题,但从未提及这个大问题。我还没有找到一个简单的解决方案。如果有人可能有一个,他是受欢迎的,我提前感谢他。谢谢 每个频率在下一帧都会经历不连续性,这将作为具有周期性跳跃的白噪声在全球范围内被听到。我在这里搜索了其他线程(很少),其中解决了频域中产生白噪声的问题,但从未提及这个大问题。我还没有找到一个简单的解决方案。如果有人可能有一个,他是受欢迎的,我提前感谢他。谢谢

实际上我发现周期性模式的原因要简单得多。当您对时域信号使用重叠窗口进行 STFT 处理时,重叠部分表示输入信号的相同公共部分。但是,如果我通过生成随机频谱帧来合成白噪声,则反向 fft 之后的重叠部分将包含不同的数据,因此会发生一些相位抵消,并且 COLA 窗口将按预期停止工作,因为事情无法总结。线性任何更长。这是一个很难解决的问题。人们应该能够以这样的方式合成频谱帧,即 ifft 之后的前半部分包含与前一帧的后半部分相同的信号,所有这些都在频域内完成。实现这一目标的唯一方法是拆分 fft 帧并重新组合,据我所知,所有操作只能通过频域中的长帧卷积来实现。因此,我得出结论,在 stft 上下文中使用重叠窗口合成白噪声是一场失败的战斗。我重复一遍,这很奇怪,任何作者 AFAIK 从未解决过这个事实,我也对这里没有收到任何反馈感到有点失望。

1个回答

完全有可能在频域中产生完美的白噪声,只是你的方法是错误的。根据定义,白噪声包含相同级别的所有频率。要在频域中产生它,您只需要一条平坦的线来表示幅度。线的价值是你的水平。然后生成一个填充了-pi 和+pi 之间随机值的相框。显然,每一帧都需要生成一组新的随机值。将其转换为笛卡尔坐标,然后使用具有重叠窗口的 STFT 重新合成 - 完成!