Python C++;-读取16位.wav文件

Python C++;-读取16位.wav文件,python,c++,audio,Python,C++,Audio,我试图读入一个.wav文件,我认为它给出了正确的结果,但是,当我用Matlab或Python绘制相同的音频文件时,结果是不同的 这是我得到的结果: 这是Python(使用matplotlib绘制)给出的结果: 结果似乎没有什么不同,但是,当涉及到分析时,这会把我的结果搞砸 以下是转换的代码: for (int i = 0; i < size; i += 2) { int c = (data[i + 1] << 8) | data[i]; double t =

我试图读入一个.wav文件,我认为它给出了正确的结果,但是,当我用Matlab或Python绘制相同的音频文件时,结果是不同的

这是我得到的结果:

这是Python(使用matplotlib绘制)给出的结果:

结果似乎没有什么不同,但是,当涉及到分析时,这会把我的结果搞砸

以下是转换的代码:

for (int i = 0; i < size; i += 2)
{
    int c = (data[i + 1] << 8) | data[i];
    double t = c/32768.0;
                //cout << t << endl;
    rawSignal.push_back(t);
}
for(int i=0;iint c=(data[i+1]我怀疑您的问题可能是
data
是一个有符号的
char
值数组。因此,执行此操作时:

int c = (data[i + 1] << 8) | data[i];

int c=(data[i+1]转换什么的代码?那里的
size
data
是什么?您试图复制的对应Python代码是什么?以及“原始”代码是什么格式为
rawSignal
?通常浮点音频的范围为-1到1或0到1,但看起来是从0到2(因为你从0到65535取整数,假设
data
是一个
无符号字符*
,然后除以32768.0)。@abarnert我想把原始数据转换成“double”因此,
/32768.0
是的,但可能不仅仅是“双精度”,但一些标准格式的双精度。同样,
/32768.0
会给你一个0.0-2.0的双精度,我怀疑这是你想要的。除非
data
是一个有符号字符的数组,在这种情况下,你会遇到另一个问题。@abarnert数据只是一个普通字符
char*data;
但是,结果范围在2.0以上,这是一个特殊的值我认为问题出在哪里。这里的错误是什么?我正在查看我的代码,看不到它,而您可以看到,我没有用于
数据的无符号或有符号字符,那么这怎么可能是问题呢?@user1326876您说
数据
字符*
,这在大多数系统上意味着它是有符号的数据类型。值将范围从-128到127,而不是从0到255。比例不是0.0到2.0,而是-1.0到1.0。这对于处理目的来说是可以的。@Mark Ransom-那么问题出在哪里?我的意思是,这两个图看起来完全相同,只有几个小部分differences@user1326876将
数据
声明为
无符号字符*
uint8\u t*
,然后重试.
if(bits_per_sample == 8)
        {
            uint8_t c;  
            //cout << size;
            for(unsigned i=0; (i < size); i++)
            {
                c = (unsigned)(unsigned char)(data[i]);
                double t = (c-128)/128.0;
                rawSignal.push_back(t);
            }
        }
        else if(bits_per_sample == 16)
        {

            for (int i = 0; i < size; i += 2)
            {
                int c;
                c = (unsigned) (unsigned char) (data[i + 2] << 8) | data[i];
                double t = c/32768.0;
                rawSignal.push_back(t);
        }
int c = (data[i + 1] << 8) | data[i];