在某些采样率下采样低频声音不起作用

信息处理 声音的 音频处理 混叠 C C++
2022-02-12 00:26:21

在对低频声音(如 55Hz 正弦波)进行采样时,我会在某些采样率下听到额外的高频声音,但在其他采样率下则听不到。这发生在 Audacity 和我自己的程序中。例如,我在以 44,100 Hz 采样时同时听到低音和高音,但在以 48,000 Hz 采样时只能听到低音。这可能是什么?

更多信息:

其他输入频率存在高频,它不依赖于幅度。

我正在使用 C++ 中的标准 sin() 函数对正弦波进行采样:

for( int i = 0; i < N; i++ )
{
    float time = float(i) / float(samples_per_second);
    output[i] = sin( 2*pi * 55 * time ) * 0.5;
}

不知道 Audacity 是如何做到的。使用 Audacity 我生成一个正弦音,然后仅更改项目的采样率将使高音出现/消失。

播放低音鼓声音(在 Audacity 和我的程序中)也会发生同样的事情。我只是通过索引到从 .wav 文件加载的表来对其进行采样。

更多信息:

我注意到高频伪影听起来与以不同速率采样但没有插值相同,如下所示:

float in_idx = 0.0f;
for( int out_idx = 0; out_idx < N; out_idx++ )
{
    output[out_idx] = input[ int(in_idx) ];
    in_idx += 44100.0f / 48000.0f;
}

因此,Windows 或驱动程序或硬件可能出于某种原因决定不使用插值。

3个回答

可能是几件事

  1. 你可能是边缘剪裁。您的正弦波的幅度为 1,正好位于削波的边缘(取决于其渲染方式)。用0.5的幅度试试
  2. 你的硬件很马虎。例如,廉价的笔记本电脑声卡经常在抗锯齿过滤器和/或削波管理中偷工减料
  3. 您的操作系统配置不当,尤其是在您使用 Windows 时。如果您在项目中更改采样率,它可能只是触发操作系统进行采样率转换。如果声卡本身只支持 48 kHz,那么操作系统会将 44.1 kHz 上变频到 48 kHz,并且采样率转换器的质量可能会很差。在 Windows 上,所有音频都通过内核混音器(除非您专门绕过它),并且这通常也会与音频混淆。
  4. 驱动问题。操作系统和声卡之间的接口可能很草率。

这很可能是因为过滤后采样不充分。采样后,您将重复正弦曲线的频谱,这需要被过滤掉。

或者在采集中产生非线性。

您只能在某些采样率下听到它的原因是 Audacity 中的过滤(带宽)放大了某些采样率的效果,因为这些重复或非线性将根据采样率落在不同的频率范围内

Microsoft 的众多音频 API(MME,又名“waveOut”)之一在 Windows 7 中存在错误。 https://www2.iis.fraunhofer.de/AAC/ie9.html

我正在使用库 PortAudio,所以我的解决方案是在没有 MME 支持的情况下编译它,强制它使用 DirectSound 或 WASAPI。