龙空技术网

正弦函数计算时间

APPLE频道 214

前言:

目前同学们对“c语言时间运算”大致比较着重,小伙伴们都需要分析一些“c语言时间运算”的相关内容。那么小编同时在网络上搜集了一些关于“c语言时间运算””的相关内容,希望咱们能喜欢,兄弟们快快来学习一下吧!

视频加载中...

一、前言

  上午测试 STM32F401通过电阻DAC输出正弦波的时候,发现使用sine 函数计算输出的波形,在前四分之一π的期间,波形有明显的失真。后来,有人留言对此解释道,应该是 sine函数在计算不同角度的数值的时候,所消耗的时间不同。下面通过软件,测量一下不同角度的 sine 函数执行的时间。

二、测试结果

  在软件中,计算 1024个角度下的正弦数值。这里使用普通 math 库中的 sine 函数进行计算,前后读取 DWT 中的计数器,它们之间的差,对应着 sine 函数执行的系统时钟时间。将数值输出,然后进行统计。

  这是测量结果。青色曲线显示了计算所消耗的系统时钟。在前面 四分之π,计算时间 比起后面的时间少了一半。这也就使得前面的信号波形与后面不同,对照输出的结果,也能够看到这一点。

▲ 图1.2.1 不同角度的sine计算所消耗的时钟时间

  在角度大于四分之π之后,运行时间也不尽相同。但是这些差别,在后面函数波形上表现的并不太明显。

  重新运行一遍,对照前一次测量结果,可以看到它们基本上是重叠的。

  下面,再测量DSP 库中的 sine 函数。使用相同的方式,记录sine 函数执行的时间。测量结果显示,除了整体上 DSP函数库中的sine 函数 所消耗的系统时间比普通的math 库中的sine 小了很多。而且整体上时间都基本一致。只有在两个角度上,计算的时间稍微有不同。

▲ 图1.2.2 使用DSP库计算时间

三、怪异的情况

  在有的时候,软件输出sine函数所消耗的系统时间为 0,估计这是因为单片机 C语言编译器对软件的优化。因为前后都是读取的同一个 DWT->CYCCNT的值,所以,有可能后面再输出它们之间的差值的时候,直接就输出0. 后来在赋值语句前增加 volatile 声明,这个问题就解决了。

▲ 图1.3.1 首先统计为0 的情况e

※总  结 ※

  本文测试了F401单片机在sine 函数计算时,不同角度所消耗的时间。看到在0 到 四分之π之间的角度正弦计算,比其他角度的数值时间少了 将近一半。这也就验证了,为什么利用sine 函数输出的信号有了比较明显的失真的原因。但使用 DSP 库计算不同角度的sine 数值,所消耗的时间相对一致。

标签: #c语言时间运算