我正在努力在DSP处理器上实现BFSK算法,并且需要使用预定义的DSP infra文件模拟LINUX上的实现。输入数据以float数组的形式出现。逐个从输入中提取各个比特。调制输出在typdef结构的fprm中生成,该结构由两个浮点变量组成(实数和虚数部分,因为调制数据是复数基带信号)。但DSP仿真需要将输出保存到void指针数组中。由于DSP API需要以void指针的形式进行更改,因此无法更改。结构的定义如下:
typedef struct {
float re;
float im;
}complex_float;
我可以使用memcpy:
将数据复制到void指针中sigbuf=(float *)malloc(bitsPerBlk*sigLen*sizeof(complex_float));
memcpy(sigbuf, comSig, (bitsPerBlk*sigLen*sizeof(complex_float)));
sigbuf是void指针数组,其中将保存输出,comSig是complex_float数组,其中保存调制输出。问题是我无法访问sigbuf数组的invidual值。我也试过这个
sigbuf=(complex_float *)malloc(bitsPerBlk*sigLen*sizeof(complex_float));
但它仍然不起作用。
如果有人可以帮助我,那对我来说会很有帮助。
谢谢, 安舒
答案 0 :(得分:2)
我打算在这里猜一猜。你为什么不把comSig的副本复制到sigBuf然后传递给你的API?
complex_float *sigBuf = malloc(TOTAL_SIZE_OF_COMSIG);
memcpy(sigBuf, comSig, TOTAL_SIZE_OF_COMSIG);
我不知道你的函数上的文档,但听起来你的API采用了一个指向某个数据缓冲区的void指针,可能还有它的长度或元素数。
dsp_api(sigBuf, sigBufSize);
我认为你误解了无效指针是什么以及你的功能想要什么。 void指针只是指向某些数据的通用指针。它是接收任何数据的函数方式,然后可能将其转换为complex_float结构以对数据进行操作。
作为将来无法取消引用void指针的原因的未来参考是因为它没有大小。你必须将它转换为一种类型,然后你就可以取消引用它。
答案 1 :(得分:0)
如果sigbuf是类型(void *),那么你的行
sigbuf=(complex_float *)malloc(bitsPerBlk*sigLen*sizeof(complex_float));
应该可以更改为
sigbuf=(void *)malloc(bitsPerBlk*sigLen*sizeof(complex_float));
因为malloc的左边只是演员!
答案 2 :(得分:0)
void *sigbuf;
complex_float *comSig;
complex_float
是一个由两个浮点元素组成的结构。
sigbuf
将存储调制数据,然后进一步传递给传输系统。
comSig
是一个complex_float数组(基本上是一个sin和余弦函数输出数组)。
DSP基础设施需要
中的调制输出sigbuf
已经计算并保存在
中comSig
。 somSig和sigbuf都是在DSP基础设施中预定义的。
我的问题是我能够将整个comSig aaray复制到sigbuf数组,但无法访问各个元素 sigbuf数组。
我能够通过全局指针变量传递comSig数组本身的地址来解决问题的任何方法.DSP基础设施 给予这样做的自由。所以,目前问题似乎已得到解决。 安舒再次感谢。
答案 3 :(得分:0)
确保目标地址sigbuf正确对齐。例如,DSP可能要求4字节浮点值必须在4字节边界上对齐。 memcpy()可能不会检查对齐,并会复制单个字节而不会抱怨。但是如果sigbuf没有正确的对齐,那么你将无法以浮点形式访问内容(即,当数据从内存读入寄存器时,数据将被破坏)。