0

我正在尝试通过 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。所以我需要修改来为我提供浮点值。有任何想法吗?

4

1 回答 1

0

你有C的经验吗?尤其是和的*意思&*意思是:获取地址指向的值。所以 void ** args 表示“获取从地址获得的值所指向的值”。void 用于自由输入您喜欢的任何内容。由于您不能将整个结构或对象放在参数中,因此您需要提供指向结构或对象的指针(地址)。通过使用,*您可以获得参数地址上的值。

在 C 中,您不会在参数中传递整个数组,而是传递第一个索引的地址。

现在您可以简单地将您的函数重构为:

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

但是正如void **args现在指向缓冲区一样,我认为您应该知道要对收集的数据执行什么操作。模拟读取将始终为您提供整数,大多数 ADC(模拟 - 数字 - 转换器)都是 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 字节边界的浮点数,我认为你会做得很好。

于 2013-02-21T19:48:44.663 回答