首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >waveOut应用编程接口的意外波形

waveOut应用编程接口的意外波形
EN

Stack Overflow用户
提问于 2013-06-12 22:15:35
回答 1查看 157关注 0票数 0

我对waveOut接口有个问题。我想写一个简单的类结构,其中我有一个类AudioStream,它使音频输出变得非常简单。我有一个接受以下参数的构造器: AudioStream32(int sampleRate,int sampleSize,bool stereo,int bufferSize) (sampleSize是样本的字节大小,其余部分希望不言自明)

这个想法是,我初始化AudioStream一次,然后调用setSample(浮点采样)来设置音频流。这个类还处于起步阶段,所以目前只实现了双缓冲和单声道声音。

在setSample方法中,我将浮点样本转换为0到2^(8*sampleSize)范围内的无符号整数,然后将该无符号整数转换为无符号字符,也可以直接使用无符号整数,但这样就不能重用用于其他sampleSizes的代码。代码:

代码语言:javascript
复制
void AudioStream32::setSample(float sample)
{
unsigned int discreteSample = 1 + mid + ((float)mid * sample);

for (unsigned int i = 0; i < sampleSize; i++)
{
    data[pointr++] = (char)(discreteSample & 255);
    discreteSample = discreteSample >> 8;
    // (same as dividing by 256)
}

//... Non-relevant code that makes sure the buffer is sent to the audio device

mid是一个无符号整数,它被赋值为( 1 << (sampleSize *8- 1)) -1(这只是做2^(sampleSize *8-1)的一种更快的方法),所以当sampleSize为1时,它的值将为127,当sampleSize为2时,它的值为32767 (通常,大约是最大值的一半)。

当我使用1作为sampleSize时(因此,当我使用单个字符作为示例时),这可以很好地工作。然而,当我使用2作为sampleSize (或者使用2个字节或者一个短整型作为样本的大小)时,我得到了非常奇怪的结果。

我尝试流式传输一个简单的正弦波。当我使用1作为sampleSize时,我确实得到了一个正弦波作为波形。然而,当我使用2作为sampleSize时,我得到了以下奇怪的波形:

我通过连接音频输出和麦克风输入的迷你插孔电缆在Audacity中录制了波形,并将其录制为32位浮点流。输出实际上是一个16位的int流。

这似乎表明存在溢出问题,或者在无符号和有符号整数或字符之间进行转换时出现问题。更奇怪的行为发生了:缩放(或改变音量,无论你怎么称呼它)我发送给setSample方法的样本似乎并不重要,除非我将它设置为0或非常接近于0 (0.0001仍然产生相同的波形,0.00001产生静默)。

一个非常奇怪的事情是,当我尝试除以512而不是256 (即在setSample方法中将">> 8“改为">> 9”)时,一切似乎都有效(包括更改声音)。虽然声音比我使用1作为sampleSize时的声音要弱,所以这似乎仍然不是正确的方法。

遗憾的是,我不能以一种简单的方式将我写入声音设备的样本与声音设备的输出进行比较。这样一来,我至少可以找出问题出在字节格式上,还是在转换上。

有人知道这是怎么回事吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-12 22:25:03

这看起来像是一个正弦波,它的值是颠倒的。换句话说,如果你把正值从1调整到.5,再调整到0,调整到-.5,把负值从-1调整到-.5,再调整到0,再调整到.5,你就会得到一个正弦波。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17067845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档