Initial Contribution
diff --git a/Embedded/common/src/b_APIEm/Functions.c b/Embedded/common/src/b_APIEm/Functions.c
new file mode 100644
index 0000000..fe8de17
--- /dev/null
+++ b/Embedded/common/src/b_APIEm/Functions.c
@@ -0,0 +1,316 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ---- includes ----------------------------------------------------------- */
+
+#include "b_APIEm/Functions.h"
+#include "b_BasicEm/Memory.h"
+
+
+/* ---- related objects --------------------------------------------------- */
+
+/* ---- typedefs ----------------------------------------------------------- */
+
+/* ---- constants ---------------------------------------------------------- */
+
+/* ------------------------------------------------------------------------- */
+
+/* ========================================================================= */
+/* */
+/* ---- \ghd{ external functions } ----------------------------------------- */
+/* */
+/* ========================================================================= */
+
+/* ------------------------------------------------------------------------- */
+
+void bpi_normalizeSimilarities( struct bbs_Context* cpA,
+ const int32* rawSimArrA,
+ const int32* rawIdArrA,
+ uint32 rawSizeA,
+ const int32* refSimArrA,
+ const int32* refIdArrA,
+ uint32 refSizeA,
+ enum bpi_SimType simTypeA,
+ int32* outSimArrA )
+{
+ /* 8.24 */
+ int32 refSimL = 0;
+ uint32 iL, jL, kL;
+ int32* outPtrL = outSimArrA;
+ const int32* rawPtrL = rawSimArrA;
+
+ switch( simTypeA )
+ {
+ case bpi_RAW_SIM:
+ {
+ /* nothing to do */
+ }
+ break;
+
+ case bpi_SUB_MEAN:
+ {
+ int32 shiftL = 0;
+ int32 roundL = 0;
+ refSimL = 0;
+ for( iL = 0; iL < refSizeA; iL++ )
+ {
+ refSimL += ( refSimArrA[ iL ] + roundL ) >> shiftL;
+ if( refSimL > 0x40000000 )
+ {
+ refSimL = ( refSimL + 1 ) >> 1;
+ shiftL++;
+ roundL = ( int32 )1 << ( shiftL - 1 );
+ }
+ }
+ refSimL = ( refSimL / refSizeA ) << shiftL;
+ }
+ break;
+
+ case bpi_SUB_MAX_2:
+ {
+ int32 maxL = 0;
+ uint32 maxIndexL = 0;
+ int32 idL = 0;
+
+ /* find raw maximum */
+ for( iL = 0; iL < rawSizeA; iL++ )
+ {
+ if( maxL < rawSimArrA[ iL ] )
+ {
+ maxL = refSimArrA[ iL ];
+ maxIndexL = iL;
+ }
+ }
+
+ /* consider id of maximum equal to probe id */
+ idL = rawIdArrA[ maxIndexL ];
+
+ /* find maximum similarity in ref array of different id */
+ for( iL = 0; iL < refSizeA; iL++ )
+ {
+ if( refIdArrA[ iL ] != idL )
+ {
+ refSimL = ( refSimL > refSimArrA[ iL ] ) ? refSimL : refSimArrA[ iL ];
+ }
+ }
+ }
+ break;
+
+ case bpi_SUB_16_MAX_2:
+ {
+ int32 maxL = 0;
+ uint32 maxIndexL = 0;
+ int32 idL = 0;
+
+ int32 maxSimArrL[ 16 ];
+ bbs_memset32( maxSimArrL, ( uint32 )-1, bbs_SIZEOF32( maxSimArrL ) );
+
+ /* find raw maximum */
+ for( iL = 0; iL < rawSizeA; iL++ )
+ {
+ if( maxL < rawSimArrA[ iL ] )
+ {
+ maxL = rawSimArrA[ iL ];
+ maxIndexL = iL;
+ }
+ }
+
+ /* consider id of maximum equal to probe id */
+ idL = rawIdArrA[ maxIndexL ];
+
+ /* find 16 maximum similarities of different id in ref array */
+ for( iL = 0; iL < refSizeA; iL++ )
+ {
+ if( refIdArrA[ iL ] != idL )
+ {
+ int32 simL = refSimArrA[ iL ];
+ for( jL = 0; jL < 16; jL++ )
+ {
+ if( simL > maxSimArrL[ jL ] ) break;
+ }
+ for( kL = 15; kL > jL; kL-- )
+ {
+ maxSimArrL[ kL ] = maxSimArrL[ kL - 1 ];
+ }
+ if( jL < 16 ) maxSimArrL[ jL ] = simL;
+ }
+ }
+
+ refSimL = 0;
+ for( jL = 0; jL < 16; jL++ )
+ {
+ if( maxSimArrL[ jL ] == -1 ) break;
+ refSimL += maxSimArrL[ jL ];
+ }
+
+ if( jL > 0 )
+ {
+ refSimL /= jL;
+ }
+ }
+ break;
+
+ default:
+ {
+ bbs_ERROR1( "void bpi_Identifier_normalizeSimilarities(): simTypeA '%i' is handled", simTypeA );
+ return;
+ }
+ }
+
+ /* refSimL -= 1.0 */
+ refSimL -= ( (uint32)1 << 24 );
+
+ for( iL = rawSizeA; iL > 0; iL-- )
+ {
+ *outPtrL++ = ( *rawPtrL++ - refSimL + 1 ) >> 1;
+ }
+
+}
+
+/* ------------------------------------------------------------------------- */
+
+int32 bpi_normalizedSimilarity( struct bbs_Context* cpA,
+ int32 rawSimA,
+ int32 rawIdA,
+ const int32* refSimArrA,
+ const int32* refIdArrA,
+ uint32 refSizeA,
+ enum bpi_SimType simTypeA )
+{
+ /* 8.24 */
+ int32 refSimL = 0;
+ uint32 iL, jL, kL;
+
+ switch( simTypeA )
+ {
+ case bpi_RAW_SIM:
+ {
+ /* nothing to do */
+ return rawSimA; /* return without adjustment of value range */
+ }
+
+ case bpi_SUB_MEAN:
+ {
+ int32 shiftL = 0;
+ int32 roundL = 0;
+ refSimL = 0;
+ for( iL = 0; iL < refSizeA; iL++ )
+ {
+ refSimL += ( refSimArrA[ iL ] + roundL ) >> shiftL;
+ if( refSimL > 0x40000000 )
+ {
+ refSimL = ( refSimL + 1 ) >> 1;
+ shiftL++;
+ roundL = ( int32 )1 << ( shiftL - 1 );
+ }
+ }
+ refSimL = ( refSimL / refSizeA ) << shiftL;
+ }
+ break;
+
+ case bpi_SUB_MAX_2:
+ {
+ /* find maximum similarity in ref array of different rawIdA */
+ for( iL = 0; iL < refSizeA; iL++ )
+ {
+ if( refIdArrA[ iL ] != rawIdA )
+ {
+ refSimL = ( refSimL > refSimArrA[ iL ] ) ? refSimL : refSimArrA[ iL ];
+ }
+ }
+ }
+ break;
+
+ case bpi_SUB_16_MAX_2:
+ {
+ int32 maxSimArrL[ 16 ];
+ int32 idL = rawIdA;
+ bbs_memset32( maxSimArrL, ( uint32 )-1, bbs_SIZEOF32( maxSimArrL ) );
+
+ /* find 16 maximum similarities of different id in ref array */
+ for( iL = 0; iL < refSizeA; iL++ )
+ {
+ if( refIdArrA[ iL ] != idL )
+ {
+ int32 simL = refSimArrA[ iL ];
+ for( jL = 0; jL < 16; jL++ )
+ {
+ if( simL > maxSimArrL[ jL ] ) break;
+ }
+ for( kL = 15; kL > jL; kL-- )
+ {
+ maxSimArrL[ kL ] = maxSimArrL[ kL - 1 ];
+ }
+ if( jL < 16 ) maxSimArrL[ jL ] = simL;
+ }
+ }
+
+ refSimL = 0;
+ for( jL = 0; jL < 16; jL++ )
+ {
+ if( maxSimArrL[ jL ] == -1 ) break;
+ refSimL += maxSimArrL[ jL ];
+ }
+
+ if( jL > 0 )
+ {
+ refSimL /= jL;
+ }
+ }
+ break;
+
+ default:
+ {
+ bbs_ERROR1( "void bpi_Identifier_normalizeSimilarities(): simTypeA '%i' is handled", simTypeA );
+ }
+ break;
+ }
+
+ /* refSimL -= 1.0 */
+ refSimL -= ( (uint32)1 << 24 );
+ return ( rawSimA - refSimL + 1 ) >> 1;
+}
+
+/* ------------------------------------------------------------------------- */
+
+uint32 bpi_memWriteCsa16( uint16* memPtrA, uint32 memSizeA, uint16 chkSumA )
+{
+ uint16* memPtrL = memPtrA - memSizeA + 1;
+ uint32 iL;
+ uint16 sumL = 0;
+ uint16 csaL = 0;
+
+ bbs_memWrite16( &csaL, memPtrA );
+ for( iL = 0; iL < memSizeA; iL++ )
+ {
+ uint16 valL = 0;
+ memPtrL += bbs_memRead16( &valL, memPtrL );
+ sumL += valL;
+ }
+ csaL = chkSumA - sumL;
+
+ return bbs_memWrite16( &csaL, memPtrA );
+}
+
+/* ------------------------------------------------------------------------- */
+
+uint32 bpi_memReadCsa16( const uint16* memPtrA )
+{
+ return bbs_SIZEOF16( uint16 );
+}
+
+/* ------------------------------------------------------------------------- */
+