在C中从double(GNU科学库)转换为SC16Q11
我正在使用GNU科学库来定义和使用复数。复数定义为在C中从double(GNU科学库)转换为SC16Q11,c,complex-numbers,gsl,floating-point-conversion,C,Complex Numbers,Gsl,Floating Point Conversion,我正在使用GNU科学库来定义和使用复数。复数定义为 typedef struct{ double dat[2]; } gsl_complex; 它只是将实部和虚部表示为双精度浮点(每个部分最多使用8个字节)。我需要将这些值的数组传递给D/a转换器,该转换器使用SC16Q11(有符号复数,16位Q11)格式 据我所知,使用Q11格式的16位处理器使用16-(11+1)=4位表示整数部分,留下一个符号位和11位表示小数部分。这正确吗?如何在这两种数据类型之间进行转换 文档中指出,每
typedef struct{
double dat[2];
} gsl_complex;
它只是将实部和虚部表示为双精度浮点(每个部分最多使用8个字节)。我需要将这些值的数组传递给D/a转换器,该转换器使用SC16Q11(有符号复数,16位Q11)格式
据我所知,使用Q11格式的16位处理器使用16-(11+1)=4位表示整数部分,留下一个符号位和11位表示小数部分。这正确吗?如何在这两种数据类型之间进行转换
文档中指出,每个IQ样本都是一个交错的IQ对,其中该对的每个值都是一个int16_t。是的,Q11格式是Q4.11(如果将符号位计算为int位,则为Q5.11) 更多信息请访问 您可以通过以下方式进行转换:
int16_t number[2];
number[0] = round(dat[0] * 2048);
number[1] = round(dat[1] * 2048);
2048来自2^11。它也写在链接中。
short real=dat[0]*2048代码>和短imag=dat[1]*2048
你能提供一个到文档的链接吗?@Degustaf:应该是圆形(dat[0]*2048)
?这会很好地将+和-四舍五入。@chux是的,但有时最低有效位的错误并不比转换速度重要,因为需要对精确的功能和速度进行良好的判断。示例:如果代码使用sqrt()
,则希望它在最后一位是正确的。如果代码需要更快的速度,那么我将创建sqrt\u fast()
,它可能只提供近似的答案。首先是功能优化,然后是性能优化。您好,谢谢您的回复。我以前在维基百科上也采用了这种方法,但没有得到正确的值,这导致我在这里发表文章。我打印两个值,real=round(2048*GSL\u real(x[I]))
和GSL\u real(x[I])
-x[I]是N位向量的一个元素,元素类型为GSL\u复数。转换前,printf显示-0.707110-j0.707104(仅对虚部重复上述操作),转换后显示-1448-j1448。有什么想法吗?这是Q11格式的正确值<代码>-1448
对应Q11格式的-070703125
。