STM32 DSP庫函式詳解
對於每個函式,都存在浮點數和定點數的型別,由於使用方法是一致的,這裡我們僅以32為浮點數為例來說明。
一.BasicMathFunctions
1.絕對值
pDst[n] = abs(pSrc[n]), 0 <= n < blockSize
示例
float32_t *pSrc;
float32_t *pDst;
uint32_t blocksize;
arm_add_f32(pSrc,pDst,blocksize);
2.求和
pDst[n] = pSrcA[n] + pSrcB[n], 0 <= n < blockSize.
示例
3.點乘float32_t *pSrcA; float32_t *pSrcB; float32_t *pDst; uint32_t blocksize; arm_add_f32(pSrcA,pSrcB,pDst,blocksize);
sum = pSrcA[0]*pSrcB[0] + pSrcA[1]*pSrcB[1] + ... + pSrcA[blockSize-1]*pSrcB[blockSize-1]
示例
float32_t *pSrcA;
float32_t *pSrcB;
float32_t *result;
uint32_t blocksize;
arm_dot_prod_f32(pSrcA,pSrcB,blocksize,result);
4.乘法
sum = pSrcA[0]*pSrcB[0] + pSrcA[1]*pSrcB[1] + ... + pSrcA[blockSize-1]*pSrcB[blockSize-1]
示例
float32_t *pSrcA;
float32_t *pSrcB;
float32_t *pDst;
uint32_t blocksize;
arm_mult_f32(pSrcA,pSrcB,blocksize,pDst);
5.相反數
pDst[n] = -pSrc[n], 0 <= n < blockSize.
示例
float32_t *pSrc;
float32_t *pDst;
uint32_t blocksize;
arm_mult_f32(pSrcA,pDst,blocksize);
6.偏移
pDst[n] = pSrc[n] + offset, 0 <= n < blockSize.
示例
float32_t *pSrc;
float32_t offset;
float32_t *pDst;
uint32_t blocksize;
arm_offset_f32(pSrc,offset,pDst,blocksize);
7.減法
pDst[n] = pSrcA[n] - pSrcB[n], 0 <= n < blockSize.
示例
float32_t *pSrcA;
float32_t *pSrcB;
float32_t *pDst;
uint32_t blocksize;
arm_sub_f32(pSrcA,pSrcB,pDst,blocksize);
8.比例因子
pDst[n] = pSrc[n] * scale, 0 <= n < blockSize.
示例
float32_t *pSrc;
float32_t scale;
float32_t *pDst;
uint32_t blocksize;
arm_scale_f32(pSrc,scale,pDst,blocksize);
二.FastMathFunctions
這一塊的函式就是日常使用的一些math.h的函式,不多加贅述
float32_t arm_cos_f32(float32_t x) ;
float32_t arm_sin_f32(float32_t x) ;
arm_status arm_sqrt_q31(q31_t in, q31_t * pOut);
三.StatisticsMathFunctions
這一塊主要是一些在統計資料分析處理過程中經常會使用到的函式。
1.最大值
計算陣列中的最大值,並返回陣列中最大值和最大值在陣列中的位置。
float32_t *pSrc;
float32_t pResult;
uint32_t blocksize;
uint32_t pIndex;
arm_max_f32(pSrc,blocksize,&pResult,&pIndex);
2.最小值
計算陣列中的最小值,並返回陣列中最大值和最大值在陣列中的位置。與上述用法類似,不加贅述。
arm_min_f32(pSrc,blocksize,&pResult,&pIndex);
3.平均值
Result = (pSrc[0] + pSrc[1] + pSrc[2] + ... + pSrc[blockSize-1]) / blockSize;
float32_t *pSrc;
float32_t pResult;
uint32_t blocksize;
arm_mean_f32(pSrc,blocksize,&pResult);
4.功率
Result = pSrc[0] * pSrc[0] + pSrc[1] * pSrc[1] + pSrc[2] * pSrc[2] + ... + pSrc[blockSize-1] * pSrc[blockSize-1];
float32_t *pSrc;
float32_t pResult;
uint32_t blocksize;
arm_power_f32(pSrc,blocksize,&pResult);
5.標準差
Result = sqrt((sumOfSquares - sum2 / blockSize) / (blockSize - 1))
其中:
sumOfSquares = pSrc[0] * pSrc[0] + pSrc[1] * pSrc[1] + ... + pSrc[blockSize-1] * pSrc[blockSize-1]
sum = pSrc[0] + pSrc[1] + pSrc[2] + ... + pSrc[blockSize-1]
float32_t *pSrc;
float32_t pResult;
uint32_t blocksize;
arm_std_f32(pSrc,blocksize,&pResult);
6.均方根
Result = sqrt(((pSrc[0] * pSrc[0] + pSrc[1] * pSrc[1] + ... + pSrc[blockSize-1] * pSrc[blockSize-1]) / blockSize));
float32_t *pSrc;
float32_t pResult;
uint32_t blocksize;
arm_rms_f32(pSrc,blocksize,&pResult);
7.方差
同上類似
arm_var_f32(pSrc,blocksize,&pResult);
四.SupportFunctions
支援函式主要包括資料拷貝,賦值和型別轉化。型別轉化一般不需要在DSP中進行,故此處略去。
1.資料拷貝
pDst[n] = pSrc[n]; 0 <= n < blockSize.
void arm_copy_f32(float32_t * pSrc, float32_t * pDst, uint32_t blockSize)
2.資料填充
pDst[n] = value; 0 <= n < blockSize.
void arm_fill_f32(float32_t value, float32_t * pDst, uint32_t blockSize)
五.ContrillerFunctions
這裡主要介紹的是PID控制的函式部分。
PID控制器又叫比例積分微分控制器,是目前應用最廣泛的控制器。對PID的引數整定方法網上有很多,我認為首先理解PID引數的意義更為重要,這裡貼一個連結,https://www.zhihu.com/question/23088613/answer/81176620。
y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2]
A0 = Kp + Ki + Kd
A1 = (-Kp ) - (2 * Kd )
A2 = Kd
函式定義如下
static __INLINE float32_t arm_pid_f32(arm_pid_instance_f32 * S, float32_t in)
第一個引數為PID 結構體,第二個引數為取樣時間,單位為ms。typedef struct
{
float32_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */
float32_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */
float32_t A2; /**< The derived gain, A2 = Kd . */
float32_t state[3]; /**< The state array of length 3. */
float32_t Kp; /**< The proportional gain. */
float32_t Ki; /**< The integral gain. */
float32_t Kd; /**< The derivative gain. */
} arm_pid_instance_f32;
初始化函式
void arm_pid_init_f32(arm_pid_instance_f32 * S, int32_t resetStateFlag)
該函式是通過使用者配置了Kp,Ki,Kd後,通過該函式獲得A0,A1,A2。第二個引數是初始化標誌位,設1即為初始化。
復位函式
void arm_pid_reset_f32(arm_pid_instance_f32 * S)
復位所有變數為0