Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中从double(GNU科学库)转换为SC16Q11_C_Complex Numbers_Gsl_Floating Point Conversion - Fatal编程技术网

在C中从double(GNU科学库)转换为SC16Q11

在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位表示小数部分。这正确吗?如何在这两种数据类型之间进行转换 文档中指出,每

我正在使用GNU科学库来定义和使用复数。复数定义为

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