分析.WAV文件

时间:2017-11-19 17:06:04

标签: c++ audio wav

我目前正在使用.WAV文件,我有一个问题。

我接近这个的方法是创建一个包含信息的结构:

typedef struct header_file{
    char chunk_id[4];
    int chunk_size;
    char format[4];
    char subchunk1_id[4];
    int subchunk1_size;
    short int audio_format;
    short int num_channels;
    int sample_rate;           
    int byte_rate;
    short int block_align;
    short int bits_per_sample;
    char subchunk2_id[4];
    int subchunk2_size; 
}header;

typedef struct header_file* wav_p;

现在,我试图像以下那样运行WAV文件:

    ofstream myFile;
    myFile.open("file.txt");
    FILE * file = fopen("file.wav", "rb");

    const int BUFFSIZE = 256;                           
    int count = 0;                                      
    short int buff[BUFFSIZE];                           
    wav_p wav = (wav_p)malloc(sizeof(header));
    int nb;                                             

    if (file)
    {
        fread(wav, 1, sizeof(header), file);    
        while (!feof(file)){
            nb = fread(buff, 1, BUFFSIZE, file);
            count++;

            for (int i = 0; i<BUFFSIZE; i += 1){
                //the following part i found on the internet so i'm not sure if it is good
                int h = (signed char)buff[i + 1];
                int c = (h << 8) | buff[i];
                double t = c / 32768.0;

                myFile << t << endl;
                if(abs(t)>1){
                //checking that a value is between -1 to 1
                }
            }
        }
    }
    fclose(file);
    myFile.close();

我的问题是:内部for是否正确?在file.txt中,我的所有值都在-1到1之间,所以我认为它很好,但我不确定,我是否正确地检查了.wav文件并按照我在#34; file.txt的&#34;很好(&#34; file.txt&#34;包含&#34; y轴&#34;文件功能的值,其中&#34; x轴&#34;是时间)

1 个答案:

答案 0 :(得分:1)

您的代码大部分是正确的。您没有检查wav标头以验证波形文件实际上是否包含16位样本。

您计算16位值是错误的,因为buffshort int的数组。如果buffchar数组,那么您使用的计算是正确的(但是您必须将i增加2)。

使用short int数组,您只需说int c = buff[i];,除非您的系统是大端系统。

由于-1.0&lt; = abs(t) > 1&lt; c,因此无需检查select = inv[int(item)-1] 1.0。