提问人:GDN9 提问时间:11/8/2023 最后编辑:GDN9 更新时间:11/9/2023 访问量:59
为什么此代码会在波形序列中引入嘶嘶声/噪声
Why does this code introduce hiss/noise into wave sequence
问:
我正在尝试从不同的文件中提取 PCM 波形序列(不是音频文件但包含音频数据和其他数据的文件都在一个文件中),虽然此代码确实提取了预期的音频,但它似乎在序列中引入了非常可听的嘶嘶声/噪音。
我试图找到类似的主题,但我遇到的唯一问题是“混叠”或“抖动”?我已经用一堆不同的文件和格式尝试了这段代码,它似乎在所有内容中都添加了相同的嘶嘶声,所以嘶嘶声绝对不包含在我试图从中提取数据的原始文件中。
我知道原始文件包含 MONO 16 位 48Khz PCM 数据。
int main()
{
const int lenght = 180; //file length, just a "long enough" number to make sure there's enough space for the whole sequence from the original file
const unsigned short bits = 16;
const unsigned int bitrate = 48000;
const unsigned short channels= 1;
std::ifstream file("samplesfile.img", std::ios::binary); //the original file that contains all sorts of data, plus a simple wave sequence
// Offset 1byte to align with the wave sequence bytes
unsigned int offsetAmount = 1;
if (offsetAmount > 0)
{
unsigned char tmp[bits];
file.read(reinterpret_cast<char*>(tmp), sizeof(unsigned char) * offsetAmount);
}
// Read everything from file after the offset and interpret it as a wave sequence
unsigned char* samples = new unsigned char[bitrate * lenght];
file.read(reinterpret_cast<char*>(samples), sizeof(unsigned char) * bitrate * lenght);
file.close();
// creating a .wav file, calculating chunk data
unsigned short PCM = 1;
unsigned int chunk1size = 16;
unsigned int chunk2size = lenght * bitrate;
unsigned int chunkSize = chunk2size + 40;
unsigned int byteRate = (bitrate * channels * bits) / 8;
unsigned short blockAlign = (bits * channels) / 8;
std::ofstream file2("res.wav", std::ios::binary);
if (file2.good())
{
file2.flush();
file2.write("RIFF", sizeof(char) * 4);
file2.write(reinterpret_cast<const char*>(&chunkSize), sizeof(unsigned int));
file2.write("WAVE", sizeof(char) * 4);
file2.write("fmt ", sizeof(char) * 4);
file2.write(reinterpret_cast<const char*>(&chunk1size), sizeof(unsigned int));
file2.write(reinterpret_cast<const char*>(&PCM), sizeof(unsigned short));
file2.write(reinterpret_cast<const char*>(&channels), sizeof(unsigned short));
file2.write(reinterpret_cast<const char*>(&bitrate), sizeof(unsigned int));
file2.write(reinterpret_cast<const char*>(&byteRate), sizeof(unsigned int));
file2.write(reinterpret_cast<const char*>(&blockAlign), sizeof(unsigned short));
file2.write(reinterpret_cast<const char*>(&bits), sizeof(unsigned short));
file2.write("data", sizeof(char) * 4);
file2.write(reinterpret_cast<const char*>(&chunk2size), sizeof(unsigned int)); // 40 bytes up to here
file2.write(reinterpret_cast<const char*>(samples), chunk2size);
}
file2.close();
delete[] samples;
return 0;
}
结果:
答: 暂无答案
评论
-1
0
+0.5