Чтение аудио RLP - PullRequest
       6

Чтение аудио RLP

0 голосов
/ 22 февраля 2012

Я пытаюсь получить образцы звука с микрофона через Fez Panda 2. Для этого я использую rlp. Вот мой код:

int GHAL_AnalogIn_Read(unsigned char channel)
{
        return ((*((int*)(ADC_DATA_BASE_ADDRESS) + channel)) >>8) & 0x3FF;
}
int ReadAudio(unsigned int *generalArray, void **args, unsigned int argsCount ,unsigned int *argSize)
{
        unsigned char *buffer = (unsigned char*)args[0];
        int buffer_lengh = argSize[0];
        unsigned char channel = *(unsigned char*)args[1];
        int i=0;
        while(i<buffer_lengh)
        {
           buffer[i] = GHAL_AnalogIn_Read(channel);
           i++;
           RLPext->Delay(100);
        }
        return 0;
}

Проблема в том, что мне нужны значения с плавающей точкой, а не unsigned char, потому что я выполняю fft для этих звуковых сэмплов. Поэтому мне нужна модификация, которая предоставит мне значения с плавающей точкой. Есть идеи?

1 Ответ

0 голосов
/ 21 февраля 2013

У вас есть опыт работы с C?Особенно в значении * и &?* означает: получить значение, указанное по адресу.Поэтому void ** args говорит что-то вроде «получить значение, указанное значением, полученным из адреса».void используется для свободного ввода всего, что вам нравится.Поскольку вы не можете поместить целые структуры или объекты в аргумент, вы предоставляете указатель (адрес) на структуру или объект.Используя *, вы получаете значение по адресу аргумента.

В C вы не передаете целые массивы в аргументе, вы передаете адрес первого индекса.

Теперь вы можете просто переформулировать свою функцию, чтобы она выглядела примерно так:

int ReadAudio(unsigned int *generalArray, float arg, unsigned int argsCount ,unsigned int *argSize)

Но так как void **args указывает на буфер, я думаю, вы должны знать, какую операцию вы хотите выполнить с даннымисобраны.Аналоговое чтение всегда дает вам целое число, большинство АЦП (аналоговый - цифровой - преобразователь) являются 10-битными или около того.

Если в 32-битной системе число с плавающей запятой составляет 4 байта, вы хотите искажатьваши данные (unsigned char *buffer) в 4-байтовой границе.

РЕДАКТИРОВАТЬ: я упустил это из виду в документации: Note: Parameter of all function in RLP code file must have format follow this:Note: Parameter of all function in RLP code file must have format follow this:.Просто приведите байты буфера к числу с плавающей точкой на границе 4 байта, и я думаю, что у вас все будет хорошо.

...