写入wav [PCM]的音频缓冲区整数会产生高噪声

时间:2013-06-27 18:36:24

标签: c++ wav asio

我一直在努力将数据从音频缓冲区正确地写入波形文件...我已经检查过生成正弦波到wav文件,它工作正常。但是,将音频缓冲区数据作为Int16写入wav文件会导致恒定的高白噪声。即我几乎听不到我在乐器上播放的内容(严重扭曲)。音频缓冲区使用来自steinberg的ASIO SDK从ASIO输入缓冲区获取。

这是填充每个输入缓冲区时调用的函数。缓冲区大小为176个样本。我将缓冲区的值从它返回的地址复制到一个名为sound的指针中。 (如果我在没有缓冲区的情况下放入正弦波,这没有噪音)

 void bufferSwitch(long index, ASIOBool processNow)   {


   for(int i=0; i<176; i++) {

   memcpy(sound+soundcount,(Int16 *)bi.buffers[index]+i,2);

   soundcount++;

   }

 } 

波形标题如下。标题可以正常波动地播放和播放。

strcpy(WAV->ChunkID, "RIFF");
WAV->ChunkSize = (uint32_t)size - 8;
strcpy(WAV->RIFFType, "WAVE");

strcpy(Format->ChunkID, "fmt ");
Format->ChunkSize = 16;
Format->CompressionCode = 1;
Format->Channels = 1;
Format->SampleRate = (uint32_t)44100;
Format->SigBitsPerSamp = 16;
Format->BlockAlign = 2;
Format->AvgBytesPerSec = Format->BlockAlign * 44100;

strcpy(Datal->ChunkID, "data");
Datal->ChunkSize = 3 * 44100 *2;
sound = (Int16 *)(Datal + 1);

来自ASIO SDK的GetSampleType()指定的样本类型为16,即Int 16 LSB。因此我使用Int16作为样本的数据类型。当使用printf打印样本时,它在每个样本中提供+25和-25之间的低值(它是低的,因为在16位pcm wav中值介于+32767和-32767之间)。我不明白高噪音是如何产生的。但是,通过Audacity进行分析时,文件会有很多峰值,如噪音所预期的那样。我在哪里出错了,并且在这方面是一个问题吗?

编辑(已解决):

好的,我发现了错误。正如我所说,输入和缓冲区完美无瑕。写入数据时出错。我之前使用fwrite编写缓冲区,导致垃圾字节被添加到文件中。现在我使用ofstream来编写数据,它就像魔术一样。我认为fwrite方法有问题。

1 个答案:

答案 0 :(得分:0)

我从十六进制编辑器中检查了wav文件,发现了一些有趣的发展。数据完美地写入大约380个字节。然后为大约另外400个字节写入大的垃圾整数。但是,当我通过循环来打印指针中的值时,值是准确的。

解决方案是使用ofstream写入文件而不是使用fwrite。