我在阅读16位.wav文件时遇到了麻烦.我已阅读标题信息,但转换似乎不起作用.
例如,在Matlab中,如果我在wave文件中读取,我会得到以下类型的数据:
-0.0064, -0.0047, -0.0051, -0.0036, -0.0046, -0.0059, -0.0051
Run Code Online (Sandbox Code Playgroud)
但是,在我的C++程序中,返回以下内容:
0.960938, -0.00390625, -0.949219, -0.00390625, -0.996094, -0.00390625
Run Code Online (Sandbox Code Playgroud)
我需要以相同的方式表示数据.现在,对于8 bit.wav文件,我做了以下内容:
uint8_t c;
for(unsigned i=0; (i < size); i++)
{
c = (unsigned)(unsigned char)(data[i]);
double t = (c-128)/128.0;
rawSignal.push_back(t);
}
Run Code Online (Sandbox Code Playgroud)
但是,当我为16bit执行此操作时,这很有用:
uint16_t c;
for(unsigned i=0; (i < size); i++)
{
c = (signed)(signed char)(data[i]);
double t = (c-256)/256.0;
rawSignal.push_back(t);
}
Run Code Online (Sandbox Code Playgroud)
不起作用并显示输出(上图).
我遵循这里发现的标准
哪里data是一个char数组,rawSignal是std::vector<double>我可能只是递过转换错了,但似乎无法找出.有人有什么建议吗?
谢谢
编辑:
这是现在显示的内容(在图中):

这是它应该显示的内容:

这里有一些问题:
假设有一个小端架构,你的代码看起来会更像这样(非常接近Carl的答案):
for (int i = 0; i < size; i += 2)
{
int c = (data[i + 1] << 8) | data[i];
double t = c/32768.0;
rawSignal.push_back(t);
}
Run Code Online (Sandbox Code Playgroud)
对于大端架构:
for (int i = 0; i < size; i += 2)
{
int c = (data[i] << 8) | data[i+1];
double t = c/32768.0;
rawSignal.push_back(t);
}
Run Code Online (Sandbox Code Playgroud)
该代码未经测试,请LMK如果不起作用.