2012-03-29 1 views
1

У меня возникли проблемы с воспроизведением аудиоданных после того, как они были обработаны. Единственный API, который я использую, это alsa lib API в Linux (Ubuntu) в C. Я получаю данные из 16-битного целочисленного волнового файла в массиве unsigned char (называемом buffer1), используя read(), и buffer1 можно воспроизводить правильно , Я хочу, чтобы данные передавались в другой массив без знака (так называемый buffer2) того же размера. Если я просто создаю цикл с buffer2 [i] = buffer1 [i], он работает: buffer2 можно воспроизводить правильно. Но для того, чтобы манипулировать данными, я конвертирую его в массив float, а затем обратно в unsigned char (до сих пор я не манипулирую аудиоданные, я просто конвертирую их в float, а затем обратно в unsigned char, чтобы проверить, как это работает). Но теперь buffer2 не создает звук, хотя все его значения строго идентичны значениям buffer1 (я сделал printf из многих значений buffer1 и buffer2, они все одинаковы) ... Все, что я сделал, это кастинг от unsigned to float и наоборот ...Звуковые данные (без знака), которые были обработаны, не могут быть воспроизведены

Подумайте, что случилось?

Виктор

ответ

0

Значение в buffer1 и Буфер2 не может быть одинаковым или она будет работать. Возможно, форматирование, которое вы используете в команде printf, маскирует различия (% i,% f и т. Д.). Вместо использования printf попробуйте установить точку останова и посмотреть значения, используя ваш отладчик. Это может помочь выявить, что на самом деле происходит не так.

EDIT:

Учитывая ваши комментарии о том, как вы выполняете бросок, я думаю, что теперь я могу помочь. Необработанные данные поступают из типа unsigned char. На большинстве платформ это будет целое значение от 0 до 255. Вы хотите преобразовать это значение в float, чтобы выполнить свои манипуляции. Чтобы сделать данные значимыми как типы с плавающей точкой для любых манипуляций, вы хотите масштабировать этот диапазон между +/- 1.0. Это то, что используется в переменной «scale» в следующем коде.

#include <iostream> 
#include <math.h> 

int main() 
{ 

    const int BUFFER_LEN = 6; 
    const unsigned char channelDataIN[] = {0,255, 1, 254, 2, 253}; 

    unsigned char channelDataOUT[BUFFER_LEN]; 
    float channelDataF[BUFFER_LEN]; 

    std::cout.precision(5); 

    float scale = powf(2.f, 8.f*sizeof(unsigned char)) - 1.f; 


    for (int mm = 0; mm < BUFFER_LEN; ++mm) 
    {   
     std::cout << "Original = " << (int)channelDataIN[mm] << std::endl; 

     channelDataF[mm] = (float)(channelDataIN[mm]) * 2.f/scale - 1.f; //Float cast 
     std::cout << "Float conversion = " << channelDataF[mm] << std::endl; 

     channelDataOUT[mm] = (unsigned char) ceil( (1.f+channelDataF[mm]) * scale/2.f ); 
     std::cout << "Recovered = " << (int)channelDataOUT[mm] << std::endl; 

     if (channelDataIN[mm] == channelDataOUT[mm]) 
      std::cout << "The output precisely equals the input" << std::endl << std::endl; 
     else 
      std::cout << "The output != input" << std::endl << std::endl; 
    } 

    return 0; 
} 

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

Original = 0 
Float conversion = -1 
Recovered = 0 
The output precisely equals the input 

Original = 255 
Float conversion = 1 
Recovered = 255 
The output precisely equals the input 

Original = 1 
Float conversion = -0.99216 
Recovered = 1 
The output precisely equals the input 

Original = 254 
Float conversion = 0.99216 
Recovered = 254 
The output precisely equals the input 

Original = 2 
Float conversion = -0.98431 
Recovered = 2 
The output precisely equals the input 

Original = 253 
Float conversion = 0.98431 
Recovered = 253 
The output precisely equals the input 
+0

Здравствуйте, спасибо вам за ответ. Я считаю, что в классическом я считаю: for (i = 0; i victor

+0

Когда я сравниваю значения buffer1 [i] и buffer [2], они не равны (buffer2 [i] больше, чем buffer2 [i]) – victor

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