Home | History | Annotate | Download | only in AKFS_APIs_8975
      1 /******************************************************************************
      2  * $Id: AKFS_VNorm.c 580 2012-03-29 09:56:21Z yamada.rj $
      3  ******************************************************************************
      4  *
      5  * Copyright (C) 2012 Asahi Kasei Microdevices Corporation, Japan
      6  *
      7  * Licensed under the Apache License, Version 2.0 (the "License");
      8  * you may not use this file except in compliance with the License.
      9  * You may obtain a copy of the License at
     10  *
     11  *      http://www.apache.org/licenses/LICENSE-2.0
     12  *
     13  * Unless required by applicable law or agreed to in writing, software
     14  * distributed under the License is distributed on an "AS IS" BASIS,
     15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     16  * See the License for the specific language governing permissions and
     17  * limitations under the License.
     18  */
     19 #include "AKFS_VNorm.h"
     20 #include "AKFS_Device.h"
     21 
     22 /*!
     23  */
     24 int16 AKFS_VbNorm(
     25 	const	int16	ndata,		/*!< Size of raw vector buffer */
     26 	const	AKFVEC	vdata[],	/*!< Raw vector buffer */
     27 	const	int16	nbuf,		/*!< Size of data to be buffered */
     28 	const	AKFVEC*	o,			/*!< Offset */
     29 	const	AKFVEC*	s,			/*!< Sensitivity */
     30 	const	AKFLOAT	tgt,		/*!< Target sensitivity */
     31 	const	int16	nvec,		/*!< Size of normalized vector buffer */
     32 			AKFVEC	vvec[]		/*!< Normalized vector buffer */
     33 )
     34 {
     35 	int i;
     36 
     37 	/* size check */
     38 	if ((ndata <= 0) || (nvec <= 0) || (nbuf <= 0)) {
     39 		return AKFS_ERROR;
     40 	}
     41 	/* dependency check */
     42 	if ((nbuf < 1) || (ndata < nbuf) || (nvec < nbuf)) {
     43 		return AKFS_ERROR;
     44 	}
     45 	/* sensitivity check */
     46 	if ((s->u.x <= AKFS_EPSILON) ||
     47 		(s->u.y <= AKFS_EPSILON) ||
     48 		(s->u.z <= AKFS_EPSILON) ||
     49 		(tgt <= 0)) {
     50 		return AKFS_ERROR;
     51 	}
     52 
     53 	/* calculate and store data to buffer */
     54 	if (AKFS_BufShift(nvec, nbuf, vvec) != AKFS_SUCCESS) {
     55 		return AKFS_ERROR;
     56 	}
     57 	for (i=0; i<nbuf; i++) {
     58 		vvec[i].u.x = ((vdata[i].u.x - o->u.x) / (s->u.x) * (AKFLOAT)tgt);
     59 		vvec[i].u.y = ((vdata[i].u.y - o->u.y) / (s->u.y) * (AKFLOAT)tgt);
     60 		vvec[i].u.z = ((vdata[i].u.z - o->u.z) / (s->u.z) * (AKFLOAT)tgt);
     61 	}
     62 
     63 	return AKFS_SUCCESS;
     64 }
     65 
     66 /*!
     67  */
     68 int16 AKFS_VbAve(
     69 	const	int16	nvec,		/*!< Size of normalized vector buffer */
     70 	const	AKFVEC	vvec[],		/*!< Normalized vector buffer */
     71 	const	int16	nave,		/*!< Number of averaeg */
     72 			AKFVEC*	vave		/*!< Averaged vector */
     73 )
     74 {
     75 	int i;
     76 
     77 	/* arguments check */
     78 	if ((nave <= 0) || (nvec <= 0) || (nvec < nave)) {
     79 		return AKFS_ERROR;
     80 	}
     81 
     82 	/* calculate average */
     83 	vave->u.x = 0;
     84 	vave->u.y = 0;
     85 	vave->u.z = 0;
     86 	for (i=0; i<nave; i++) {
     87 		if ((vvec[i].u.x == AKFS_INIT_VALUE_F) ||
     88 			(vvec[i].u.y == AKFS_INIT_VALUE_F) ||
     89 			(vvec[i].u.z == AKFS_INIT_VALUE_F)) {
     90 				break;
     91 		}
     92 		vave->u.x += vvec[i].u.x;
     93 		vave->u.y += vvec[i].u.y;
     94 		vave->u.z += vvec[i].u.z;
     95 	}
     96 	if (i == 0) {
     97 		vave->u.x = 0;
     98 		vave->u.y = 0;
     99 		vave->u.z = 0;
    100 	} else {
    101 		vave->u.x /= i;
    102 		vave->u.y /= i;
    103 		vave->u.z /= i;
    104 	}
    105 	return AKFS_SUCCESS;
    106 }
    107 
    108 
    109