输出音频(Windows Audio API)
好的,所以我有一个小程序,用户可以在其中控制音频信号的输出频率并播放歌曲(理论上:))。
我自己在代码中生成正弦波,通过计算它在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似乎适用于所有情况)。
最可能的答案是你正在播放声音的扬声器不善于再现低的波长。 例如,台式电脑扬声器通常不会产生50Hz以下的声音。 如果你有低音炮或者非常高品质的扬声器,当然,你会做得更好。
另一种可能性当然是你正在产生的正弦波出现问题......但总的来说,如果你放大得足够紧密以便看到单个样品,那么在Audacity中就会很明显。 也就是说,如果视觉看起来像一个合适的正弦波,那么它很可能是一个正确的正弦波。 (如果不是这样,例如,如果有任何突然的不连续点,它会在播放时听到非常明显的噪音!)
最后一个注意事项:假设您的PCM格式使用带符号的采样值,我怀疑如果将正弦波垂直居中在X轴上,效果会更好; 即具有相同数量的正值和负值。 如果保持所有的值都是正值,那么您的扬声器将播放带有DC偏移的音频,这可能会因各种原因而变差(或至少次优)。
你有31位可能的幅度,并使用2 ^ 7或2 ^ 6作为实际幅度? 有很多只能做24位的声卡。 实际上,16位并不算太坏。
链接地址: http://www.djcxy.com/p/33837.html