硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3896|回复: 8
收起左侧

[DSP] 关于浮点运算中除数为0或者NaN非数值的情况,大家有什么好的处理思路

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2020-3-29 10:23:51 | 显示全部楼层 |阅读模式

DSP库里面当前只有一个信噪比的函数做了简单处理,仅仅是简单处理,判断除数是否为NAN值0x7FC00000(NaN的一种情况)。

大家在使用有什么好的建议。

  1. float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize)
  2. {
  3.   float EnergySignal = 0.0, EnergyError = 0.0;
  4.   uint32_t i;
  5.   float SNR;
  6.   int temp;
  7.   int *test;

  8.   for (i = 0; i < buffSize; i++)
  9.     {
  10.            /* Checking for a NAN value in pRef array */
  11.           test =   (int *)(&pRef[i]);
  12.       temp =  *test;

  13.           if (temp == 0x7FC00000)
  14.           {
  15.                           return(0);
  16.           }

  17.           /* Checking for a NAN value in pTest array */
  18.           test =   (int *)(&pTest[i]);
  19.       temp =  *test;

  20.           if (temp == 0x7FC00000)
  21.           {
  22.                           return(0);
  23.           }
  24.       EnergySignal += pRef[i] * pRef[i];
  25.       EnergyError += (pRef[i] - pTest[i]) * (pRef[i] - pTest[i]);
  26.     }

  27.         /* Checking for a NAN value in EnergyError */
  28.         test =   (int *)(&EnergyError);
  29.     temp =  *test;

  30.     if (temp == 0x7FC00000)
  31.     {
  32.                   return(0);
  33.     }


  34.   SNR = 10 * log10 (EnergySignal / EnergyError);

  35.   return (SNR);

  36. }
复制代码




ps:IEEE 754-1985中,用指数部分全为1、小数部分非零表示NaN







回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-3-29 13:07:10 | 显示全部楼层
matlab的处理:
1.png


回复

使用道具 举报

2

主题

32

回帖

38

积分

新手上路

积分
38
发表于 2020-3-29 17:37:05 | 显示全部楼层
实际用MDK发现除数为0不用考虑这个问题,实测STM32F4/F3/F1没问题,F0不行
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-3-30 01:02:46 | 显示全部楼层
xiashuang 发表于 2020-3-29 17:37
实际用MDK发现除数为0不用考虑这个问题,实测STM32F4/F3/F1没问题,F0不行

谢谢帮忙测试。
回复

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

积分
204
发表于 2023-10-9 11:00:14 | 显示全部楼层
#define UTILS_IS_NAN(x)                ((x) != (x))
#define UTILS_NAN_ZERO(x)        (x = UTILS_IS_NAN(x) ? 0.0 : x)
可以用类似的宏定义实现,C语言里规定Nan!=Nan
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2023-10-10 09:09:17 | 显示全部楼层
WZH 发表于 2023-10-9 11:00
#define UTILS_IS_NAN(x)                ((x) != (x))
#define UTILS_NAN_ZERO(x)        (x = UTILS_IS_NAN(x) ? 0.0 : x)
可 ...

谢谢分享。
回复

使用道具 举报

210

主题

1042

回帖

1682

积分

至尊会员

More we do, more we can do.

积分
1682
发表于 2023-10-10 09:42:19 | 显示全部楼层
想复杂了,value != 0.0f 就可以了。
Floating Point to Hex Converter (gregstoll.com)
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2023-10-10 10:04:28 | 显示全部楼层
emwin 发表于 2023-10-10 09:42
想复杂了,value != 0.0f 就可以了。
Floating Point to Hex Converter (gregstoll.com)

0对应的是全0

12.png
回复

使用道具 举报

26

主题

23

回帖

101

积分

初级会员

积分
101
发表于 2023-10-14 19:53:37 | 显示全部楼层
不知道是不是类似的问题。 曾经 用   H7 做大量浮点运算,根据结果显示波形。极少情况下,会出现结果超级大,波形跑到显示区外,死机了。实在找不出原因,只能在显示波形之前,判断一下,是否超出范围,超出就强制赋个最大值再显示。    后来再没发现死机了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-28 20:04 , Processed in 0.213421 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表