0

我一直在努力将数据从音频缓冲区正确写入波形文件......我已经检查了生成正弦波到 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 方法有问题。

4

1 回答 1

0

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

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

于 2013-07-23T05:29:40.290 回答