输出音频(Windows Audio API) - 低频安静

时间:2013-08-27 01:57:20

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

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

我自己在代码中生成正弦波,通过计算一个波段的单个周期需要多少点,因为它以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是为了让一切都好。

现在,根据我投入的电量(2.0,x),我可能听不到低频。好像在2 ^ 7,我可以听到一切都很好(100Hz是感兴趣的东西),但是如果我去2 ^ 6或2 ^ 5,我再也听不到低频了。

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

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

格式设置为PCM,位数为32,有效位数也为32(尽管32似乎可以阻止所有内容)。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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