1

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

我自己在代码中生成正弦波,方法是计算在 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 似乎对所有内容都有影响)。

4

2 回答 2

1

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

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

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

于 2013-08-27T06:39:54.107 回答
0

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

于 2013-08-27T07:54:04.327 回答