Subversion Repositories dashGPS

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved.
  3.  *
  4.  * SPDX-License-Identifier: Apache-2.0
  5.  *
  6.  * Licensed under the Apache License, Version 2.0 (the License); you may
  7.  * not use this file except in compliance with the License.
  8.  * You may obtain a copy of the License at
  9.  *
  10.  * www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an AS IS BASIS, WITHOUT
  14.  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18.  
  19. #include "ref_functions.h"
  20.  
  21. void arm_avepool_q7_HWC_ref(const q7_t * Im_in, // input image
  22.                             const uint16_t dim_im_in,   // input image dimension
  23.                             const uint16_t ch_im_in,    // number of input image channels
  24.                             const uint16_t dim_kernel,  // window kernel size
  25.                             const uint16_t padding, // padding sizes
  26.                             const uint16_t stride,  // stride
  27.                             const uint16_t dim_im_out,  // output image dimension
  28.                             q7_t * bufferA, // a buffer for local storage
  29.                             q7_t * Im_out)
  30. {
  31.     int16_t   i_ch_in, i_x, i_y;
  32.     int16_t   k_x, k_y;
  33.  
  34.     for (i_ch_in = 0; i_ch_in < ch_im_in; i_ch_in++)
  35.     {
  36.         for (i_y = 0; i_y < dim_im_out; i_y++)
  37.         {
  38.             for (i_x = 0; i_x < dim_im_out; i_x++)
  39.             {
  40.                 int       sum = 0;
  41.                 int       count = 0;
  42.                 for (k_y = i_y * stride - padding; k_y < i_y * stride - padding + dim_kernel; k_y++)
  43.                 {
  44.                     for (k_x = i_x * stride - padding; k_x < i_x * stride - padding + dim_kernel; k_x++)
  45.                     {
  46.                         if (k_y >= 0 && k_x >= 0 && k_y < dim_im_in && k_x < dim_im_in)
  47.                         {
  48.                             sum += Im_in[i_ch_in + ch_im_in * (k_x + k_y * dim_im_in)];
  49.                             count++;
  50.                         }
  51.                     }
  52.                 }
  53.                 Im_out[i_ch_in + ch_im_in * (i_x + i_y * dim_im_out)] = sum / count;
  54.             }
  55.         }
  56.     }
  57. }
  58.  
  59. void arm_maxpool_q7_HWC_ref(const q7_t * Im_in, // input image
  60.                             const uint16_t dim_im_in,   // input image dimension
  61.                             const uint16_t ch_im_in,    // number of input image channels
  62.                             const uint16_t dim_kernel,  // window kernel size
  63.                             const uint16_t padding, // padding sizes
  64.                             const uint16_t stride,  // stride
  65.                             const uint16_t dim_im_out,  // output image dimension
  66.                             q7_t * bufferA, // a buffer for local storage
  67.                             q7_t * Im_out)
  68. {
  69.     int16_t   i_ch_in, i_x, i_y;
  70.     int16_t   k_x, k_y;
  71.  
  72.     for (i_ch_in = 0; i_ch_in < ch_im_in; i_ch_in++)
  73.     {
  74.         for (i_y = 0; i_y < dim_im_out; i_y++)
  75.         {
  76.             for (i_x = 0; i_x < dim_im_out; i_x++)
  77.             {
  78.                 int       max = -129;
  79.                 for (k_y = i_y * stride - padding; k_y < i_y * stride - padding + dim_kernel; k_y++)
  80.                 {
  81.                     for (k_x = i_x * stride - padding; k_x < i_x * stride - padding + dim_kernel; k_x++)
  82.                     {
  83.                         if (k_y >= 0 && k_x >= 0 && k_y < dim_im_in && k_x < dim_im_in)
  84.                         {
  85.                             if (Im_in[i_ch_in + ch_im_in * (k_x + k_y * dim_im_in)] > max)
  86.                             {
  87.                                 max = Im_in[i_ch_in + ch_im_in * (k_x + k_y * dim_im_in)];
  88.                             }
  89.                         }
  90.                     }
  91.                 }
  92.                 Im_out[i_ch_in + ch_im_in * (i_x + i_y * dim_im_out)] = max;
  93.             }
  94.         }
  95.     }
  96. }
  97.