写入wav[PMC]的音频缓冲区整数会产生高噪声
Audio buffer integer written to wav [PCM] creates high noise
我几天来一直在努力将数据从音频缓冲区正确写入波形文件。。。我已经检查过生成一个正弦波到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。
- 在细胞中产生噪声 - CPP 和 GLSL
- 在没有密钥的情况下读取密文的剩余噪声预算
- 为什么这个噪声函数不处理否定参数?
- 如何使用中值滤波器算法去除胡椒噪声
- 使用Kalman滤波器来filt噪声,而不会延迟OpenCV C
- 如何创建用于生成噪声的哈希函数
- 了解 3D 柏林噪声
- 单纯噪声范围太小
- OpenCV噪声消除静态摄像机的视频
- 生成高斯噪声
- 实时图像处理:HSV图像中的噪声(openCV)
- 使用C 加入高斯噪声
- 用于跨平台(C /Android)无损/低噪声视频压缩/减压的库
- 如何获得粉红噪声的每倍频程功率(使用Aquila DSP库)
- 如何从xKinect视频中去除像素噪声
- 值噪声随机函数奇异输出
- 帧差噪声
- 写入wav[PMC]的音频缓冲区整数会产生高噪声
- 加入高斯噪声
- 使用Qt添加高斯白噪声