好的,所以我有一个小程序,用户可以在其中控制音频信号的输出频率并播放歌曲(理论上:))。
我自己在代码中生成正弦波,方法是计算在 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 似乎对所有内容都有影响)。