我正在尝试通过 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;
}
问题是我需要浮点值而不是无符号字符,因为我正在对这些声音样本执行 fft。所以我需要修改来为我提供浮点值。有什么想法吗?
最佳答案
你有使用C语言的经验吗?尤其是*
和&
的含义? *
表示:获取地址指向的值。所以 void ** args 表示类似“获取从地址获得的值所指向的值”之类的内容。 void 用于自由输入任何你喜欢的内容。由于您无法将整个结构或对象放入参数中,因此您需要提供指向结构或对象的指针(地址)。通过使用*
,您可以获取参数地址上的值。
在 C 中,您不会在参数中传递整个数组,而是传递第一个索引的地址。
现在您可以简单地将函数重构为:
int ReadAudio(unsigned int *generalArray, float arg, unsigned int argsCount ,unsigned int *argSize)
但是由于 void **args
现在指向一个缓冲区,我认为您应该知道要对收集的数据执行什么操作。模拟读取始终会为您提供一个整数,大多数 ADC(模拟 - 数字 - 转换器)都是 10 位左右。
如果 float 在 32 位系统上为 4 字节,您希望在 4 字节边界内破坏数据 (unsigned char *buffer
)。
编辑:我在文档中忽略了这一点:注意:RLP 代码文件中所有函数的参数必须具有以下格式:注意:RLP 代码文件中所有函数的参数必须具有以下格式:
.只需将缓冲区字节转换为 4 字节边界的 float ,我想你会做得很好。
关于c - 读取音频rlp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9400250/