在C/ c++中读取和处理WAV文件数据
Reading and processing WAV file data in C/C++
我现在正在做一个非常非常重要的学校项目。我需要在C/c++中提取WAVE文件的信息,并使用这些信息来获得语音信号的LPC。但是,为了做到这一点,我需要对信号做一些预处理,比如做过零和能量分析,以及其他一些事情。这意味着我需要符号和实数。问题是我不知道如何获得有用的信息和正确的格式。我已经阅读了文件中的每一个字段,但我不确定我做得对不对。建议,好吗?
我现在是这样读取文件的:
readI = readad (&bps, 1,2, audio);Printf ("bits per sample = %d n", bps);
我的第一个建议是使用某种库来帮助您。大多数合理的解决方案似乎都是多余的,所以一个简单的库(就像你的问题评论中推荐的libsndfile)应该可以解决这个问题。
如果你只是想知道如何阅读WAV文件,这样你就可以自己写了(因为你的学校可能会对你像其他普通人一样使用图书馆嗤之以鼻),一个快速的谷歌搜索会给你所有你需要的信息,还有一些人已经写了很多关于阅读。WAV格式的教程。
如果你仍然不明白,这里有一些我自己的代码,我读取头和WAV/RIFF数据文件的所有其他块,直到我得到数据块。它完全基于WAV格式规范。提取实际的声音数据并不难:您可以读取原始数据并使用原始数据,或者将其转换为内部更舒适的格式(32位PCM未压缩数据或其他东西)。
查看下面的代码时,将reader.Read...( ... )
替换为等效的fread
调用,用于指定类型的整数值和字节大小。WavChunks
是WAV文件块内部id的小端值枚举,format
变量是WAV文件格式中可包含的WAV格式类型之一:
enum class WavChunks {
RiffHeader = 0x46464952,
WavRiff = 0x54651475,
Format = 0x020746d66,
LabeledText = 0x478747C6,
Instrumentation = 0x478747C6,
Sample = 0x6C706D73,
Fact = 0x47361666,
Data = 0x61746164,
Junk = 0x4b4e554a,
};
enum class WavFormat {
PulseCodeModulation = 0x01,
IEEEFloatingPoint = 0x03,
ALaw = 0x06,
MuLaw = 0x07,
IMAADPCM = 0x11,
YamahaITUG723ADPCM = 0x16,
GSM610 = 0x31,
ITUG721ADPCM = 0x40,
MPEG = 0x50,
Extensible = 0xFFFE
};
int32 chunkid = 0;
bool datachunk = false;
while ( !datachunk ) {
chunkid = reader.ReadInt32( );
switch ( (WavChunks)chunkid ) {
case WavChunks::Format:
formatsize = reader.ReadInt32( );
format = (WavFormat)reader.ReadInt16( );
channels = (Channels)reader.ReadInt16( );
channelcount = (int)channels;
samplerate = reader.ReadInt32( );
bitspersecond = reader.ReadInt32( );
formatblockalign = reader.ReadInt16( );
bitdepth = reader.ReadInt16( );
if ( formatsize == 18 ) {
int32 extradata = reader.ReadInt16( );
reader.Seek( extradata, SeekOrigin::Current );
}
break;
case WavChunks::RiffHeader:
headerid = chunkid;
memsize = reader.ReadInt32( );
riffstyle = reader.ReadInt32( );
break;
case WavChunks::Data:
datachunk = true;
datasize = reader.ReadInt32( );
break;
default:
int32 skipsize = reader.ReadInt32( );
reader.Seek( skipsize, SeekOrigin::Current );
break;
}
}
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用流处理接收到的数据
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 基于多个条件处理地图中的所有元素
- 如何用数字处理log(0)
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- 错误处理.将系统错误代码映射到泛型
- 从文本文件中读取时钟时间和事件时间并进行处理
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 用于矢量处理的多个线程
- 对字符串进行排序时,在c++中处理sort()
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- 处理除以零会导致<csignal>意外行为
- 处理文件期间输出失真.wav
- 在C/ c++中读取和处理WAV文件数据