Заполнение поплавка ** из int16_t * - PullRequest
0 голосов
/ 19 июня 2020

Мне нужно преобразовать int16_t * в float **

Мне нужно, чтобы они прошли через функцию, которая требует и входной буфер, например:

const float * const * const buf,

Распределение float * *

  micsbuf = (float **)malloc(CHANNELS * sizeof(float *));
  farbuf = (float **)malloc(CHANNELS*sizeof(float *));
  for(int c1 = 0;c1 < CHANNELS;c1++)
  {
    micsbuf[c1] = (float *)malloc(BUFFER_LENGTH*sizeof(float));
    farbuf[c1] = (float *)malloc(BUFFER_LENGTH*sizeof(float));

  }

Остальная часть кода:

while(!feof(infile) || !feof(outfile))
  {
    NreadNear = fillBufferIn(infile, &bufferIn, bytes);
    NreadFar = fillBufferOut(outfile,&bufferOut,bytes);

    int16_t *bufferInCasted = (int16_t *)bufferIn;
    int16_t *bufferOutCasted = (int16_t *)bufferOut;

    for(int i = 0 ; i < 480 ; i++)
    {
      for(int c2 = 0 ; c2 < CHANNELS ; c2 ++)
      {
        micsbuf[c2][i] = (float )bufferInCasted[i];
        micsbuf[c2][1+i*2] = (float )bufferInCasted[1+i*2];
        farbuf[c2][i] = (float )bufferOutCasted[i];
        farbuf[c2][1+i*2] = (float )bufferOutCasted[1+i*2];
      }
      printf("I:  %d\t", i);
      printf("Left Sample Near %d\t", bufferInCasted[i]);
      printf("Right Sample Near %d\t\t", bufferInCasted[1+i*2]);
      printf("Left Sample Far %d\t", bufferOutCasted[i]);
      printf("Right Sample Far %d\n\n", bufferOutCasted[1+i*2]);
    }
  }

Проблема в том, что когда я выполняю функцию, которая требует этого, эта функция приводит к Seg.Fault. Это проприетарная библиотека.

/**
 * @brief 
 * Should fill up the buffer;
 * @param mics 
 * @param bufferIn 
 * @return size_t 
 */ 
size_t fillBufferIn(FILE *in, void **buffer, size_t bytes) //1920 byte
{ 
  size_t Nread;
  /**
   * @brief 
   * Should return a buffer with float[][] so that it can read and write
   * Each time it read sizeof of two int16_t which are the left channel and right channel
   * 
   */
  *buffer = (void *)calloc(480,2*sizeof(int16_t));
  Nread = fread(*buffer, 2*sizeof(int16_t), 480, in);
  return 2*sizeof(int16_t)*Nread;
}

/**
 * @brief 
 * Should fill up the buffer
 * @param out 
 * @param bufferOut 
 * @param bytes 
 * @return size_t 
 */
size_t fillBufferOut(FILE *out, void **bufferOut, size_t bytes)
{
  *bufferOut = (void *)calloc(480,2*sizeof(int16_t));
  Nread = fread(*bufferOut, 2*sizeof(int16_t), 480, out);
  return 2*sizeof(int16_t)*Nread;
}

Ответы [ 2 ]

1 голос
/ 19 июня 2020
  1. Ваши блоки malloc ed для micsbuf[c1] и farbuf[c1] составляют только половину от необходимого размера. Вам нужно место для BUFFER_LENGTH пар сэмплов слева / справа. Вот исправленная версия:

      for(int c1 = 0;c1 < CHANNELS;c1++)
      {
         micsbuf[c1] = (float *)malloc(BUFFER_LENGTH*2*sizeof(float));
         farbuf[c1] = (float *)malloc(BUFFER_LENGTH*2*sizeof(float));
    
      }
    
  2. Неверный код для заполнения и доступа к левой / правой парам образцов. Он перезаписывает более ранние сэмплы и оставляет некоторые сэмплы незаполненными. Индексы для левого канала должны быть изменены с i на i*2 так, чтобы они находились непосредственно перед индексами для правого канала 1+i*2. Вот исправленная версия:

        for(int i = 0 ; i < 480 ; i++)
        {
          for(int c2 = 0 ; c2 < CHANNELS ; c2 ++)
          {
            micsbuf[c2][i*2] = (float )bufferInCasted[i*2];
            micsbuf[c2][1+i*2] = (float )bufferInCasted[1+i*2];
            farbuf[c2][i*2] = (float )bufferOutCasted[i*2];
            farbuf[c2][1+i*2] = (float )bufferOutCasted[1+i*2];
          }
          printf("I:  %d\t", i);
          printf("Left Sample Near %d\t", bufferInCasted[i*2]);
          printf("Right Sample Near %d\t\t", bufferInCasted[1+i*2]);
          printf("Left Sample Far %d\t", bufferOutCasted[i*2]);
          printf("Right Sample Far %d\n\n", bufferOutCasted[1+i*2]);
        }
    

    Вам также следует подумать о замене magi c number 480 в l oop на BUFFER_LENGTH, если это правильно, или на другие символы c постоянный.

0 голосов
/ 19 июня 2020

Проблема в строке micsbuf[c2][1+i*2] = (float )bufferInCasted[1+i*2];. Вы выделяете подмассив размером micsbuf, размером CHANNELS*sizeof(float *) байта, что составляет CHANNELS*4. И ваш i варьируется от 1 до 480. Переменная CHANNELS должна быть достаточно высокой, иначе будет отображаться ошибка, поскольку вы пытаетесь получить доступ к памяти, не выделенной для этой переменной.

...