2017-01-09 3 views
1

Я работаю над небольшим инструментом, который считывает данные из wav-файла. Этот инструмент сначала извлекает заголовок, а затем разделяет аудиоданные на левый и правый каналы. Аудиофайлы - это только файлы с частотой дискретизации 44100 Гц, 16 бит PCM и двухканальными.c - запись данных в wav-файл

После обработки данных я хочу записать данные в выходной файл и добавить 100 нулей на каждый канал. Здесь возникает проблема: сначала только половина желаемых образцов добавляется к каждому каналу. Во-вторых, первая половина добавленных «нулей» представляет собой случайные данные.

Смотрите мой код ниже

#include <stdlib.h> 
#include <stdio.h> 

#define BUFFSIZE 1024 
#define NUM_ZEROS 100 

#include <stdio.h> 
#include <stdlib.h> 

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* header_p; 


int main(int argc, char** argv){ 

    if(argc != 3){ 
     printf("Wrong number of input arguments. Aborting.\n"); 
     return -1; 
    } 

    char *inputFile = argv[1]; 
    char *outputFile = argv[2]; 

    FILE * infile = fopen(inputFile, "r+"); 
    FILE * outfile = fopen(outputFile, "w+"); 

    int count = 0;          // For counting number of frames in wave file. 
    short int buff16[2*BUFFSIZE];      // short int used for 16 bit as input data format is 16 bit PCM audio 
    short int buffLeft[BUFFSIZE], buffRight[BUFFSIZE]; 
    header_p meta = (header_p)malloc(sizeof(header)); // header_p points to a header struct that contains the wave file metadata fields 
    int nb, cnt;          // variable storing number of bytes returned 

    printf("Buffers initialized.\n"); 

    if (infile) 
    { 
     fread(meta, 1, sizeof(header), infile); 
     meta->subchunk2_size = meta->subchunk2_size + 2 * NUM_ZEROS; 
     fwrite(meta,1, sizeof(*meta), outfile); 


     while (!feof(infile)) 
     { 
      nb = fread(buff16,1,BUFFSIZE,infile);  // Reading data in chunks of BUFSIZE 
      count++;         // Incrementing Number of frames 

      for(cnt = 0; cnt < nb/2; cnt++){ 
       buffLeft[cnt] = buff16[2*cnt]; 
       buffRight[cnt] = buff16[2*cnt+1]; 
      } 

      /* 
      * TODO: INSERT SIGNAL PROCESSING PART 
      */ 

      for(cnt = 0; cnt < nb/2; cnt++){ 
       buff16[2*cnt] = buffLeft[cnt]; 
       buff16[2*cnt+1] = buffRight[cnt]; 
      } 

      fwrite(buff16,1,nb,outfile); 
     } 

     for(cnt = 0; cnt < 2*NUM_ZEROS; cnt++){ 
      buff16[cnt] = 0; 
     } 
     fwrite(buff16,1, 2*NUM_ZEROS,outfile); 

     printf("Number of frames in the input wave file are %d.\n", count); 
    } 

    fclose(infile); 
    fclose(outfile); 

    return 0; 
} 

ли кто-то есть идея, что я сделал не так?

ответ

0

Вы

#define NUM_ZEROS 100 

и

fwrite(buff16,1, 2*NUM_ZEROS,outfile); 

Цель:

Я хочу, чтобы записать обратно данные в выходной файл и добавить 100 нулями на каждом канале.

Я думаю, что на каждом канале должно быть 100 ОБРАЗЦОВ. Поскольку у вас есть 16-битный PCM, каждый образец составляет 2 байта. Таким образом, для одного канала необходимо записать 200 байт (нулей). Стерео означает 400 байт.

Ваш fwrite сохраняет только 2 * NUM_ZEROS, поэтому 200 байт - это ответ на часть пропущенных образцов.

Кроме того, вы объявить

короткий INT buff16 [2 * BUFFSIZE];

при чтении только половины его и использовании половины половины (nb/2) для обработки. Затем напишите полный буфер (на самом деле половина объявленного) с верхней половиной, заполненной случайным мусором из памяти.

0

Вы уверены, что только часть добавленных нулей - это мусор?

Вы запутались размер данных для fread и fwrite

Ваши буферы short int:

short int buff16[2*BUFFSIZE]; // BUFFSIZE*2*sizeof(short) bytes 

Читаешь только 1/4 этого размера:

nb = fread(buff16,1,BUFFSIZE,infile); // BUFFSIZE bytes 

Это читает BUFSIZEбайтов, поскольку вы указываете только размер 1 на элемент. Вместо BUFFSIZE*2 шорты вы прочитали только BUFFSIZE байт. Возвращаемое значение - это количество элементов чтения, т. Е. Байтов. В вашем буфере этот объем данных достаточен только для nb/2 элементов, но вы получаете доступ к buff16[0] .. buff16[nb-1], где вторая половина его не была прочитана из файла. К счастью, вы также не записываете вторую половину назад в новый файл, так как там также присутствует та же ошибка с длиной . И, наконец, та же проблема возникает, когда вы добавляете нулевые значения в файл.

Т.Л., др

Измените параметр размера для fread и fwrite к sizeof(short int).

Смежные вопросы