0

我正在努力在 DSP 处理器上实现 BFSK 算法,并且需要使用预定义的 DSP 基础文件在 LINUX 上模拟实现。以浮点数组的形式传入的输入数据。从输入中逐一提取各个位。调制输出在 typdef 结构的 fprm 中生成,该结构由两个浮点变量组成(实部和虚部,因为调制数据是复数基带信号)。但是 DSP 模拟需要将输出保存到一个空指针数组中。这不能更改,因为 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 是保存输出的空指针数组,comSig 是保存调制输出的 complex_float 数组。问题是我无法访问 sigbuf 数组的各个值。我也试过这个

sigbuf=(complex_float *)malloc(bitsPerBlk*sigLen*sizeof(complex_float));

但它仍然不起作用。

如果有人可以帮助我,那将对我非常有帮助。

谢谢,安舒

4

4 回答 4

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 指针是什么以及您的函数想要什么。void 指针只是指向某些数据的通用指针。这是获取任何数据的函数方式,然后可能将其转换为您的 complex_float 结构以对数据进行操作。

作为未来的参考,为什么您无法取消引用 void 指针是因为它没有大小。您必须将其转换为类型,然后才能取消引用它。

于 2012-06-17T06:58:00.637 回答
0

如果 sigbuf 的类型是 (void *) 那么你的行

sigbuf=(complex_float *)malloc(bitsPerBlk*sigLen*sizeof(complex_float));

应该可以改成

sigbuf=(void *)malloc(bitsPerBlk*sigLen*sizeof(complex_float));

作为左边的 malloc 简直就是一个演员表!

于 2012-06-16T16:06:53.970 回答
0

对此感到抱歉,我无法清楚地解释我的观点,这很糟糕。声明如下

void *sigbuf;
complex_float *comSig;

complex_float

是一个由两个浮点元素组成的结构。

sigbuf

将存储调制后的数据,然后将其进一步传递给传输系统。

comSig

是一个 complex_float 数组(基本上是一个正弦和余弦函数输出的数组)。

DSP基础设施需要调制输出

sigbuf

已计算并保存在

comSig

. somSig 和 sigbuf 都是在 DSP 基础架构中预定义的。

我的问题是我能够将整个 comSig aaray 复制到 sigbuf 数组,但无法访问 sigbuf 数组的各个元素。

我能够通过全局指针变量传递 comSig 数组本身的地址来规避问题的任何方法。DSP 基础架构提供了这样做的自由。所以,现在这个问题似乎已经解决了。再次感谢安舒。

于 2012-06-16T17:52:45.227 回答
0

确保目标地址 sigbuf 正确对齐。例如,DSP 可能要求 4 字节浮点值必须在 4 字节边界上对齐。memcpy() 可能不会检查对齐情况,并且会毫无怨言地复制各个字节。但是如果 sigbuf 没有正确对齐,那么您将无法以浮点数的形式访问内容(即,当数据从内存读取到寄存器时,数据将被破坏)。

于 2012-06-17T00:53:35.647 回答