【问题标题】:Outputting audio (Windows Audio API) - low frequencies quiet输出音频(Windows 音频 API) - 低频安静
【发布时间】:2013-08-27 01:57:20
【问题描述】:

好的,所以我有一个小程序,用户可以在其中控制音频信号的输出频率并播放歌曲(理论上:))。

我自己在代码中生成正弦波,方法是计算在 44100Hz 采样的情况下,该波形的单个周期需要多少点。像这样:

    for (int k = 0; k < points_sine_wave; k++)
        {
            // Generate sine wave
            sineWave[k] = pow(2.0,10) * (sin(2*3.14159*f*td*k + old_angle) + 1);

        }

td 是 delta t(常数),f 是频率,k 只是一个索引。为了确保频率变化时正弦波的连续性,我使用 old_angle 保存它来记住要从哪个角度恢复。我检查了这里生成的波形,它可以工作(正弦波保持连续但会改变频率)。 +1 是为了让一切都变得积极。

现在,根据我在 pow(2.0, x) 中输入的内容,我可能听不到低频。好像在 2^7 时,我可以听到一切正常(100Hz 是有趣的东西),但是如果我转到 2^6 或 2^5,我就再也听不到低频了。

我通过 Audacity 查看了我的输出,发现高频分量总是占据整个垂直范围(-1 到 1),而低频部分介于 -0.4 到 0.4 之间。

这是为什么呢?我写入缓冲区的信号都是相同的最大幅度(在 Matlab 中检查 - 如果你愿意,可以发布这个)。

格式设置为 PCM,位数为 32,有效位数也为 32(尽管 32 似乎对所有内容都有影响)。

【问题讨论】:

    标签: c++ visual-c++ audio


    【解决方案1】:

    最有可能的答案是您播放声音的扬声器不擅长再现如此低的波长。例如,台式电脑扬声器通常是won't produce sounds below 50Hz。如果你有一个低音炮或真正高质量的扬声器,当然,你会做得更好。

    当然,另一种可能性是您生成的正弦波有问题......但总的来说,如果您放大到足够近以查看单个样本,那么在 Audacity 中这将是显而易见的。也就是说,如果视觉看起来像一个正弦波,那么它很可能是一个正弦波。 (如果不是,例如,如果有任何突然的中断,您会在播放音频时听到非常明显的噪音!)

    最后一点:假设您的 PCM 格式使用带符号的样本值,我怀疑如果您将正弦波保持在 X 轴垂直居中会更好;即具有相同数量的正值和负值。如果您将所有值保持为正,那么您的扬声器将播放带有 DC 偏移的音频,这对于various reasons 来说可能很糟糕(或至少次优)。

    【讨论】:

    • 我敢打赌最后一个问题。 Audacity 没有显示 DC 偏移这一事实意味着它必须通过一些过滤器,可能是 D/A - A/D 转换。删除+1。 “32 位似乎可以解决所有问题”是同一问题的另一个指标。 32 位 PCM 具有 31 位幅度,因为符号需要一位。忽略这一点,您会遇到令人讨厌的溢出,可能会环绕为负值。如果你的正弦曲线从 19 亿到 2.0 到 2.1 到 -2.1 再回到 2.1,你就会听到非常讨厌的咔哒声。
    • 谢谢,我认为你对我给出的 DC 偏移量是正确的。我删除了“+1”,现在可以使用了!
    【解决方案2】:

    您有 31 位可能的幅度,并使用 2^7 或 2^6 作为实际幅度?有许多声卡只能做 24 位。事实上,16 位并不被认为是非常糟糕的。

    【讨论】:

      猜你喜欢
      • 2016-10-18
      • 1970-01-01
      • 2012-04-27
      • 2011-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      相关资源
      最近更新 更多