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

Audio buffer integer written to wav [PCM] creates high noise

本文关键字:高噪声 噪声 整数 PMC wav 缓冲区 音频 写入      更新时间:2023-10-16

我几天来一直在努力将数据从音频缓冲区正确写入波形文件。。。我已经检查过生成一个正弦波到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进行分析时,文件中有许多噪声所预期的峰值。我哪里出了问题?endianes是其中的一个问题吗?

编辑(已解决):

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

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

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