【问题标题】:How to generate band-limited random noise with flat spectrum?如何生成具有平坦频谱的带限随机噪声?
【发布时间】:2025-12-08 02:00:01
【问题描述】:

如何生成 500 ms 的噪声,采样频率为 1280 Hz,频率分布在 0.1 - 640 Hz 之间,幅度值呈正态分布?

有关所需输出的说明,请参见下面的屏幕截图。

Timeplot of waveform, frequency distribution, and histogram of amplitudes

【问题讨论】:

  • 您能否确认您的帖子可以总结如下:“如何生成 500 ms 的噪声,采样频率为 1280 Hz,频率分布在 0.1 - 640 Hz 之间,幅度值呈正态分布?”
  • @Sheljohn 是的,这肯定是一种更简洁的表达方式!为我的冗长道歉!我要做的唯一补充是幅度值应正态分布在 -500 到 +500 的范围内(嗯,至少 99.7% 的幅度在上述范围内)。
  • 这是不必要的限制;任何正态分布的输出都可以线性重新调整到任何所需的范围。我可以编辑您的帖子以使其更简洁,但您愿意这样做吗?
  • 谢谢,但这不是必需的。我用你的措辞编辑了这篇文章。再次感谢。
  • 谢谢,为了清楚起见,我还编辑了标题;我正在为您的帖子寻找答案,但基本上您只需要在傅立叶域中工作。将来,您应该在问题中提供mcve,以展示您的尝试并说明为什么它没有达到您的预期。

标签: matlab random noise


【解决方案1】:

您问题的参数使答案变得微不足道:

  • 640 Hz 正好是 1280 Hz 的一半,因此这是傅里叶分解中的最高频率(奈奎斯特);
  • 0.1 Hz 远低于 1 / 500ms = 2Hz,这是傅立叶分解的频率分辨率,因此是您可以控制的最低正频率。

因此,在您的情况下,“带限”约束是微不足道的,您可以简单地生成所需的噪声:

duration  = 500e-3;
rate      = 1280;
amplitude = 500;

npoints   = duration * rate;
noise     = amplitude * randn( 1, npoints ); % normally distributed white noise
time      = (0:npoints-1) / rate;

但是,更一般地,在特定频带中生成噪声并受到频谱形状(例如平坦)和值统计(例如正态分布)的限制可能很困难。我能想到两个简单的近似值:

  • 在时域中工作,首先通过从选择的分布中提取值来强制执行值统计约束,然后使用带通 FIR 滤波器对结果信号进行滤波。对于这个近似值,请注意过滤器也会影响值的分布,因此通常情况下,除非您非常仔细地设计过滤器,否则您对值统计的约束将无法满足。
  • 从傅里叶域向后工作,首先对幅度系数实施约束,为相位获取随机噪声,然后使用逆变换返回时域。对于这个近似值,请注意相位分布将以非平凡的方式影响值的时间分布,具体取决于幅度约束,并且如果您的采样率远大于频率截止,则可能需要对谐波实施约束幅度以及避免伪影。

【讨论】: