2012-06-16 18 views
0

我正在使用DSP处理器实现BFSK算法,并需要使用预定义的DSP Infra文件模拟LINUX上的实现。输入数据以浮点数组的形式出现。各个位是从输入中逐一提取的。经调制的输出在typdef结构的fprm中生成,该结构由两个浮点变量(实数部分和虚数部分组成,因为调制数据是复数基带信号)组成。但是DSP仿真需要将输出保存到一个void指针数组中。这个不能被改变,因为DSP API需要它以void指针的形式。该结构的定义如下:将结构数据保存为void *变量

typedef struct { 
float re; 
float im; 
}complex_float; 

我能够使用的memcpy将数据复制到空指针:

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

memcpy(sigbuf, comSig, (bitsPerBlk*sigLen*sizeof(complex_float))); 

sigbuf是void指针数组,其中输出中会被保存, comSig是保存调制输出的complex_float数组。事情是我无法访问sigbuf数组的各个值。我也试过这个

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

但它仍然没有工作。

如果有人能帮助我,那对我来说会很有帮助。

感谢, 安舒

+1

目前还不清楚你的意思是“不起作用”。什么,具体而言,不起作用? –

+1

'sigbuf是void指针数组,其中输出将被保存,comSig是complex_float数组'请将您的声明和定义放在源代码中,而不是文本中。文本用于评论和解释。 – wildplasser

+0

向我们展示如何访问sigbuf数组的各个值的代码 – MYMNeo

回答

2

我要在这里猜测。你为什么不直接制作一个comSig到sigBuf的副本,然后将它传递给你的API?

complex_float *sigBuf = malloc(TOTAL_SIZE_OF_COMSIG); 
memcpy(sigBuf, comSig, TOTAL_SIZE_OF_COMSIG); 

我不知道你的函数的文档,但它听起来像你的API需要一个空指针数据,也许它的长度或元素数量的一定的缓冲。

dsp_api(sigBuf, sigBufSize); 

我认为你误解了一个void指针是什么以及你的函数需要什么。 void指针只是一些指向某些数据的通用指针。这是接收任何数据的函数方式,然后可能将其转换为complex_float结构以对数据进行操作。

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

0

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

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

应该能够改变为

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

为离开的malloc只是一个演员!

+1

这在C中没有什么区别。 –

+0

@Oli Charlesworth - 如果它是一个编译错误,那么它可能依赖于编译器)。他没有真正定义他的错误(或者什么不工作)。 – trumpetlicks

0

对不起,我不好意思,我无法清楚地解释我的观点。的声明如下

void *sigbuf; 
complex_float *comSig; 

complex_float

是由两个浮动元件的一个结构。

sigbuf

将存储调制数据,然后将其进一步通过用于传输系统。

comSig

是complex_float阵列(基本上正弦和余弦函数的OUPUTS数组)。

的DSP基础设施需要在

调制输出sigbuf

已经计算并保存在

comSig

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

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

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

+2

你应该*编辑*你的问题,而不是写在答案的细节... – eepp

0

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