Fork of mbed-dsp. CMSIS-DSP library of supporting NEON

Dependents:   mbed-os-example-cmsis_dsp_neon

Fork of mbed-dsp by mbed official

Information

Japanese version is available in lower part of this page.
このページの後半に日本語版が用意されています.

CMSIS-DSP of supporting NEON

What is this ?

A library for CMSIS-DSP of supporting NEON.
We supported the NEON to CMSIS-DSP Ver1.4.3(CMSIS V4.1) that ARM supplied, has achieved the processing speed improvement.
If you use the mbed-dsp library, you can use to replace this library.
CMSIS-DSP of supporting NEON is provied as a library.

Library Creation environment

CMSIS-DSP library of supporting NEON was created by the following environment.

  • Compiler
    ARMCC Version 5.03
  • Compile option switch[C Compiler]
   -DARM_MATH_MATRIX_CHECK -DARM_MATH_ROUNDING -O3 -Otime --cpu=Cortex-A9 --littleend --arm 
   --apcs=/interwork --no_unaligned_access --fpu=vfpv3_fp16 --fpmode=fast --apcs=/hardfp 
   --vectorize --asm
  • Compile option switch[Assembler]
   --cpreproc --cpu=Cortex-A9 --littleend --arm --apcs=/interwork --no_unaligned_access 
   --fpu=vfpv3_fp16 --fpmode=fast --apcs=/hardfp


Effects of NEON support

In the data which passes to each function, large size will be expected more effective than small size.
Also if the data is a multiple of 16, effect will be expected in every function in the CMSIS-DSP.


NEON対応CMSIS-DSP

概要

NEON対応したCMSIS-DSPのライブラリです。
ARM社提供のCMSIS-DSP Ver1.4.3(CMSIS V4.1)をターゲットにNEON対応を行ない、処理速度向上を実現しております。
mbed-dspライブラリを使用している場合は、本ライブラリに置き換えて使用することができます。
NEON対応したCMSIS-DSPはライブラリで提供します。

ライブラリ作成環境

NEON対応CMSIS-DSPライブラリは、以下の環境で作成しています。

  • コンパイラ
    ARMCC Version 5.03
  • コンパイルオプションスイッチ[C Compiler]
   -DARM_MATH_MATRIX_CHECK -DARM_MATH_ROUNDING -O3 -Otime --cpu=Cortex-A9 --littleend --arm 
   --apcs=/interwork --no_unaligned_access --fpu=vfpv3_fp16 --fpmode=fast --apcs=/hardfp 
   --vectorize --asm
  • コンパイルオプションスイッチ[Assembler]
   --cpreproc --cpu=Cortex-A9 --littleend --arm --apcs=/interwork --no_unaligned_access 
   --fpu=vfpv3_fp16 --fpmode=fast --apcs=/hardfp


NEON対応による効果について

CMSIS-DSP内の各関数へ渡すデータは、小さいサイズよりも大きいサイズの方が効果が見込めます。
また、16の倍数のデータであれば、CMSIS-DSP内のどの関数でも効果が見込めます。


Committer:
1050186
Date:
Tue Jun 23 06:23:42 2015 +0000
Revision:
5:a912b042151f
Parent:
3:7a284390b0ce
first commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 3:7a284390b0ce 1 /* ----------------------------------------------------------------------
1050186 5:a912b042151f 2 * Copyright (C) 2010-2014 ARM Limited. All rights reserved.
mbed_official 3:7a284390b0ce 3 *
1050186 5:a912b042151f 4 * $Date: 12. March 2014
1050186 5:a912b042151f 5 * $Revision: V1.4.3
mbed_official 3:7a284390b0ce 6 *
1050186 5:a912b042151f 7 * Project: CMSIS DSP Library
1050186 5:a912b042151f 8 * Title: arm_math.h
mbed_official 3:7a284390b0ce 9 *
1050186 5:a912b042151f 10 * Description: Public header file for CMSIS DSP Library
mbed_official 3:7a284390b0ce 11 *
mbed_official 3:7a284390b0ce 12 * Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
mbed_official 3:7a284390b0ce 13 *
mbed_official 3:7a284390b0ce 14 * Redistribution and use in source and binary forms, with or without
mbed_official 3:7a284390b0ce 15 * modification, are permitted provided that the following conditions
mbed_official 3:7a284390b0ce 16 * are met:
mbed_official 3:7a284390b0ce 17 * - Redistributions of source code must retain the above copyright
mbed_official 3:7a284390b0ce 18 * notice, this list of conditions and the following disclaimer.
mbed_official 3:7a284390b0ce 19 * - Redistributions in binary form must reproduce the above copyright
mbed_official 3:7a284390b0ce 20 * notice, this list of conditions and the following disclaimer in
mbed_official 3:7a284390b0ce 21 * the documentation and/or other materials provided with the
mbed_official 3:7a284390b0ce 22 * distribution.
mbed_official 3:7a284390b0ce 23 * - Neither the name of ARM LIMITED nor the names of its contributors
mbed_official 3:7a284390b0ce 24 * may be used to endorse or promote products derived from this
mbed_official 3:7a284390b0ce 25 * software without specific prior written permission.
mbed_official 3:7a284390b0ce 26 *
mbed_official 3:7a284390b0ce 27 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
mbed_official 3:7a284390b0ce 28 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
mbed_official 3:7a284390b0ce 29 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
mbed_official 3:7a284390b0ce 30 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
mbed_official 3:7a284390b0ce 31 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
mbed_official 3:7a284390b0ce 32 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
mbed_official 3:7a284390b0ce 33 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
mbed_official 3:7a284390b0ce 34 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 3:7a284390b0ce 35 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
mbed_official 3:7a284390b0ce 36 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
mbed_official 3:7a284390b0ce 37 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
mbed_official 3:7a284390b0ce 38 * POSSIBILITY OF SUCH DAMAGE.
emilmont 1:fdd22bb7aa52 39 * -------------------------------------------------------------------- */
emilmont 1:fdd22bb7aa52 40
emilmont 1:fdd22bb7aa52 41 /**
emilmont 1:fdd22bb7aa52 42 \mainpage CMSIS DSP Software Library
emilmont 1:fdd22bb7aa52 43 *
1050186 5:a912b042151f 44 * Introduction
1050186 5:a912b042151f 45 * ------------
emilmont 1:fdd22bb7aa52 46 *
mbed_official 3:7a284390b0ce 47 * This user manual describes the CMSIS DSP software library,
emilmont 1:fdd22bb7aa52 48 * a suite of common signal processing functions for use on Cortex-M processor based devices.
emilmont 1:fdd22bb7aa52 49 *
mbed_official 3:7a284390b0ce 50 * The library is divided into a number of functions each covering a specific category:
emilmont 1:fdd22bb7aa52 51 * - Basic math functions
emilmont 1:fdd22bb7aa52 52 * - Fast math functions
emilmont 1:fdd22bb7aa52 53 * - Complex math functions
emilmont 1:fdd22bb7aa52 54 * - Filters
emilmont 1:fdd22bb7aa52 55 * - Matrix functions
emilmont 1:fdd22bb7aa52 56 * - Transforms
emilmont 1:fdd22bb7aa52 57 * - Motor control functions
emilmont 1:fdd22bb7aa52 58 * - Statistical functions
emilmont 1:fdd22bb7aa52 59 * - Support functions
emilmont 1:fdd22bb7aa52 60 * - Interpolation functions
emilmont 1:fdd22bb7aa52 61 *
emilmont 1:fdd22bb7aa52 62 * The library has separate functions for operating on 8-bit integers, 16-bit integers,
mbed_official 3:7a284390b0ce 63 * 32-bit integer and 32-bit floating-point values.
emilmont 1:fdd22bb7aa52 64 *
1050186 5:a912b042151f 65 * Using the Library
1050186 5:a912b042151f 66 * ------------
emilmont 1:fdd22bb7aa52 67 *
emilmont 1:fdd22bb7aa52 68 * The library installer contains prebuilt versions of the libraries in the <code>Lib</code> folder.
emilmont 1:fdd22bb7aa52 69 * - arm_cortexM4lf_math.lib (Little endian and Floating Point Unit on Cortex-M4)
emilmont 1:fdd22bb7aa52 70 * - arm_cortexM4bf_math.lib (Big endian and Floating Point Unit on Cortex-M4)
emilmont 1:fdd22bb7aa52 71 * - arm_cortexM4l_math.lib (Little endian on Cortex-M4)
emilmont 1:fdd22bb7aa52 72 * - arm_cortexM4b_math.lib (Big endian on Cortex-M4)
emilmont 1:fdd22bb7aa52 73 * - arm_cortexM3l_math.lib (Little endian on Cortex-M3)
emilmont 1:fdd22bb7aa52 74 * - arm_cortexM3b_math.lib (Big endian on Cortex-M3)
emilmont 1:fdd22bb7aa52 75 * - arm_cortexM0l_math.lib (Little endian on Cortex-M0)
emilmont 1:fdd22bb7aa52 76 * - arm_cortexM0b_math.lib (Big endian on Cortex-M3)
emilmont 1:fdd22bb7aa52 77 *
emilmont 1:fdd22bb7aa52 78 * The library functions are declared in the public file <code>arm_math.h</code> which is placed in the <code>Include</code> folder.
mbed_official 3:7a284390b0ce 79 * Simply include this file and link the appropriate library in the application and begin calling the library functions. The Library supports single
mbed_official 3:7a284390b0ce 80 * public header file <code> arm_math.h</code> for Cortex-M4/M3/M0 with little endian and big endian. Same header file will be used for floating point unit(FPU) variants.
mbed_official 3:7a284390b0ce 81 * Define the appropriate pre processor MACRO ARM_MATH_CM4 or ARM_MATH_CM3 or
mbed_official 3:7a284390b0ce 82 * ARM_MATH_CM0 or ARM_MATH_CM0PLUS depending on the target processor in the application.
emilmont 1:fdd22bb7aa52 83 *
1050186 5:a912b042151f 84 * Examples
1050186 5:a912b042151f 85 * --------
emilmont 1:fdd22bb7aa52 86 *
emilmont 1:fdd22bb7aa52 87 * The library ships with a number of examples which demonstrate how to use the library functions.
emilmont 1:fdd22bb7aa52 88 *
1050186 5:a912b042151f 89 * Toolchain Support
1050186 5:a912b042151f 90 * ------------
mbed_official 3:7a284390b0ce 91 *
mbed_official 3:7a284390b0ce 92 * The library has been developed and tested with MDK-ARM version 4.60.
mbed_official 3:7a284390b0ce 93 * The library is being tested in GCC and IAR toolchains and updates on this activity will be made available shortly.
mbed_official 3:7a284390b0ce 94 *
1050186 5:a912b042151f 95 * Building the Library
1050186 5:a912b042151f 96 * ------------
emilmont 1:fdd22bb7aa52 97 *
1050186 5:a912b042151f 98 * The library installer contains a project file to re build libraries on MDK-ARM Tool chain in the <code>CMSIS\\DSP_Lib\\Source\\ARM</code> folder.
1050186 5:a912b042151f 99 * - arm_cortexM_math.uvproj
emilmont 1:fdd22bb7aa52 100 *
emilmont 1:fdd22bb7aa52 101 *
1050186 5:a912b042151f 102 * The libraries can be built by opening the arm_cortexM_math.uvproj project in MDK-ARM, selecting a specific target, and defining the optional pre processor MACROs detailed above.
mbed_official 3:7a284390b0ce 103 *
1050186 5:a912b042151f 104 * Pre-processor Macros
1050186 5:a912b042151f 105 * ------------
mbed_official 3:7a284390b0ce 106 *
mbed_official 3:7a284390b0ce 107 * Each library project have differant pre-processor macros.
mbed_official 3:7a284390b0ce 108 *
mbed_official 3:7a284390b0ce 109 * - UNALIGNED_SUPPORT_DISABLE:
mbed_official 3:7a284390b0ce 110 *
mbed_official 3:7a284390b0ce 111 * Define macro UNALIGNED_SUPPORT_DISABLE, If the silicon does not support unaligned memory access
mbed_official 3:7a284390b0ce 112 *
mbed_official 3:7a284390b0ce 113 * - ARM_MATH_BIG_ENDIAN:
mbed_official 3:7a284390b0ce 114 *
mbed_official 3:7a284390b0ce 115 * Define macro ARM_MATH_BIG_ENDIAN to build the library for big endian targets. By default library builds for little endian targets.
mbed_official 3:7a284390b0ce 116 *
mbed_official 3:7a284390b0ce 117 * - ARM_MATH_MATRIX_CHECK:
mbed_official 3:7a284390b0ce 118 *
mbed_official 3:7a284390b0ce 119 * Define macro ARM_MATH_MATRIX_CHECK for checking on the input and output sizes of matrices
mbed_official 3:7a284390b0ce 120 *
mbed_official 3:7a284390b0ce 121 * - ARM_MATH_ROUNDING:
mbed_official 3:7a284390b0ce 122 *
mbed_official 3:7a284390b0ce 123 * Define macro ARM_MATH_ROUNDING for rounding on support functions
mbed_official 3:7a284390b0ce 124 *
mbed_official 3:7a284390b0ce 125 * - ARM_MATH_CMx:
mbed_official 3:7a284390b0ce 126 *
mbed_official 3:7a284390b0ce 127 * Define macro ARM_MATH_CM4 for building the library on Cortex-M4 target, ARM_MATH_CM3 for building library on Cortex-M3 target
mbed_official 3:7a284390b0ce 128 * and ARM_MATH_CM0 for building library on cortex-M0 target, ARM_MATH_CM0PLUS for building library on cortex-M0+ target.
mbed_official 3:7a284390b0ce 129 *
mbed_official 3:7a284390b0ce 130 * - __FPU_PRESENT:
mbed_official 3:7a284390b0ce 131 *
mbed_official 3:7a284390b0ce 132 * Initialize macro __FPU_PRESENT = 1 when building on FPU supported Targets. Enable this macro for M4bf and M4lf libraries
emilmont 1:fdd22bb7aa52 133 *
1050186 5:a912b042151f 134 * <hr>
1050186 5:a912b042151f 135 * CMSIS-DSP in ARM::CMSIS Pack
1050186 5:a912b042151f 136 * -----------------------------
1050186 5:a912b042151f 137 *
1050186 5:a912b042151f 138 * The following files relevant to CMSIS-DSP are present in the <b>ARM::CMSIS</b> Pack directories:
1050186 5:a912b042151f 139 * |File/Folder |Content |
1050186 5:a912b042151f 140 * |------------------------------|------------------------------------------------------------------------|
1050186 5:a912b042151f 141 * |\b CMSIS\\Documentation\\DSP | This documentation |
1050186 5:a912b042151f 142 * |\b CMSIS\\DSP_Lib | Software license agreement (license.txt) |
1050186 5:a912b042151f 143 * |\b CMSIS\\DSP_Lib\\Examples | Example projects demonstrating the usage of the library functions |
1050186 5:a912b042151f 144 * |\b CMSIS\\DSP_Lib\\Source | Source files for rebuilding the library |
1050186 5:a912b042151f 145 *
1050186 5:a912b042151f 146 * <hr>
1050186 5:a912b042151f 147 * Revision History of CMSIS-DSP
1050186 5:a912b042151f 148 * ------------
1050186 5:a912b042151f 149 * Please refer to \ref ChangeLog_pg.
emilmont 1:fdd22bb7aa52 150 *
1050186 5:a912b042151f 151 * Copyright Notice
1050186 5:a912b042151f 152 * ------------
1050186 5:a912b042151f 153 *
1050186 5:a912b042151f 154 * Copyright (C) 2010-2014 ARM Limited. All rights reserved.
emilmont 1:fdd22bb7aa52 155 */
emilmont 1:fdd22bb7aa52 156
emilmont 1:fdd22bb7aa52 157
emilmont 1:fdd22bb7aa52 158 /**
emilmont 1:fdd22bb7aa52 159 * @defgroup groupMath Basic Math Functions
emilmont 1:fdd22bb7aa52 160 */
emilmont 1:fdd22bb7aa52 161
emilmont 1:fdd22bb7aa52 162 /**
emilmont 1:fdd22bb7aa52 163 * @defgroup groupFastMath Fast Math Functions
emilmont 1:fdd22bb7aa52 164 * This set of functions provides a fast approximation to sine, cosine, and square root.
emilmont 1:fdd22bb7aa52 165 * As compared to most of the other functions in the CMSIS math library, the fast math functions
emilmont 1:fdd22bb7aa52 166 * operate on individual values and not arrays.
emilmont 1:fdd22bb7aa52 167 * There are separate functions for Q15, Q31, and floating-point data.
emilmont 1:fdd22bb7aa52 168 *
emilmont 1:fdd22bb7aa52 169 */
emilmont 1:fdd22bb7aa52 170
emilmont 1:fdd22bb7aa52 171 /**
emilmont 1:fdd22bb7aa52 172 * @defgroup groupCmplxMath Complex Math Functions
emilmont 1:fdd22bb7aa52 173 * This set of functions operates on complex data vectors.
emilmont 1:fdd22bb7aa52 174 * The data in the complex arrays is stored in an interleaved fashion
emilmont 1:fdd22bb7aa52 175 * (real, imag, real, imag, ...).
emilmont 1:fdd22bb7aa52 176 * In the API functions, the number of samples in a complex array refers
emilmont 1:fdd22bb7aa52 177 * to the number of complex values; the array contains twice this number of
emilmont 1:fdd22bb7aa52 178 * real values.
emilmont 1:fdd22bb7aa52 179 */
emilmont 1:fdd22bb7aa52 180
emilmont 1:fdd22bb7aa52 181 /**
emilmont 1:fdd22bb7aa52 182 * @defgroup groupFilters Filtering Functions
emilmont 1:fdd22bb7aa52 183 */
emilmont 1:fdd22bb7aa52 184
emilmont 1:fdd22bb7aa52 185 /**
emilmont 1:fdd22bb7aa52 186 * @defgroup groupMatrix Matrix Functions
emilmont 1:fdd22bb7aa52 187 *
emilmont 1:fdd22bb7aa52 188 * This set of functions provides basic matrix math operations.
emilmont 1:fdd22bb7aa52 189 * The functions operate on matrix data structures. For example,
emilmont 1:fdd22bb7aa52 190 * the type
emilmont 1:fdd22bb7aa52 191 * definition for the floating-point matrix structure is shown
emilmont 1:fdd22bb7aa52 192 * below:
emilmont 1:fdd22bb7aa52 193 * <pre>
emilmont 1:fdd22bb7aa52 194 * typedef struct
emilmont 1:fdd22bb7aa52 195 * {
emilmont 1:fdd22bb7aa52 196 * uint16_t numRows; // number of rows of the matrix.
emilmont 1:fdd22bb7aa52 197 * uint16_t numCols; // number of columns of the matrix.
emilmont 1:fdd22bb7aa52 198 * float32_t *pData; // points to the data of the matrix.
emilmont 1:fdd22bb7aa52 199 * } arm_matrix_instance_f32;
emilmont 1:fdd22bb7aa52 200 * </pre>
emilmont 1:fdd22bb7aa52 201 * There are similar definitions for Q15 and Q31 data types.
emilmont 1:fdd22bb7aa52 202 *
emilmont 1:fdd22bb7aa52 203 * The structure specifies the size of the matrix and then points to
emilmont 1:fdd22bb7aa52 204 * an array of data. The array is of size <code>numRows X numCols</code>
emilmont 1:fdd22bb7aa52 205 * and the values are arranged in row order. That is, the
emilmont 1:fdd22bb7aa52 206 * matrix element (i, j) is stored at:
emilmont 1:fdd22bb7aa52 207 * <pre>
emilmont 1:fdd22bb7aa52 208 * pData[i*numCols + j]
emilmont 1:fdd22bb7aa52 209 * </pre>
emilmont 1:fdd22bb7aa52 210 *
emilmont 1:fdd22bb7aa52 211 * \par Init Functions
emilmont 1:fdd22bb7aa52 212 * There is an associated initialization function for each type of matrix
emilmont 1:fdd22bb7aa52 213 * data structure.
emilmont 1:fdd22bb7aa52 214 * The initialization function sets the values of the internal structure fields.
emilmont 1:fdd22bb7aa52 215 * Refer to the function <code>arm_mat_init_f32()</code>, <code>arm_mat_init_q31()</code>
emilmont 1:fdd22bb7aa52 216 * and <code>arm_mat_init_q15()</code> for floating-point, Q31 and Q15 types, respectively.
emilmont 1:fdd22bb7aa52 217 *
emilmont 1:fdd22bb7aa52 218 * \par
emilmont 1:fdd22bb7aa52 219 * Use of the initialization function is optional. However, if initialization function is used
emilmont 1:fdd22bb7aa52 220 * then the instance structure cannot be placed into a const data section.
emilmont 1:fdd22bb7aa52 221 * To place the instance structure in a const data
emilmont 1:fdd22bb7aa52 222 * section, manually initialize the data structure. For example:
emilmont 1:fdd22bb7aa52 223 * <pre>
emilmont 1:fdd22bb7aa52 224 * <code>arm_matrix_instance_f32 S = {nRows, nColumns, pData};</code>
emilmont 1:fdd22bb7aa52 225 * <code>arm_matrix_instance_q31 S = {nRows, nColumns, pData};</code>
emilmont 1:fdd22bb7aa52 226 * <code>arm_matrix_instance_q15 S = {nRows, nColumns, pData};</code>
emilmont 1:fdd22bb7aa52 227 * </pre>
emilmont 1:fdd22bb7aa52 228 * where <code>nRows</code> specifies the number of rows, <code>nColumns</code>
emilmont 1:fdd22bb7aa52 229 * specifies the number of columns, and <code>pData</code> points to the
emilmont 1:fdd22bb7aa52 230 * data array.
emilmont 1:fdd22bb7aa52 231 *
emilmont 1:fdd22bb7aa52 232 * \par Size Checking
emilmont 1:fdd22bb7aa52 233 * By default all of the matrix functions perform size checking on the input and
emilmont 1:fdd22bb7aa52 234 * output matrices. For example, the matrix addition function verifies that the
emilmont 1:fdd22bb7aa52 235 * two input matrices and the output matrix all have the same number of rows and
emilmont 1:fdd22bb7aa52 236 * columns. If the size check fails the functions return:
emilmont 1:fdd22bb7aa52 237 * <pre>
emilmont 1:fdd22bb7aa52 238 * ARM_MATH_SIZE_MISMATCH
emilmont 1:fdd22bb7aa52 239 * </pre>
emilmont 1:fdd22bb7aa52 240 * Otherwise the functions return
emilmont 1:fdd22bb7aa52 241 * <pre>
emilmont 1:fdd22bb7aa52 242 * ARM_MATH_SUCCESS
emilmont 1:fdd22bb7aa52 243 * </pre>
emilmont 1:fdd22bb7aa52 244 * There is some overhead associated with this matrix size checking.
emilmont 1:fdd22bb7aa52 245 * The matrix size checking is enabled via the \#define
emilmont 1:fdd22bb7aa52 246 * <pre>
emilmont 1:fdd22bb7aa52 247 * ARM_MATH_MATRIX_CHECK
emilmont 1:fdd22bb7aa52 248 * </pre>
emilmont 1:fdd22bb7aa52 249 * within the library project settings. By default this macro is defined
emilmont 1:fdd22bb7aa52 250 * and size checking is enabled. By changing the project settings and
emilmont 1:fdd22bb7aa52 251 * undefining this macro size checking is eliminated and the functions
emilmont 1:fdd22bb7aa52 252 * run a bit faster. With size checking disabled the functions always
emilmont 1:fdd22bb7aa52 253 * return <code>ARM_MATH_SUCCESS</code>.
emilmont 1:fdd22bb7aa52 254 */
emilmont 1:fdd22bb7aa52 255
emilmont 1:fdd22bb7aa52 256 /**
emilmont 1:fdd22bb7aa52 257 * @defgroup groupTransforms Transform Functions
emilmont 1:fdd22bb7aa52 258 */
emilmont 1:fdd22bb7aa52 259
emilmont 1:fdd22bb7aa52 260 /**
emilmont 1:fdd22bb7aa52 261 * @defgroup groupController Controller Functions
emilmont 1:fdd22bb7aa52 262 */
emilmont 1:fdd22bb7aa52 263
emilmont 1:fdd22bb7aa52 264 /**
emilmont 1:fdd22bb7aa52 265 * @defgroup groupStats Statistics Functions
emilmont 1:fdd22bb7aa52 266 */
emilmont 1:fdd22bb7aa52 267 /**
emilmont 1:fdd22bb7aa52 268 * @defgroup groupSupport Support Functions
emilmont 1:fdd22bb7aa52 269 */
emilmont 1:fdd22bb7aa52 270
emilmont 1:fdd22bb7aa52 271 /**
emilmont 1:fdd22bb7aa52 272 * @defgroup groupInterpolation Interpolation Functions
emilmont 1:fdd22bb7aa52 273 * These functions perform 1- and 2-dimensional interpolation of data.
emilmont 1:fdd22bb7aa52 274 * Linear interpolation is used for 1-dimensional data and
emilmont 1:fdd22bb7aa52 275 * bilinear interpolation is used for 2-dimensional data.
emilmont 1:fdd22bb7aa52 276 */
emilmont 1:fdd22bb7aa52 277
emilmont 1:fdd22bb7aa52 278 /**
emilmont 1:fdd22bb7aa52 279 * @defgroup groupExamples Examples
emilmont 1:fdd22bb7aa52 280 */
emilmont 1:fdd22bb7aa52 281 #ifndef _ARM_MATH_H
emilmont 1:fdd22bb7aa52 282 #define _ARM_MATH_H
emilmont 1:fdd22bb7aa52 283
emilmont 1:fdd22bb7aa52 284 #define __CMSIS_GENERIC /* disable NVIC and Systick functions */
emilmont 1:fdd22bb7aa52 285
1050186 5:a912b042151f 286 #if 0
emilmont 1:fdd22bb7aa52 287 #if defined (ARM_MATH_CM4)
emilmont 1:fdd22bb7aa52 288 #include "core_cm4.h"
emilmont 1:fdd22bb7aa52 289 #elif defined (ARM_MATH_CM3)
emilmont 1:fdd22bb7aa52 290 #include "core_cm3.h"
emilmont 1:fdd22bb7aa52 291 #elif defined (ARM_MATH_CM0)
emilmont 1:fdd22bb7aa52 292 #include "core_cm0.h"
mbed_official 3:7a284390b0ce 293 #define ARM_MATH_CM0_FAMILY
mbed_official 3:7a284390b0ce 294 #elif defined (ARM_MATH_CM0PLUS)
mbed_official 3:7a284390b0ce 295 #include "core_cm0plus.h"
mbed_official 3:7a284390b0ce 296 #define ARM_MATH_CM0_FAMILY
1050186 5:a912b042151f 297 #elif defined (ARM_MATH_CA9)
1050186 5:a912b042151f 298 #include "core_ca9.h"
emilmont 1:fdd22bb7aa52 299 #else
emilmont 1:fdd22bb7aa52 300 #include "ARMCM4.h"
emilmont 1:fdd22bb7aa52 301 #warning "Define either ARM_MATH_CM4 OR ARM_MATH_CM3...By Default building on ARM_MATH_CM4....."
emilmont 1:fdd22bb7aa52 302 #endif
1050186 5:a912b042151f 303 #else
1050186 5:a912b042151f 304 #include <arm_neon.h>
1050186 5:a912b042151f 305 #if !defined(__CC_ARM)
1050186 5:a912b042151f 306 #define ARM_MATH_CM0_FAMILY
1050186 5:a912b042151f 307 #endif
1050186 5:a912b042151f 308 #define __FPU_USED 1
1050186 5:a912b042151f 309 #define __INLINE __inline
1050186 5:a912b042151f 310 #if defined(__CC_ARM)
1050186 5:a912b042151f 311 #define __QADD __qadd
1050186 5:a912b042151f 312 #define __QSUB __qsub
1050186 5:a912b042151f 313 #define __QSUB16 __qsub16
1050186 5:a912b042151f 314 #define __QSUB8 __qsub8
1050186 5:a912b042151f 315 #define __CLZ __clz
1050186 5:a912b042151f 316 #define __SSAT __ssat
1050186 5:a912b042151f 317 #define __SMUAD __smuad
1050186 5:a912b042151f 318 #define __SMLALD __smlald
1050186 5:a912b042151f 319 #define __QADD16 __qadd16
1050186 5:a912b042151f 320 #define __SHADD16 __shadd16
1050186 5:a912b042151f 321 #define __SMUADX __smuadx
1050186 5:a912b042151f 322 #define __SMUSD __smusd
1050186 5:a912b042151f 323 #define __SMUSDX __smusdx
1050186 5:a912b042151f 324 #define __QASX __qasx
1050186 5:a912b042151f 325 #define __QSAX __qsax
1050186 5:a912b042151f 326 #define __SHASX __shasx
1050186 5:a912b042151f 327 #define __SHSAX __shsax
1050186 5:a912b042151f 328 #define __SHSUB16 __shsub16
1050186 5:a912b042151f 329 #define __SMLAD __smlad
1050186 5:a912b042151f 330 #define __SMLADX __smladx
1050186 5:a912b042151f 331 #define __SMLSDX __smlsdx
1050186 5:a912b042151f 332 #define __ROR __ror
1050186 5:a912b042151f 333 #define __SXTB16 __sxtb16
1050186 5:a912b042151f 334 #define __SMLALDX __smlaldx
1050186 5:a912b042151f 335 #define __QADD8 __qadd8
1050186 5:a912b042151f 336 #endif
1050186 5:a912b042151f 337 #define __PKHBT(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0x0000FFFF) | \
1050186 5:a912b042151f 338 (((int32_t)(ARG2) << ARG3) & (int32_t)0xFFFF0000) )
1050186 5:a912b042151f 339 #define __PKHTB(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0xFFFF0000) | \
1050186 5:a912b042151f 340 (((int32_t)(ARG2) >> ARG3) & (int32_t)0x0000FFFF) )
1050186 5:a912b042151f 341 #endif
emilmont 1:fdd22bb7aa52 342
emilmont 1:fdd22bb7aa52 343 #undef __CMSIS_GENERIC /* enable NVIC and Systick functions */
emilmont 1:fdd22bb7aa52 344 #include "string.h"
emilmont 1:fdd22bb7aa52 345 #include "math.h"
emilmont 2:da51fb522205 346 #ifdef __cplusplus
emilmont 1:fdd22bb7aa52 347 extern "C"
emilmont 1:fdd22bb7aa52 348 {
emilmont 1:fdd22bb7aa52 349 #endif
emilmont 1:fdd22bb7aa52 350
emilmont 1:fdd22bb7aa52 351
emilmont 1:fdd22bb7aa52 352 /**
emilmont 1:fdd22bb7aa52 353 * @brief Macros required for reciprocal calculation in Normalized LMS
emilmont 1:fdd22bb7aa52 354 */
emilmont 1:fdd22bb7aa52 355
emilmont 2:da51fb522205 356 #define DELTA_Q31 (0x100)
emilmont 2:da51fb522205 357 #define DELTA_Q15 0x5
emilmont 2:da51fb522205 358 #define INDEX_MASK 0x0000003F
emilmont 1:fdd22bb7aa52 359 #ifndef PI
emilmont 2:da51fb522205 360 #define PI 3.14159265358979f
emilmont 1:fdd22bb7aa52 361 #endif
emilmont 1:fdd22bb7aa52 362
emilmont 1:fdd22bb7aa52 363 /**
emilmont 1:fdd22bb7aa52 364 * @brief Macros required for SINE and COSINE Fast math approximations
emilmont 1:fdd22bb7aa52 365 */
emilmont 1:fdd22bb7aa52 366
1050186 5:a912b042151f 367 #define FAST_MATH_TABLE_SIZE 512
1050186 5:a912b042151f 368 #define FAST_MATH_Q31_SHIFT (32 - 10)
1050186 5:a912b042151f 369 #define FAST_MATH_Q15_SHIFT (16 - 10)
1050186 5:a912b042151f 370 #define CONTROLLER_Q31_SHIFT (32 - 9)
1050186 5:a912b042151f 371 #define TABLE_SIZE 256
1050186 5:a912b042151f 372 #define TABLE_SPACING_Q31 0x400000
1050186 5:a912b042151f 373 #define TABLE_SPACING_Q15 0x80
emilmont 1:fdd22bb7aa52 374
emilmont 1:fdd22bb7aa52 375 /**
emilmont 1:fdd22bb7aa52 376 * @brief Macros required for SINE and COSINE Controller functions
emilmont 1:fdd22bb7aa52 377 */
emilmont 1:fdd22bb7aa52 378 /* 1.31(q31) Fixed value of 2/360 */
emilmont 1:fdd22bb7aa52 379 /* -1 to +1 is divided into 360 values so total spacing is (2/360) */
emilmont 2:da51fb522205 380 #define INPUT_SPACING 0xB60B61
emilmont 1:fdd22bb7aa52 381
emilmont 1:fdd22bb7aa52 382 /**
emilmont 1:fdd22bb7aa52 383 * @brief Macro for Unaligned Support
emilmont 1:fdd22bb7aa52 384 */
emilmont 1:fdd22bb7aa52 385 #ifndef UNALIGNED_SUPPORT_DISABLE
emilmont 1:fdd22bb7aa52 386 #define ALIGN4
emilmont 1:fdd22bb7aa52 387 #else
emilmont 1:fdd22bb7aa52 388 #if defined (__GNUC__)
emilmont 1:fdd22bb7aa52 389 #define ALIGN4 __attribute__((aligned(4)))
emilmont 1:fdd22bb7aa52 390 #else
emilmont 1:fdd22bb7aa52 391 #define ALIGN4 __align(4)
emilmont 1:fdd22bb7aa52 392 #endif
emilmont 2:da51fb522205 393 #endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */
emilmont 1:fdd22bb7aa52 394
emilmont 1:fdd22bb7aa52 395 /**
emilmont 1:fdd22bb7aa52 396 * @brief Error status returned by some functions in the library.
emilmont 1:fdd22bb7aa52 397 */
emilmont 1:fdd22bb7aa52 398
emilmont 1:fdd22bb7aa52 399 typedef enum
emilmont 1:fdd22bb7aa52 400 {
emilmont 1:fdd22bb7aa52 401 ARM_MATH_SUCCESS = 0, /**< No error */
emilmont 1:fdd22bb7aa52 402 ARM_MATH_ARGUMENT_ERROR = -1, /**< One or more arguments are incorrect */
emilmont 1:fdd22bb7aa52 403 ARM_MATH_LENGTH_ERROR = -2, /**< Length of data buffer is incorrect */
emilmont 1:fdd22bb7aa52 404 ARM_MATH_SIZE_MISMATCH = -3, /**< Size of matrices is not compatible with the operation. */
emilmont 1:fdd22bb7aa52 405 ARM_MATH_NANINF = -4, /**< Not-a-number (NaN) or infinity is generated */
emilmont 1:fdd22bb7aa52 406 ARM_MATH_SINGULAR = -5, /**< Generated by matrix inversion if the input matrix is singular and cannot be inverted. */
emilmont 1:fdd22bb7aa52 407 ARM_MATH_TEST_FAILURE = -6 /**< Test Failed */
emilmont 1:fdd22bb7aa52 408 } arm_status;
emilmont 1:fdd22bb7aa52 409
emilmont 1:fdd22bb7aa52 410 /**
emilmont 1:fdd22bb7aa52 411 * @brief 8-bit fractional data type in 1.7 format.
emilmont 1:fdd22bb7aa52 412 */
emilmont 1:fdd22bb7aa52 413 typedef int8_t q7_t;
emilmont 1:fdd22bb7aa52 414
emilmont 1:fdd22bb7aa52 415 /**
emilmont 1:fdd22bb7aa52 416 * @brief 16-bit fractional data type in 1.15 format.
emilmont 1:fdd22bb7aa52 417 */
emilmont 1:fdd22bb7aa52 418 typedef int16_t q15_t;
emilmont 1:fdd22bb7aa52 419
emilmont 1:fdd22bb7aa52 420 /**
emilmont 1:fdd22bb7aa52 421 * @brief 32-bit fractional data type in 1.31 format.
emilmont 1:fdd22bb7aa52 422 */
emilmont 1:fdd22bb7aa52 423 typedef int32_t q31_t;
emilmont 1:fdd22bb7aa52 424
emilmont 1:fdd22bb7aa52 425 /**
emilmont 1:fdd22bb7aa52 426 * @brief 64-bit fractional data type in 1.63 format.
emilmont 1:fdd22bb7aa52 427 */
emilmont 1:fdd22bb7aa52 428 typedef int64_t q63_t;
emilmont 1:fdd22bb7aa52 429
emilmont 1:fdd22bb7aa52 430 /**
emilmont 1:fdd22bb7aa52 431 * @brief 32-bit floating-point type definition.
emilmont 1:fdd22bb7aa52 432 */
emilmont 1:fdd22bb7aa52 433 typedef float float32_t;
emilmont 1:fdd22bb7aa52 434
emilmont 1:fdd22bb7aa52 435 /**
emilmont 1:fdd22bb7aa52 436 * @brief 64-bit floating-point type definition.
emilmont 1:fdd22bb7aa52 437 */
emilmont 1:fdd22bb7aa52 438 typedef double float64_t;
emilmont 1:fdd22bb7aa52 439
emilmont 1:fdd22bb7aa52 440 /**
emilmont 1:fdd22bb7aa52 441 * @brief definition to read/write two 16 bit values.
emilmont 1:fdd22bb7aa52 442 */
mbed_official 3:7a284390b0ce 443 #if defined __CC_ARM
mbed_official 3:7a284390b0ce 444 #define __SIMD32_TYPE int32_t __packed
mbed_official 3:7a284390b0ce 445 #define CMSIS_UNUSED __attribute__((unused))
mbed_official 3:7a284390b0ce 446 #elif defined __ICCARM__
mbed_official 3:7a284390b0ce 447 #define CMSIS_UNUSED
mbed_official 3:7a284390b0ce 448 #define __SIMD32_TYPE int32_t __packed
mbed_official 3:7a284390b0ce 449 #elif defined __GNUC__
mbed_official 3:7a284390b0ce 450 #define __SIMD32_TYPE int32_t
mbed_official 3:7a284390b0ce 451 #define CMSIS_UNUSED __attribute__((unused))
1050186 5:a912b042151f 452 #elif defined __CSMC__ /* Cosmic */
1050186 5:a912b042151f 453 #define CMSIS_UNUSED
1050186 5:a912b042151f 454 #define __SIMD32_TYPE int32_t
emilmont 1:fdd22bb7aa52 455 #else
mbed_official 3:7a284390b0ce 456 #error Unknown compiler
mbed_official 3:7a284390b0ce 457 #endif
mbed_official 3:7a284390b0ce 458
mbed_official 3:7a284390b0ce 459 #define __SIMD32(addr) (*(__SIMD32_TYPE **) & (addr))
mbed_official 3:7a284390b0ce 460 #define __SIMD32_CONST(addr) ((__SIMD32_TYPE *)(addr))
mbed_official 3:7a284390b0ce 461
mbed_official 3:7a284390b0ce 462 #define _SIMD32_OFFSET(addr) (*(__SIMD32_TYPE *) (addr))
mbed_official 3:7a284390b0ce 463
mbed_official 3:7a284390b0ce 464 #define __SIMD64(addr) (*(int64_t **) & (addr))
mbed_official 3:7a284390b0ce 465
mbed_official 3:7a284390b0ce 466 #if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY)
emilmont 1:fdd22bb7aa52 467 /**
emilmont 1:fdd22bb7aa52 468 * @brief definition to pack two 16 bit values.
emilmont 1:fdd22bb7aa52 469 */
emilmont 1:fdd22bb7aa52 470 #define __PKHBT(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0x0000FFFF) | \
emilmont 1:fdd22bb7aa52 471 (((int32_t)(ARG2) << ARG3) & (int32_t)0xFFFF0000) )
emilmont 1:fdd22bb7aa52 472 #define __PKHTB(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0xFFFF0000) | \
emilmont 1:fdd22bb7aa52 473 (((int32_t)(ARG2) >> ARG3) & (int32_t)0x0000FFFF) )
emilmont 1:fdd22bb7aa52 474
emilmont 1:fdd22bb7aa52 475 #endif
emilmont 1:fdd22bb7aa52 476
emilmont 1:fdd22bb7aa52 477
emilmont 1:fdd22bb7aa52 478 /**
emilmont 1:fdd22bb7aa52 479 * @brief definition to pack four 8 bit values.
emilmont 1:fdd22bb7aa52 480 */
emilmont 1:fdd22bb7aa52 481 #ifndef ARM_MATH_BIG_ENDIAN
emilmont 1:fdd22bb7aa52 482
emilmont 2:da51fb522205 483 #define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v0) << 0) & (int32_t)0x000000FF) | \
emilmont 2:da51fb522205 484 (((int32_t)(v1) << 8) & (int32_t)0x0000FF00) | \
emilmont 2:da51fb522205 485 (((int32_t)(v2) << 16) & (int32_t)0x00FF0000) | \
emilmont 2:da51fb522205 486 (((int32_t)(v3) << 24) & (int32_t)0xFF000000) )
emilmont 1:fdd22bb7aa52 487 #else
emilmont 1:fdd22bb7aa52 488
emilmont 2:da51fb522205 489 #define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v3) << 0) & (int32_t)0x000000FF) | \
emilmont 2:da51fb522205 490 (((int32_t)(v2) << 8) & (int32_t)0x0000FF00) | \
emilmont 2:da51fb522205 491 (((int32_t)(v1) << 16) & (int32_t)0x00FF0000) | \
emilmont 2:da51fb522205 492 (((int32_t)(v0) << 24) & (int32_t)0xFF000000) )
emilmont 1:fdd22bb7aa52 493
emilmont 1:fdd22bb7aa52 494 #endif
emilmont 1:fdd22bb7aa52 495
emilmont 1:fdd22bb7aa52 496
emilmont 1:fdd22bb7aa52 497 /**
emilmont 1:fdd22bb7aa52 498 * @brief Clips Q63 to Q31 values.
emilmont 1:fdd22bb7aa52 499 */
mbed_official 3:7a284390b0ce 500 static __INLINE q31_t clip_q63_to_q31(
emilmont 1:fdd22bb7aa52 501 q63_t x)
emilmont 1:fdd22bb7aa52 502 {
emilmont 1:fdd22bb7aa52 503 return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ?
emilmont 1:fdd22bb7aa52 504 ((0x7FFFFFFF ^ ((q31_t) (x >> 63)))) : (q31_t) x;
emilmont 1:fdd22bb7aa52 505 }
emilmont 1:fdd22bb7aa52 506
emilmont 1:fdd22bb7aa52 507 /**
emilmont 1:fdd22bb7aa52 508 * @brief Clips Q63 to Q15 values.
emilmont 1:fdd22bb7aa52 509 */
mbed_official 3:7a284390b0ce 510 static __INLINE q15_t clip_q63_to_q15(
emilmont 1:fdd22bb7aa52 511 q63_t x)
emilmont 1:fdd22bb7aa52 512 {
emilmont 1:fdd22bb7aa52 513 return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ?
emilmont 1:fdd22bb7aa52 514 ((0x7FFF ^ ((q15_t) (x >> 63)))) : (q15_t) (x >> 15);
emilmont 1:fdd22bb7aa52 515 }
emilmont 1:fdd22bb7aa52 516
emilmont 1:fdd22bb7aa52 517 /**
emilmont 1:fdd22bb7aa52 518 * @brief Clips Q31 to Q7 values.
emilmont 1:fdd22bb7aa52 519 */
mbed_official 3:7a284390b0ce 520 static __INLINE q7_t clip_q31_to_q7(
emilmont 1:fdd22bb7aa52 521 q31_t x)
emilmont 1:fdd22bb7aa52 522 {
emilmont 1:fdd22bb7aa52 523 return ((q31_t) (x >> 24) != ((q31_t) x >> 23)) ?
emilmont 1:fdd22bb7aa52 524 ((0x7F ^ ((q7_t) (x >> 31)))) : (q7_t) x;
emilmont 1:fdd22bb7aa52 525 }
emilmont 1:fdd22bb7aa52 526
emilmont 1:fdd22bb7aa52 527 /**
emilmont 1:fdd22bb7aa52 528 * @brief Clips Q31 to Q15 values.
emilmont 1:fdd22bb7aa52 529 */
mbed_official 3:7a284390b0ce 530 static __INLINE q15_t clip_q31_to_q15(
emilmont 1:fdd22bb7aa52 531 q31_t x)
emilmont 1:fdd22bb7aa52 532 {
emilmont 1:fdd22bb7aa52 533 return ((q31_t) (x >> 16) != ((q31_t) x >> 15)) ?
emilmont 1:fdd22bb7aa52 534 ((0x7FFF ^ ((q15_t) (x >> 31)))) : (q15_t) x;
emilmont 1:fdd22bb7aa52 535 }
emilmont 1:fdd22bb7aa52 536
emilmont 1:fdd22bb7aa52 537 /**
emilmont 1:fdd22bb7aa52 538 * @brief Multiplies 32 X 64 and returns 32 bit result in 2.30 format.
emilmont 1:fdd22bb7aa52 539 */
emilmont 1:fdd22bb7aa52 540
mbed_official 3:7a284390b0ce 541 static __INLINE q63_t mult32x64(
emilmont 1:fdd22bb7aa52 542 q63_t x,
emilmont 1:fdd22bb7aa52 543 q31_t y)
emilmont 1:fdd22bb7aa52 544 {
emilmont 1:fdd22bb7aa52 545 return ((((q63_t) (x & 0x00000000FFFFFFFF) * y) >> 32) +
emilmont 1:fdd22bb7aa52 546 (((q63_t) (x >> 32) * y)));
emilmont 1:fdd22bb7aa52 547 }
emilmont 1:fdd22bb7aa52 548
emilmont 1:fdd22bb7aa52 549
mbed_official 3:7a284390b0ce 550 #if defined (ARM_MATH_CM0_FAMILY) && defined ( __CC_ARM )
emilmont 1:fdd22bb7aa52 551 #define __CLZ __clz
1050186 5:a912b042151f 552 #endif
1050186 5:a912b042151f 553
1050186 5:a912b042151f 554 /* #if defined (ARM_MATH_CM0_FAMILY) && ((defined (__ICCARM__)) ||(defined (__GNUC__)) || defined (__TASKING__) ) */
1050186 5:a912b042151f 555 #if !defined(__CLZ)
mbed_official 3:7a284390b0ce 556
mbed_official 3:7a284390b0ce 557 static __INLINE uint32_t __CLZ(
mbed_official 3:7a284390b0ce 558 q31_t data);
mbed_official 3:7a284390b0ce 559
mbed_official 3:7a284390b0ce 560
mbed_official 3:7a284390b0ce 561 static __INLINE uint32_t __CLZ(
mbed_official 3:7a284390b0ce 562 q31_t data)
emilmont 1:fdd22bb7aa52 563 {
emilmont 1:fdd22bb7aa52 564 uint32_t count = 0;
emilmont 1:fdd22bb7aa52 565 uint32_t mask = 0x80000000;
emilmont 1:fdd22bb7aa52 566
emilmont 1:fdd22bb7aa52 567 while((data & mask) == 0)
emilmont 1:fdd22bb7aa52 568 {
emilmont 1:fdd22bb7aa52 569 count += 1u;
emilmont 1:fdd22bb7aa52 570 mask = mask >> 1u;
emilmont 1:fdd22bb7aa52 571 }
emilmont 1:fdd22bb7aa52 572
emilmont 1:fdd22bb7aa52 573 return (count);
emilmont 1:fdd22bb7aa52 574
emilmont 1:fdd22bb7aa52 575 }
emilmont 1:fdd22bb7aa52 576
emilmont 1:fdd22bb7aa52 577 #endif
emilmont 1:fdd22bb7aa52 578
emilmont 1:fdd22bb7aa52 579 /**
mbed_official 3:7a284390b0ce 580 * @brief Function to Calculates 1/in (reciprocal) value of Q31 Data type.
mbed_official 3:7a284390b0ce 581 */
mbed_official 3:7a284390b0ce 582
mbed_official 3:7a284390b0ce 583 static __INLINE uint32_t arm_recip_q31(
emilmont 1:fdd22bb7aa52 584 q31_t in,
emilmont 1:fdd22bb7aa52 585 q31_t * dst,
emilmont 1:fdd22bb7aa52 586 q31_t * pRecipTable)
emilmont 1:fdd22bb7aa52 587 {
emilmont 1:fdd22bb7aa52 588
emilmont 1:fdd22bb7aa52 589 uint32_t out, tempVal;
emilmont 1:fdd22bb7aa52 590 uint32_t index, i;
emilmont 1:fdd22bb7aa52 591 uint32_t signBits;
emilmont 1:fdd22bb7aa52 592
emilmont 1:fdd22bb7aa52 593 if(in > 0)
emilmont 1:fdd22bb7aa52 594 {
emilmont 1:fdd22bb7aa52 595 signBits = __CLZ(in) - 1;
emilmont 1:fdd22bb7aa52 596 }
emilmont 1:fdd22bb7aa52 597 else
emilmont 1:fdd22bb7aa52 598 {
emilmont 1:fdd22bb7aa52 599 signBits = __CLZ(-in) - 1;
emilmont 1:fdd22bb7aa52 600 }
emilmont 1:fdd22bb7aa52 601
emilmont 1:fdd22bb7aa52 602 /* Convert input sample to 1.31 format */
emilmont 1:fdd22bb7aa52 603 in = in << signBits;
emilmont 1:fdd22bb7aa52 604
emilmont 1:fdd22bb7aa52 605 /* calculation of index for initial approximated Val */
emilmont 1:fdd22bb7aa52 606 index = (uint32_t) (in >> 24u);
emilmont 1:fdd22bb7aa52 607 index = (index & INDEX_MASK);
emilmont 1:fdd22bb7aa52 608
emilmont 1:fdd22bb7aa52 609 /* 1.31 with exp 1 */
emilmont 1:fdd22bb7aa52 610 out = pRecipTable[index];
emilmont 1:fdd22bb7aa52 611
emilmont 1:fdd22bb7aa52 612 /* calculation of reciprocal value */
emilmont 1:fdd22bb7aa52 613 /* running approximation for two iterations */
emilmont 1:fdd22bb7aa52 614 for (i = 0u; i < 2u; i++)
emilmont 1:fdd22bb7aa52 615 {
emilmont 1:fdd22bb7aa52 616 tempVal = (q31_t) (((q63_t) in * out) >> 31u);
emilmont 1:fdd22bb7aa52 617 tempVal = 0x7FFFFFFF - tempVal;
emilmont 1:fdd22bb7aa52 618 /* 1.31 with exp 1 */
emilmont 1:fdd22bb7aa52 619 //out = (q31_t) (((q63_t) out * tempVal) >> 30u);
emilmont 1:fdd22bb7aa52 620 out = (q31_t) clip_q63_to_q31(((q63_t) out * tempVal) >> 30u);
emilmont 1:fdd22bb7aa52 621 }
emilmont 1:fdd22bb7aa52 622
emilmont 1:fdd22bb7aa52 623 /* write output */
emilmont 1:fdd22bb7aa52 624 *dst = out;
emilmont 1:fdd22bb7aa52 625
emilmont 1:fdd22bb7aa52 626 /* return num of signbits of out = 1/in value */
emilmont 1:fdd22bb7aa52 627 return (signBits + 1u);
emilmont 1:fdd22bb7aa52 628
emilmont 1:fdd22bb7aa52 629 }
emilmont 1:fdd22bb7aa52 630
emilmont 1:fdd22bb7aa52 631 /**
mbed_official 3:7a284390b0ce 632 * @brief Function to Calculates 1/in (reciprocal) value of Q15 Data type.
mbed_official 3:7a284390b0ce 633 */
mbed_official 3:7a284390b0ce 634 static __INLINE uint32_t arm_recip_q15(
emilmont 1:fdd22bb7aa52 635 q15_t in,
emilmont 1:fdd22bb7aa52 636 q15_t * dst,
emilmont 1:fdd22bb7aa52 637 q15_t * pRecipTable)
emilmont 1:fdd22bb7aa52 638 {
emilmont 1:fdd22bb7aa52 639
emilmont 1:fdd22bb7aa52 640 uint32_t out = 0, tempVal = 0;
emilmont 1:fdd22bb7aa52 641 uint32_t index = 0, i = 0;
emilmont 1:fdd22bb7aa52 642 uint32_t signBits = 0;
emilmont 1:fdd22bb7aa52 643
emilmont 1:fdd22bb7aa52 644 if(in > 0)
emilmont 1:fdd22bb7aa52 645 {
emilmont 1:fdd22bb7aa52 646 signBits = __CLZ(in) - 17;
emilmont 1:fdd22bb7aa52 647 }
emilmont 1:fdd22bb7aa52 648 else
emilmont 1:fdd22bb7aa52 649 {
emilmont 1:fdd22bb7aa52 650 signBits = __CLZ(-in) - 17;
emilmont 1:fdd22bb7aa52 651 }
emilmont 1:fdd22bb7aa52 652
emilmont 1:fdd22bb7aa52 653 /* Convert input sample to 1.15 format */
emilmont 1:fdd22bb7aa52 654 in = in << signBits;
emilmont 1:fdd22bb7aa52 655
emilmont 1:fdd22bb7aa52 656 /* calculation of index for initial approximated Val */
emilmont 1:fdd22bb7aa52 657 index = in >> 8;
emilmont 1:fdd22bb7aa52 658 index = (index & INDEX_MASK);
emilmont 1:fdd22bb7aa52 659
emilmont 1:fdd22bb7aa52 660 /* 1.15 with exp 1 */
emilmont 1:fdd22bb7aa52 661 out = pRecipTable[index];
emilmont 1:fdd22bb7aa52 662
emilmont 1:fdd22bb7aa52 663 /* calculation of reciprocal value */
emilmont 1:fdd22bb7aa52 664 /* running approximation for two iterations */
emilmont 1:fdd22bb7aa52 665 for (i = 0; i < 2; i++)
emilmont 1:fdd22bb7aa52 666 {
emilmont 1:fdd22bb7aa52 667 tempVal = (q15_t) (((q31_t) in * out) >> 15);
emilmont 1:fdd22bb7aa52 668 tempVal = 0x7FFF - tempVal;
emilmont 1:fdd22bb7aa52 669 /* 1.15 with exp 1 */
emilmont 1:fdd22bb7aa52 670 out = (q15_t) (((q31_t) out * tempVal) >> 14);
emilmont 1:fdd22bb7aa52 671 }
emilmont 1:fdd22bb7aa52 672
emilmont 1:fdd22bb7aa52 673 /* write output */
emilmont 1:fdd22bb7aa52 674 *dst = out;
emilmont 1:fdd22bb7aa52 675
emilmont 1:fdd22bb7aa52 676 /* return num of signbits of out = 1/in value */
emilmont 1:fdd22bb7aa52 677 return (signBits + 1);
emilmont 1:fdd22bb7aa52 678
emilmont 1:fdd22bb7aa52 679 }
emilmont 1:fdd22bb7aa52 680
emilmont 1:fdd22bb7aa52 681
emilmont 1:fdd22bb7aa52 682 /*
emilmont 1:fdd22bb7aa52 683 * @brief C custom defined intrinisic function for only M0 processors
emilmont 1:fdd22bb7aa52 684 */
mbed_official 3:7a284390b0ce 685 #if defined(ARM_MATH_CM0_FAMILY)
mbed_official 3:7a284390b0ce 686
mbed_official 3:7a284390b0ce 687 static __INLINE q31_t __SSAT(
emilmont 1:fdd22bb7aa52 688 q31_t x,
emilmont 1:fdd22bb7aa52 689 uint32_t y)
emilmont 1:fdd22bb7aa52 690 {
emilmont 1:fdd22bb7aa52 691 int32_t posMax, negMin;
emilmont 1:fdd22bb7aa52 692 uint32_t i;
emilmont 1:fdd22bb7aa52 693
emilmont 1:fdd22bb7aa52 694 posMax = 1;
emilmont 1:fdd22bb7aa52 695 for (i = 0; i < (y - 1); i++)
emilmont 1:fdd22bb7aa52 696 {
emilmont 1:fdd22bb7aa52 697 posMax = posMax * 2;
emilmont 1:fdd22bb7aa52 698 }
emilmont 1:fdd22bb7aa52 699
emilmont 1:fdd22bb7aa52 700 if(x > 0)
emilmont 1:fdd22bb7aa52 701 {
emilmont 1:fdd22bb7aa52 702 posMax = (posMax - 1);
emilmont 1:fdd22bb7aa52 703
emilmont 1:fdd22bb7aa52 704 if(x > posMax)
emilmont 1:fdd22bb7aa52 705 {
emilmont 1:fdd22bb7aa52 706 x = posMax;
emilmont 1:fdd22bb7aa52 707 }
emilmont 1:fdd22bb7aa52 708 }
emilmont 1:fdd22bb7aa52 709 else
emilmont 1:fdd22bb7aa52 710 {
emilmont 1:fdd22bb7aa52 711 negMin = -posMax;
emilmont 1:fdd22bb7aa52 712
emilmont 1:fdd22bb7aa52 713 if(x < negMin)
emilmont 1:fdd22bb7aa52 714 {
emilmont 1:fdd22bb7aa52 715 x = negMin;
emilmont 1:fdd22bb7aa52 716 }
emilmont 1:fdd22bb7aa52 717 }
emilmont 1:fdd22bb7aa52 718 return (x);
emilmont 1:fdd22bb7aa52 719
emilmont 1:fdd22bb7aa52 720
emilmont 1:fdd22bb7aa52 721 }
emilmont 1:fdd22bb7aa52 722
mbed_official 3:7a284390b0ce 723 #endif /* end of ARM_MATH_CM0_FAMILY */
emilmont 1:fdd22bb7aa52 724
emilmont 1:fdd22bb7aa52 725
emilmont 1:fdd22bb7aa52 726
emilmont 1:fdd22bb7aa52 727 /*
emilmont 1:fdd22bb7aa52 728 * @brief C custom defined intrinsic function for M3 and M0 processors
emilmont 1:fdd22bb7aa52 729 */
mbed_official 3:7a284390b0ce 730 #if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY)
emilmont 1:fdd22bb7aa52 731
emilmont 1:fdd22bb7aa52 732 /*
emilmont 1:fdd22bb7aa52 733 * @brief C custom defined QADD8 for M3 and M0 processors
emilmont 1:fdd22bb7aa52 734 */
mbed_official 3:7a284390b0ce 735 static __INLINE q31_t __QADD8(
emilmont 1:fdd22bb7aa52 736 q31_t x,
emilmont 1:fdd22bb7aa52 737 q31_t y)
emilmont 1:fdd22bb7aa52 738 {
emilmont 1:fdd22bb7aa52 739
emilmont 1:fdd22bb7aa52 740 q31_t sum;
emilmont 1:fdd22bb7aa52 741 q7_t r, s, t, u;
emilmont 1:fdd22bb7aa52 742
emilmont 1:fdd22bb7aa52 743 r = (q7_t) x;
emilmont 1:fdd22bb7aa52 744 s = (q7_t) y;
emilmont 1:fdd22bb7aa52 745
emilmont 1:fdd22bb7aa52 746 r = __SSAT((q31_t) (r + s), 8);
emilmont 1:fdd22bb7aa52 747 s = __SSAT(((q31_t) (((x << 16) >> 24) + ((y << 16) >> 24))), 8);
emilmont 1:fdd22bb7aa52 748 t = __SSAT(((q31_t) (((x << 8) >> 24) + ((y << 8) >> 24))), 8);
emilmont 1:fdd22bb7aa52 749 u = __SSAT(((q31_t) ((x >> 24) + (y >> 24))), 8);
emilmont 1:fdd22bb7aa52 750
emilmont 1:fdd22bb7aa52 751 sum =
emilmont 1:fdd22bb7aa52 752 (((q31_t) u << 24) & 0xFF000000) | (((q31_t) t << 16) & 0x00FF0000) |
emilmont 1:fdd22bb7aa52 753 (((q31_t) s << 8) & 0x0000FF00) | (r & 0x000000FF);
emilmont 1:fdd22bb7aa52 754
emilmont 1:fdd22bb7aa52 755 return sum;
emilmont 1:fdd22bb7aa52 756
emilmont 1:fdd22bb7aa52 757 }
emilmont 1:fdd22bb7aa52 758
emilmont 1:fdd22bb7aa52 759 /*
emilmont 1:fdd22bb7aa52 760 * @brief C custom defined QSUB8 for M3 and M0 processors
emilmont 1:fdd22bb7aa52 761 */
mbed_official 3:7a284390b0ce 762 static __INLINE q31_t __QSUB8(
emilmont 1:fdd22bb7aa52 763 q31_t x,
emilmont 1:fdd22bb7aa52 764 q31_t y)
emilmont 1:fdd22bb7aa52 765 {
emilmont 1:fdd22bb7aa52 766
emilmont 1:fdd22bb7aa52 767 q31_t sum;
emilmont 1:fdd22bb7aa52 768 q31_t r, s, t, u;
emilmont 1:fdd22bb7aa52 769
emilmont 1:fdd22bb7aa52 770 r = (q7_t) x;
emilmont 1:fdd22bb7aa52 771 s = (q7_t) y;
emilmont 1:fdd22bb7aa52 772
emilmont 1:fdd22bb7aa52 773 r = __SSAT((r - s), 8);
emilmont 1:fdd22bb7aa52 774 s = __SSAT(((q31_t) (((x << 16) >> 24) - ((y << 16) >> 24))), 8) << 8;
emilmont 1:fdd22bb7aa52 775 t = __SSAT(((q31_t) (((x << 8) >> 24) - ((y << 8) >> 24))), 8) << 16;
emilmont 1:fdd22bb7aa52 776 u = __SSAT(((q31_t) ((x >> 24) - (y >> 24))), 8) << 24;
emilmont 1:fdd22bb7aa52 777
emilmont 1:fdd22bb7aa52 778 sum =
emilmont 1:fdd22bb7aa52 779 (u & 0xFF000000) | (t & 0x00FF0000) | (s & 0x0000FF00) | (r &
emilmont 1:fdd22bb7aa52 780 0x000000FF);
emilmont 1:fdd22bb7aa52 781
emilmont 1:fdd22bb7aa52 782 return sum;
emilmont 1:fdd22bb7aa52 783 }
emilmont 1:fdd22bb7aa52 784
emilmont 1:fdd22bb7aa52 785 /*
emilmont 1:fdd22bb7aa52 786 * @brief C custom defined QADD16 for M3 and M0 processors
emilmont 1:fdd22bb7aa52 787 */
emilmont 1:fdd22bb7aa52 788
emilmont 1:fdd22bb7aa52 789 /*
emilmont 1:fdd22bb7aa52 790 * @brief C custom defined QADD16 for M3 and M0 processors
emilmont 1:fdd22bb7aa52 791 */
mbed_official 3:7a284390b0ce 792 static __INLINE q31_t __QADD16(
emilmont 1:fdd22bb7aa52 793 q31_t x,
emilmont 1:fdd22bb7aa52 794 q31_t y)
emilmont 1:fdd22bb7aa52 795 {
emilmont 1:fdd22bb7aa52 796
emilmont 1:fdd22bb7aa52 797 q31_t sum;
emilmont 1:fdd22bb7aa52 798 q31_t r, s;
emilmont 1:fdd22bb7aa52 799
1050186 5:a912b042151f 800 r = (q15_t) x;
1050186 5:a912b042151f 801 s = (q15_t) y;
emilmont 1:fdd22bb7aa52 802
emilmont 1:fdd22bb7aa52 803 r = __SSAT(r + s, 16);
emilmont 1:fdd22bb7aa52 804 s = __SSAT(((q31_t) ((x >> 16) + (y >> 16))), 16) << 16;
emilmont 1:fdd22bb7aa52 805
emilmont 1:fdd22bb7aa52 806 sum = (s & 0xFFFF0000) | (r & 0x0000FFFF);
emilmont 1:fdd22bb7aa52 807
emilmont 1:fdd22bb7aa52 808 return sum;
emilmont 1:fdd22bb7aa52 809
emilmont 1:fdd22bb7aa52 810 }
emilmont 1:fdd22bb7aa52 811
emilmont 1:fdd22bb7aa52 812 /*
emilmont 1:fdd22bb7aa52 813 * @brief C custom defined SHADD16 for M3 and M0 processors
emilmont 1:fdd22bb7aa52 814 */
mbed_official 3:7a284390b0ce 815 static __INLINE q31_t __SHADD16(
emilmont 1:fdd22bb7aa52 816 q31_t x,
emilmont 1:fdd22bb7aa52 817 q31_t y)
emilmont 1:fdd22bb7aa52 818 {
emilmont 1:fdd22bb7aa52 819
emilmont 1:fdd22bb7aa52 820 q31_t sum;
emilmont 1:fdd22bb7aa52 821 q31_t r, s;
emilmont 1:fdd22bb7aa52 822
1050186 5:a912b042151f 823 r = (q15_t) x;
1050186 5:a912b042151f 824 s = (q15_t) y;
emilmont 1:fdd22bb7aa52 825
emilmont 1:fdd22bb7aa52 826 r = ((r >> 1) + (s >> 1));
emilmont 1:fdd22bb7aa52 827 s = ((q31_t) ((x >> 17) + (y >> 17))) << 16;
emilmont 1:fdd22bb7aa52 828
emilmont 1:fdd22bb7aa52 829 sum = (s & 0xFFFF0000) | (r & 0x0000FFFF);
emilmont 1:fdd22bb7aa52 830
emilmont 1:fdd22bb7aa52 831 return sum;
emilmont 1:fdd22bb7aa52 832
emilmont 1:fdd22bb7aa52 833 }
emilmont 1:fdd22bb7aa52 834
emilmont 1:fdd22bb7aa52 835 /*
emilmont 1:fdd22bb7aa52 836 * @brief C custom defined QSUB16 for M3 and M0 processors
emilmont 1:fdd22bb7aa52 837 */
mbed_official 3:7a284390b0ce 838 static __INLINE q31_t __QSUB16(
emilmont 1:fdd22bb7aa52 839 q31_t x,
emilmont 1:fdd22bb7aa52 840 q31_t y)
emilmont 1:fdd22bb7aa52 841 {
emilmont 1:fdd22bb7aa52 842
emilmont 1:fdd22bb7aa52 843 q31_t sum;
emilmont 1:fdd22bb7aa52 844 q31_t r, s;
emilmont 1:fdd22bb7aa52 845
1050186 5:a912b042151f 846 r = (q15_t) x;
1050186 5:a912b042151f 847 s = (q15_t) y;
emilmont 1:fdd22bb7aa52 848
emilmont 1:fdd22bb7aa52 849 r = __SSAT(r - s, 16);
emilmont 1:fdd22bb7aa52 850 s = __SSAT(((q31_t) ((x >> 16) - (y >> 16))), 16) << 16;
emilmont 1:fdd22bb7aa52 851
emilmont 1:fdd22bb7aa52 852 sum = (s & 0xFFFF0000) | (r & 0x0000FFFF);
emilmont 1:fdd22bb7aa52 853
emilmont 1:fdd22bb7aa52 854 return sum;
emilmont 1:fdd22bb7aa52 855 }
emilmont 1:fdd22bb7aa52 856
emilmont 1:fdd22bb7aa52 857 /*
emilmont 1:fdd22bb7aa52 858 * @brief C custom defined SHSUB16 for M3 and M0 processors
emilmont 1:fdd22bb7aa52 859 */
mbed_official 3:7a284390b0ce 860 static __INLINE q31_t __SHSUB16(
emilmont 1:fdd22bb7aa52 861 q31_t x,
emilmont 1:fdd22bb7aa52 862 q31_t y)
emilmont 1:fdd22bb7aa52 863 {
emilmont 1:fdd22bb7aa52 864
emilmont 1:fdd22bb7aa52 865 q31_t diff;
emilmont 1:fdd22bb7aa52 866 q31_t r, s;
emilmont 1:fdd22bb7aa52 867
1050186 5:a912b042151f 868 r = (q15_t) x;
1050186 5:a912b042151f 869 s = (q15_t) y;
emilmont 1:fdd22bb7aa52 870
emilmont 1:fdd22bb7aa52 871 r = ((r >> 1) - (s >> 1));
emilmont 1:fdd22bb7aa52 872 s = (((x >> 17) - (y >> 17)) << 16);
emilmont 1:fdd22bb7aa52 873
emilmont 1:fdd22bb7aa52 874 diff = (s & 0xFFFF0000) | (r & 0x0000FFFF);
emilmont 1:fdd22bb7aa52 875
emilmont 1:fdd22bb7aa52 876 return diff;
emilmont 1:fdd22bb7aa52 877 }
emilmont 1:fdd22bb7aa52 878
emilmont 1:fdd22bb7aa52 879 /*
emilmont 1:fdd22bb7aa52 880 * @brief C custom defined QASX for M3 and M0 processors
emilmont 1:fdd22bb7aa52 881 */
mbed_official 3:7a284390b0ce 882 static __INLINE q31_t __QASX(
emilmont 1:fdd22bb7aa52 883 q31_t x,
emilmont 1:fdd22bb7aa52 884 q31_t y)
emilmont 1:fdd22bb7aa52 885 {
emilmont 1:fdd22bb7aa52 886
emilmont 1:fdd22bb7aa52 887 q31_t sum = 0;
emilmont 1:fdd22bb7aa52 888
emilmont 1:fdd22bb7aa52 889 sum =
emilmont 1:fdd22bb7aa52 890 ((sum +
1050186 5:a912b042151f 891 clip_q31_to_q15((q31_t) ((q15_t) (x >> 16) + (q15_t) y))) << 16) +
1050186 5:a912b042151f 892 clip_q31_to_q15((q31_t) ((q15_t) x - (q15_t) (y >> 16)));
emilmont 1:fdd22bb7aa52 893
emilmont 1:fdd22bb7aa52 894 return sum;
emilmont 1:fdd22bb7aa52 895 }
emilmont 1:fdd22bb7aa52 896
emilmont 1:fdd22bb7aa52 897 /*
emilmont 1:fdd22bb7aa52 898 * @brief C custom defined SHASX for M3 and M0 processors
emilmont 1:fdd22bb7aa52 899 */
mbed_official 3:7a284390b0ce 900 static __INLINE q31_t __SHASX(
emilmont 1:fdd22bb7aa52 901 q31_t x,
emilmont 1:fdd22bb7aa52 902 q31_t y)
emilmont 1:fdd22bb7aa52 903 {
emilmont 1:fdd22bb7aa52 904
emilmont 1:fdd22bb7aa52 905 q31_t sum;
emilmont 1:fdd22bb7aa52 906 q31_t r, s;
emilmont 1:fdd22bb7aa52 907
1050186 5:a912b042151f 908 r = (q15_t) x;
1050186 5:a912b042151f 909 s = (q15_t) y;
emilmont 1:fdd22bb7aa52 910
emilmont 1:fdd22bb7aa52 911 r = ((r >> 1) - (y >> 17));
emilmont 1:fdd22bb7aa52 912 s = (((x >> 17) + (s >> 1)) << 16);
emilmont 1:fdd22bb7aa52 913
emilmont 1:fdd22bb7aa52 914 sum = (s & 0xFFFF0000) | (r & 0x0000FFFF);
emilmont 1:fdd22bb7aa52 915
emilmont 1:fdd22bb7aa52 916 return sum;
emilmont 1:fdd22bb7aa52 917 }
emilmont 1:fdd22bb7aa52 918
emilmont 1:fdd22bb7aa52 919
emilmont 1:fdd22bb7aa52 920 /*
emilmont 1:fdd22bb7aa52 921 * @brief C custom defined QSAX for M3 and M0 processors
emilmont 1:fdd22bb7aa52 922 */
mbed_official 3:7a284390b0ce 923 static __INLINE q31_t __QSAX(
emilmont 1:fdd22bb7aa52 924 q31_t x,
emilmont 1:fdd22bb7aa52 925 q31_t y)
emilmont 1:fdd22bb7aa52 926 {
emilmont 1:fdd22bb7aa52 927
emilmont 1:fdd22bb7aa52 928 q31_t sum = 0;
emilmont 1:fdd22bb7aa52 929
emilmont 1:fdd22bb7aa52 930 sum =
emilmont 1:fdd22bb7aa52 931 ((sum +
1050186 5:a912b042151f 932 clip_q31_to_q15((q31_t) ((q15_t) (x >> 16) - (q15_t) y))) << 16) +
1050186 5:a912b042151f 933 clip_q31_to_q15((q31_t) ((q15_t) x + (q15_t) (y >> 16)));
emilmont 1:fdd22bb7aa52 934
emilmont 1:fdd22bb7aa52 935 return sum;
emilmont 1:fdd22bb7aa52 936 }
emilmont 1:fdd22bb7aa52 937
emilmont 1:fdd22bb7aa52 938 /*
emilmont 1:fdd22bb7aa52 939 * @brief C custom defined SHSAX for M3 and M0 processors
emilmont 1:fdd22bb7aa52 940 */
mbed_official 3:7a284390b0ce 941 static __INLINE q31_t __SHSAX(
emilmont 1:fdd22bb7aa52 942 q31_t x,
emilmont 1:fdd22bb7aa52 943 q31_t y)
emilmont 1:fdd22bb7aa52 944 {
emilmont 1:fdd22bb7aa52 945
emilmont 1:fdd22bb7aa52 946 q31_t sum;
emilmont 1:fdd22bb7aa52 947 q31_t r, s;
emilmont 1:fdd22bb7aa52 948
1050186 5:a912b042151f 949 r = (q15_t) x;
1050186 5:a912b042151f 950 s = (q15_t) y;
emilmont 1:fdd22bb7aa52 951
emilmont 1:fdd22bb7aa52 952 r = ((r >> 1) + (y >> 17));
emilmont 1:fdd22bb7aa52 953 s = (((x >> 17) - (s >> 1)) << 16);
emilmont 1:fdd22bb7aa52 954
emilmont 1:fdd22bb7aa52 955 sum = (s & 0xFFFF0000) | (r & 0x0000FFFF);
emilmont 1:fdd22bb7aa52 956
emilmont 1:fdd22bb7aa52 957 return sum;
emilmont 1:fdd22bb7aa52 958 }
emilmont 1:fdd22bb7aa52 959
emilmont 1:fdd22bb7aa52 960 /*
emilmont 1:fdd22bb7aa52 961 * @brief C custom defined SMUSDX for M3 and M0 processors
emilmont 1:fdd22bb7aa52 962 */
mbed_official 3:7a284390b0ce 963 static __INLINE q31_t __SMUSDX(
emilmont 1:fdd22bb7aa52 964 q31_t x,
emilmont 1:fdd22bb7aa52 965 q31_t y)
emilmont 1:fdd22bb7aa52 966 {
emilmont 1:fdd22bb7aa52 967
1050186 5:a912b042151f 968 return ((q31_t) (((q15_t) x * (q15_t) (y >> 16)) -
1050186 5:a912b042151f 969 ((q15_t) (x >> 16) * (q15_t) y)));
emilmont 1:fdd22bb7aa52 970 }
emilmont 1:fdd22bb7aa52 971
emilmont 1:fdd22bb7aa52 972 /*
emilmont 1:fdd22bb7aa52 973 * @brief C custom defined SMUADX for M3 and M0 processors
emilmont 1:fdd22bb7aa52 974 */
mbed_official 3:7a284390b0ce 975 static __INLINE q31_t __SMUADX(
emilmont 1:fdd22bb7aa52 976 q31_t x,
emilmont 1:fdd22bb7aa52 977 q31_t y)
emilmont 1:fdd22bb7aa52 978 {
emilmont 1:fdd22bb7aa52 979
1050186 5:a912b042151f 980 return ((q31_t) (((q15_t) x * (q15_t) (y >> 16)) +
1050186 5:a912b042151f 981 ((q15_t) (x >> 16) * (q15_t) y)));
emilmont 1:fdd22bb7aa52 982 }
emilmont 1:fdd22bb7aa52 983
emilmont 1:fdd22bb7aa52 984 /*
emilmont 1:fdd22bb7aa52 985 * @brief C custom defined QADD for M3 and M0 processors
emilmont 1:fdd22bb7aa52 986 */
mbed_official 3:7a284390b0ce 987 static __INLINE q31_t __QADD(
emilmont 1:fdd22bb7aa52 988 q31_t x,
emilmont 1:fdd22bb7aa52 989 q31_t y)
emilmont 1:fdd22bb7aa52 990 {
emilmont 1:fdd22bb7aa52 991 return clip_q63_to_q31((q63_t) x + y);
emilmont 1:fdd22bb7aa52 992 }
emilmont 1:fdd22bb7aa52 993
emilmont 1:fdd22bb7aa52 994 /*
emilmont 1:fdd22bb7aa52 995 * @brief C custom defined QSUB for M3 and M0 processors
emilmont 1:fdd22bb7aa52 996 */
mbed_official 3:7a284390b0ce 997 static __INLINE q31_t __QSUB(
emilmont 1:fdd22bb7aa52 998 q31_t x,
emilmont 1:fdd22bb7aa52 999 q31_t y)
emilmont 1:fdd22bb7aa52 1000 {
emilmont 1:fdd22bb7aa52 1001 return clip_q63_to_q31((q63_t) x - y);
emilmont 1:fdd22bb7aa52 1002 }
emilmont 1:fdd22bb7aa52 1003
emilmont 1:fdd22bb7aa52 1004 /*
emilmont 1:fdd22bb7aa52 1005 * @brief C custom defined SMLAD for M3 and M0 processors
emilmont 1:fdd22bb7aa52 1006 */
mbed_official 3:7a284390b0ce 1007 static __INLINE q31_t __SMLAD(
emilmont 1:fdd22bb7aa52 1008 q31_t x,
emilmont 1:fdd22bb7aa52 1009 q31_t y,
emilmont 1:fdd22bb7aa52 1010 q31_t sum)
emilmont 1:fdd22bb7aa52 1011 {
emilmont 1:fdd22bb7aa52 1012
1050186 5:a912b042151f 1013 return (sum + ((q15_t) (x >> 16) * (q15_t) (y >> 16)) +
1050186 5:a912b042151f 1014 ((q15_t) x * (q15_t) y));
emilmont 1:fdd22bb7aa52 1015 }
emilmont 1:fdd22bb7aa52 1016
emilmont 1:fdd22bb7aa52 1017 /*
emilmont 1:fdd22bb7aa52 1018 * @brief C custom defined SMLADX for M3 and M0 processors
emilmont 1:fdd22bb7aa52 1019 */
mbed_official 3:7a284390b0ce 1020 static __INLINE q31_t __SMLADX(
emilmont 1:fdd22bb7aa52 1021 q31_t x,
emilmont 1:fdd22bb7aa52 1022 q31_t y,
emilmont 1:fdd22bb7aa52 1023 q31_t sum)
emilmont 1:fdd22bb7aa52 1024 {
emilmont 1:fdd22bb7aa52 1025
1050186 5:a912b042151f 1026 return (sum + ((q15_t) (x >> 16) * (q15_t) (y)) +
1050186 5:a912b042151f 1027 ((q15_t) x * (q15_t) (y >> 16)));
emilmont 1:fdd22bb7aa52 1028 }
emilmont 1:fdd22bb7aa52 1029
emilmont 1:fdd22bb7aa52 1030 /*
emilmont 1:fdd22bb7aa52 1031 * @brief C custom defined SMLSDX for M3 and M0 processors
emilmont 1:fdd22bb7aa52 1032 */
mbed_official 3:7a284390b0ce 1033 static __INLINE q31_t __SMLSDX(
emilmont 1:fdd22bb7aa52 1034 q31_t x,
emilmont 1:fdd22bb7aa52 1035 q31_t y,
emilmont 1:fdd22bb7aa52 1036 q31_t sum)
emilmont 1:fdd22bb7aa52 1037 {
emilmont 1:fdd22bb7aa52 1038
1050186 5:a912b042151f 1039 return (sum - ((q15_t) (x >> 16) * (q15_t) (y)) +
1050186 5:a912b042151f 1040 ((q15_t) x * (q15_t) (y >> 16)));
emilmont 1:fdd22bb7aa52 1041 }
emilmont 1:fdd22bb7aa52 1042
emilmont 1:fdd22bb7aa52 1043 /*
emilmont 1:fdd22bb7aa52 1044 * @brief C custom defined SMLALD for M3 and M0 processors
emilmont 1:fdd22bb7aa52 1045 */
mbed_official 3:7a284390b0ce 1046 static __INLINE q63_t __SMLALD(
emilmont 1:fdd22bb7aa52 1047 q31_t x,
emilmont 1:fdd22bb7aa52 1048 q31_t y,
emilmont 1:fdd22bb7aa52 1049 q63_t sum)
emilmont 1:fdd22bb7aa52 1050 {
emilmont 1:fdd22bb7aa52 1051
1050186 5:a912b042151f 1052 return (sum + ((q15_t) (x >> 16) * (q15_t) (y >> 16)) +
1050186 5:a912b042151f 1053 ((q15_t) x * (q15_t) y));
emilmont 1:fdd22bb7aa52 1054 }
emilmont 1:fdd22bb7aa52 1055
emilmont 1:fdd22bb7aa52 1056 /*
emilmont 1:fdd22bb7aa52 1057 * @brief C custom defined SMLALDX for M3 and M0 processors
emilmont 1:fdd22bb7aa52 1058 */
mbed_official 3:7a284390b0ce 1059 static __INLINE q63_t __SMLALDX(
emilmont 1:fdd22bb7aa52 1060 q31_t x,
emilmont 1:fdd22bb7aa52 1061 q31_t y,
emilmont 1:fdd22bb7aa52 1062 q63_t sum)
emilmont 1:fdd22bb7aa52 1063 {
emilmont 1:fdd22bb7aa52 1064
1050186 5:a912b042151f 1065 return (sum + ((q15_t) (x >> 16) * (q15_t) y)) +
1050186 5:a912b042151f 1066 ((q15_t) x * (q15_t) (y >> 16));
emilmont 1:fdd22bb7aa52 1067 }
emilmont 1:fdd22bb7aa52 1068
emilmont 1:fdd22bb7aa52 1069 /*
emilmont 1:fdd22bb7aa52 1070 * @brief C custom defined SMUAD for M3 and M0 processors
emilmont 1:fdd22bb7aa52 1071 */
mbed_official 3:7a284390b0ce 1072 static __INLINE q31_t __SMUAD(
emilmont 1:fdd22bb7aa52 1073 q31_t x,
emilmont 1:fdd22bb7aa52 1074 q31_t y)
emilmont 1:fdd22bb7aa52 1075 {
emilmont 1:fdd22bb7aa52 1076
emilmont 1:fdd22bb7aa52 1077 return (((x >> 16) * (y >> 16)) +
emilmont 1:fdd22bb7aa52 1078 (((x << 16) >> 16) * ((y << 16) >> 16)));
emilmont 1:fdd22bb7aa52 1079 }
emilmont 1:fdd22bb7aa52 1080
emilmont 1:fdd22bb7aa52 1081 /*
emilmont 1:fdd22bb7aa52 1082 * @brief C custom defined SMUSD for M3 and M0 processors
emilmont 1:fdd22bb7aa52 1083 */
mbed_official 3:7a284390b0ce 1084 static __INLINE q31_t __SMUSD(
emilmont 1:fdd22bb7aa52 1085 q31_t x,
emilmont 1:fdd22bb7aa52 1086 q31_t y)
emilmont 1:fdd22bb7aa52 1087 {
emilmont 1:fdd22bb7aa52 1088
emilmont 1:fdd22bb7aa52 1089 return (-((x >> 16) * (y >> 16)) +
emilmont 1:fdd22bb7aa52 1090 (((x << 16) >> 16) * ((y << 16) >> 16)));
emilmont 1:fdd22bb7aa52 1091 }
emilmont 1:fdd22bb7aa52 1092
emilmont 1:fdd22bb7aa52 1093
emilmont 1:fdd22bb7aa52 1094 /*
emilmont 1:fdd22bb7aa52 1095 * @brief C custom defined SXTB16 for M3 and M0 processors
emilmont 1:fdd22bb7aa52 1096 */
mbed_official 3:7a284390b0ce 1097 static __INLINE q31_t __SXTB16(
emilmont 1:fdd22bb7aa52 1098 q31_t x)
emilmont 1:fdd22bb7aa52 1099 {
emilmont 1:fdd22bb7aa52 1100
emilmont 1:fdd22bb7aa52 1101 return ((((x << 24) >> 24) & 0x0000FFFF) |
emilmont 1:fdd22bb7aa52 1102 (((x << 8) >> 8) & 0xFFFF0000));
emilmont 1:fdd22bb7aa52 1103 }
emilmont 1:fdd22bb7aa52 1104
emilmont 1:fdd22bb7aa52 1105
mbed_official 3:7a284390b0ce 1106 #endif /* defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY) */
emilmont 1:fdd22bb7aa52 1107
emilmont 1:fdd22bb7aa52 1108
emilmont 1:fdd22bb7aa52 1109 /**
emilmont 1:fdd22bb7aa52 1110 * @brief Instance structure for the Q7 FIR filter.
emilmont 1:fdd22bb7aa52 1111 */
emilmont 1:fdd22bb7aa52 1112 typedef struct
emilmont 1:fdd22bb7aa52 1113 {
emilmont 1:fdd22bb7aa52 1114 uint16_t numTaps; /**< number of filter coefficients in the filter. */
emilmont 1:fdd22bb7aa52 1115 q7_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */
emilmont 1:fdd22bb7aa52 1116 q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/
emilmont 1:fdd22bb7aa52 1117 } arm_fir_instance_q7;
emilmont 1:fdd22bb7aa52 1118
emilmont 1:fdd22bb7aa52 1119 /**
emilmont 1:fdd22bb7aa52 1120 * @brief Instance structure for the Q15 FIR filter.
emilmont 1:fdd22bb7aa52 1121 */
emilmont 1:fdd22bb7aa52 1122 typedef struct
emilmont 1:fdd22bb7aa52 1123 {
emilmont 1:fdd22bb7aa52 1124 uint16_t numTaps; /**< number of filter coefficients in the filter. */
emilmont 1:fdd22bb7aa52 1125 q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */
emilmont 1:fdd22bb7aa52 1126 q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/
emilmont 1:fdd22bb7aa52 1127 } arm_fir_instance_q15;
emilmont 1:fdd22bb7aa52 1128
emilmont 1:fdd22bb7aa52 1129 /**
emilmont 1:fdd22bb7aa52 1130 * @brief Instance structure for the Q31 FIR filter.
emilmont 1:fdd22bb7aa52 1131 */
emilmont 1:fdd22bb7aa52 1132 typedef struct
emilmont 1:fdd22bb7aa52 1133 {
emilmont 1:fdd22bb7aa52 1134 uint16_t numTaps; /**< number of filter coefficients in the filter. */
emilmont 1:fdd22bb7aa52 1135 q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */
emilmont 1:fdd22bb7aa52 1136 q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */
emilmont 1:fdd22bb7aa52 1137 } arm_fir_instance_q31;
emilmont 1:fdd22bb7aa52 1138
emilmont 1:fdd22bb7aa52 1139 /**
emilmont 1:fdd22bb7aa52 1140 * @brief Instance structure for the floating-point FIR filter.
emilmont 1:fdd22bb7aa52 1141 */
emilmont 1:fdd22bb7aa52 1142 typedef struct
emilmont 1:fdd22bb7aa52 1143 {
emilmont 1:fdd22bb7aa52 1144 uint16_t numTaps; /**< number of filter coefficients in the filter. */
emilmont 1:fdd22bb7aa52 1145 float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */
emilmont 1:fdd22bb7aa52 1146 float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */
emilmont 1:fdd22bb7aa52 1147 } arm_fir_instance_f32;
emilmont 1:fdd22bb7aa52 1148
emilmont 1:fdd22bb7aa52 1149
emilmont 1:fdd22bb7aa52 1150 /**
emilmont 1:fdd22bb7aa52 1151 * @brief Processing function for the Q7 FIR filter.
emilmont 1:fdd22bb7aa52 1152 * @param[in] *S points to an instance of the Q7 FIR filter structure.
emilmont 1:fdd22bb7aa52 1153 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 1154 * @param[out] *pDst points to the block of output data.
emilmont 1:fdd22bb7aa52 1155 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 1156 * @return none.
emilmont 1:fdd22bb7aa52 1157 */
emilmont 1:fdd22bb7aa52 1158 void arm_fir_q7(
emilmont 1:fdd22bb7aa52 1159 const arm_fir_instance_q7 * S,
emilmont 1:fdd22bb7aa52 1160 q7_t * pSrc,
emilmont 1:fdd22bb7aa52 1161 q7_t * pDst,
emilmont 1:fdd22bb7aa52 1162 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1163
emilmont 1:fdd22bb7aa52 1164
emilmont 1:fdd22bb7aa52 1165 /**
emilmont 1:fdd22bb7aa52 1166 * @brief Initialization function for the Q7 FIR filter.
emilmont 1:fdd22bb7aa52 1167 * @param[in,out] *S points to an instance of the Q7 FIR structure.
emilmont 1:fdd22bb7aa52 1168 * @param[in] numTaps Number of filter coefficients in the filter.
emilmont 1:fdd22bb7aa52 1169 * @param[in] *pCoeffs points to the filter coefficients.
emilmont 1:fdd22bb7aa52 1170 * @param[in] *pState points to the state buffer.
emilmont 1:fdd22bb7aa52 1171 * @param[in] blockSize number of samples that are processed.
emilmont 1:fdd22bb7aa52 1172 * @return none
emilmont 1:fdd22bb7aa52 1173 */
emilmont 1:fdd22bb7aa52 1174 void arm_fir_init_q7(
emilmont 1:fdd22bb7aa52 1175 arm_fir_instance_q7 * S,
emilmont 1:fdd22bb7aa52 1176 uint16_t numTaps,
emilmont 1:fdd22bb7aa52 1177 q7_t * pCoeffs,
emilmont 1:fdd22bb7aa52 1178 q7_t * pState,
emilmont 1:fdd22bb7aa52 1179 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1180
emilmont 1:fdd22bb7aa52 1181
emilmont 1:fdd22bb7aa52 1182 /**
emilmont 1:fdd22bb7aa52 1183 * @brief Processing function for the Q15 FIR filter.
emilmont 1:fdd22bb7aa52 1184 * @param[in] *S points to an instance of the Q15 FIR structure.
emilmont 1:fdd22bb7aa52 1185 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 1186 * @param[out] *pDst points to the block of output data.
emilmont 1:fdd22bb7aa52 1187 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 1188 * @return none.
emilmont 1:fdd22bb7aa52 1189 */
emilmont 1:fdd22bb7aa52 1190 void arm_fir_q15(
emilmont 1:fdd22bb7aa52 1191 const arm_fir_instance_q15 * S,
emilmont 1:fdd22bb7aa52 1192 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 1193 q15_t * pDst,
emilmont 1:fdd22bb7aa52 1194 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1195
emilmont 1:fdd22bb7aa52 1196 /**
emilmont 1:fdd22bb7aa52 1197 * @brief Processing function for the fast Q15 FIR filter for Cortex-M3 and Cortex-M4.
emilmont 1:fdd22bb7aa52 1198 * @param[in] *S points to an instance of the Q15 FIR filter structure.
emilmont 1:fdd22bb7aa52 1199 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 1200 * @param[out] *pDst points to the block of output data.
emilmont 1:fdd22bb7aa52 1201 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 1202 * @return none.
emilmont 1:fdd22bb7aa52 1203 */
emilmont 1:fdd22bb7aa52 1204 void arm_fir_fast_q15(
emilmont 1:fdd22bb7aa52 1205 const arm_fir_instance_q15 * S,
emilmont 1:fdd22bb7aa52 1206 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 1207 q15_t * pDst,
emilmont 1:fdd22bb7aa52 1208 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1209
emilmont 1:fdd22bb7aa52 1210 /**
emilmont 1:fdd22bb7aa52 1211 * @brief Initialization function for the Q15 FIR filter.
emilmont 1:fdd22bb7aa52 1212 * @param[in,out] *S points to an instance of the Q15 FIR filter structure.
emilmont 1:fdd22bb7aa52 1213 * @param[in] numTaps Number of filter coefficients in the filter. Must be even and greater than or equal to 4.
emilmont 1:fdd22bb7aa52 1214 * @param[in] *pCoeffs points to the filter coefficients.
emilmont 1:fdd22bb7aa52 1215 * @param[in] *pState points to the state buffer.
emilmont 1:fdd22bb7aa52 1216 * @param[in] blockSize number of samples that are processed at a time.
emilmont 1:fdd22bb7aa52 1217 * @return The function returns ARM_MATH_SUCCESS if initialization was successful or ARM_MATH_ARGUMENT_ERROR if
emilmont 1:fdd22bb7aa52 1218 * <code>numTaps</code> is not a supported value.
emilmont 1:fdd22bb7aa52 1219 */
emilmont 1:fdd22bb7aa52 1220
emilmont 1:fdd22bb7aa52 1221 arm_status arm_fir_init_q15(
emilmont 1:fdd22bb7aa52 1222 arm_fir_instance_q15 * S,
emilmont 1:fdd22bb7aa52 1223 uint16_t numTaps,
emilmont 1:fdd22bb7aa52 1224 q15_t * pCoeffs,
emilmont 1:fdd22bb7aa52 1225 q15_t * pState,
emilmont 1:fdd22bb7aa52 1226 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1227
emilmont 1:fdd22bb7aa52 1228 /**
emilmont 1:fdd22bb7aa52 1229 * @brief Processing function for the Q31 FIR filter.
emilmont 1:fdd22bb7aa52 1230 * @param[in] *S points to an instance of the Q31 FIR filter structure.
emilmont 1:fdd22bb7aa52 1231 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 1232 * @param[out] *pDst points to the block of output data.
emilmont 1:fdd22bb7aa52 1233 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 1234 * @return none.
emilmont 1:fdd22bb7aa52 1235 */
emilmont 1:fdd22bb7aa52 1236 void arm_fir_q31(
emilmont 1:fdd22bb7aa52 1237 const arm_fir_instance_q31 * S,
emilmont 1:fdd22bb7aa52 1238 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 1239 q31_t * pDst,
emilmont 1:fdd22bb7aa52 1240 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1241
emilmont 1:fdd22bb7aa52 1242 /**
emilmont 1:fdd22bb7aa52 1243 * @brief Processing function for the fast Q31 FIR filter for Cortex-M3 and Cortex-M4.
emilmont 1:fdd22bb7aa52 1244 * @param[in] *S points to an instance of the Q31 FIR structure.
emilmont 1:fdd22bb7aa52 1245 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 1246 * @param[out] *pDst points to the block of output data.
emilmont 1:fdd22bb7aa52 1247 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 1248 * @return none.
emilmont 1:fdd22bb7aa52 1249 */
emilmont 1:fdd22bb7aa52 1250 void arm_fir_fast_q31(
emilmont 1:fdd22bb7aa52 1251 const arm_fir_instance_q31 * S,
emilmont 1:fdd22bb7aa52 1252 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 1253 q31_t * pDst,
emilmont 1:fdd22bb7aa52 1254 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1255
emilmont 1:fdd22bb7aa52 1256 /**
emilmont 1:fdd22bb7aa52 1257 * @brief Initialization function for the Q31 FIR filter.
emilmont 1:fdd22bb7aa52 1258 * @param[in,out] *S points to an instance of the Q31 FIR structure.
emilmont 2:da51fb522205 1259 * @param[in] numTaps Number of filter coefficients in the filter.
emilmont 2:da51fb522205 1260 * @param[in] *pCoeffs points to the filter coefficients.
emilmont 2:da51fb522205 1261 * @param[in] *pState points to the state buffer.
emilmont 2:da51fb522205 1262 * @param[in] blockSize number of samples that are processed at a time.
emilmont 2:da51fb522205 1263 * @return none.
emilmont 1:fdd22bb7aa52 1264 */
emilmont 1:fdd22bb7aa52 1265 void arm_fir_init_q31(
emilmont 1:fdd22bb7aa52 1266 arm_fir_instance_q31 * S,
emilmont 1:fdd22bb7aa52 1267 uint16_t numTaps,
emilmont 1:fdd22bb7aa52 1268 q31_t * pCoeffs,
emilmont 1:fdd22bb7aa52 1269 q31_t * pState,
emilmont 1:fdd22bb7aa52 1270 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1271
emilmont 1:fdd22bb7aa52 1272 /**
emilmont 1:fdd22bb7aa52 1273 * @brief Processing function for the floating-point FIR filter.
emilmont 1:fdd22bb7aa52 1274 * @param[in] *S points to an instance of the floating-point FIR structure.
emilmont 1:fdd22bb7aa52 1275 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 1276 * @param[out] *pDst points to the block of output data.
emilmont 1:fdd22bb7aa52 1277 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 1278 * @return none.
emilmont 1:fdd22bb7aa52 1279 */
emilmont 1:fdd22bb7aa52 1280 void arm_fir_f32(
emilmont 1:fdd22bb7aa52 1281 const arm_fir_instance_f32 * S,
emilmont 1:fdd22bb7aa52 1282 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 1283 float32_t * pDst,
emilmont 1:fdd22bb7aa52 1284 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1285
emilmont 1:fdd22bb7aa52 1286 /**
emilmont 1:fdd22bb7aa52 1287 * @brief Initialization function for the floating-point FIR filter.
emilmont 1:fdd22bb7aa52 1288 * @param[in,out] *S points to an instance of the floating-point FIR filter structure.
emilmont 2:da51fb522205 1289 * @param[in] numTaps Number of filter coefficients in the filter.
emilmont 2:da51fb522205 1290 * @param[in] *pCoeffs points to the filter coefficients.
emilmont 2:da51fb522205 1291 * @param[in] *pState points to the state buffer.
emilmont 2:da51fb522205 1292 * @param[in] blockSize number of samples that are processed at a time.
emilmont 2:da51fb522205 1293 * @return none.
emilmont 1:fdd22bb7aa52 1294 */
emilmont 1:fdd22bb7aa52 1295 void arm_fir_init_f32(
emilmont 1:fdd22bb7aa52 1296 arm_fir_instance_f32 * S,
emilmont 1:fdd22bb7aa52 1297 uint16_t numTaps,
emilmont 1:fdd22bb7aa52 1298 float32_t * pCoeffs,
emilmont 1:fdd22bb7aa52 1299 float32_t * pState,
emilmont 1:fdd22bb7aa52 1300 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1301
emilmont 1:fdd22bb7aa52 1302
emilmont 1:fdd22bb7aa52 1303 /**
emilmont 1:fdd22bb7aa52 1304 * @brief Instance structure for the Q15 Biquad cascade filter.
emilmont 1:fdd22bb7aa52 1305 */
emilmont 1:fdd22bb7aa52 1306 typedef struct
emilmont 1:fdd22bb7aa52 1307 {
emilmont 1:fdd22bb7aa52 1308 int8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */
emilmont 1:fdd22bb7aa52 1309 q15_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */
emilmont 1:fdd22bb7aa52 1310 q15_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */
emilmont 1:fdd22bb7aa52 1311 int8_t postShift; /**< Additional shift, in bits, applied to each output sample. */
emilmont 1:fdd22bb7aa52 1312
emilmont 1:fdd22bb7aa52 1313 } arm_biquad_casd_df1_inst_q15;
emilmont 1:fdd22bb7aa52 1314
emilmont 1:fdd22bb7aa52 1315
emilmont 1:fdd22bb7aa52 1316 /**
emilmont 1:fdd22bb7aa52 1317 * @brief Instance structure for the Q31 Biquad cascade filter.
emilmont 1:fdd22bb7aa52 1318 */
emilmont 1:fdd22bb7aa52 1319 typedef struct
emilmont 1:fdd22bb7aa52 1320 {
emilmont 1:fdd22bb7aa52 1321 uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */
emilmont 1:fdd22bb7aa52 1322 q31_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */
emilmont 1:fdd22bb7aa52 1323 q31_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */
emilmont 1:fdd22bb7aa52 1324 uint8_t postShift; /**< Additional shift, in bits, applied to each output sample. */
emilmont 1:fdd22bb7aa52 1325
emilmont 1:fdd22bb7aa52 1326 } arm_biquad_casd_df1_inst_q31;
emilmont 1:fdd22bb7aa52 1327
emilmont 1:fdd22bb7aa52 1328 /**
emilmont 1:fdd22bb7aa52 1329 * @brief Instance structure for the floating-point Biquad cascade filter.
emilmont 1:fdd22bb7aa52 1330 */
emilmont 1:fdd22bb7aa52 1331 typedef struct
emilmont 1:fdd22bb7aa52 1332 {
emilmont 1:fdd22bb7aa52 1333 uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */
emilmont 1:fdd22bb7aa52 1334 float32_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */
emilmont 1:fdd22bb7aa52 1335 float32_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */
emilmont 1:fdd22bb7aa52 1336
emilmont 1:fdd22bb7aa52 1337
emilmont 1:fdd22bb7aa52 1338 } arm_biquad_casd_df1_inst_f32;
emilmont 1:fdd22bb7aa52 1339
emilmont 1:fdd22bb7aa52 1340
emilmont 1:fdd22bb7aa52 1341
emilmont 1:fdd22bb7aa52 1342 /**
emilmont 1:fdd22bb7aa52 1343 * @brief Processing function for the Q15 Biquad cascade filter.
emilmont 1:fdd22bb7aa52 1344 * @param[in] *S points to an instance of the Q15 Biquad cascade structure.
emilmont 1:fdd22bb7aa52 1345 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 1346 * @param[out] *pDst points to the block of output data.
emilmont 1:fdd22bb7aa52 1347 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 1348 * @return none.
emilmont 1:fdd22bb7aa52 1349 */
emilmont 1:fdd22bb7aa52 1350
emilmont 1:fdd22bb7aa52 1351 void arm_biquad_cascade_df1_q15(
emilmont 1:fdd22bb7aa52 1352 const arm_biquad_casd_df1_inst_q15 * S,
emilmont 1:fdd22bb7aa52 1353 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 1354 q15_t * pDst,
emilmont 1:fdd22bb7aa52 1355 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1356
emilmont 1:fdd22bb7aa52 1357 /**
emilmont 1:fdd22bb7aa52 1358 * @brief Initialization function for the Q15 Biquad cascade filter.
emilmont 1:fdd22bb7aa52 1359 * @param[in,out] *S points to an instance of the Q15 Biquad cascade structure.
emilmont 1:fdd22bb7aa52 1360 * @param[in] numStages number of 2nd order stages in the filter.
emilmont 1:fdd22bb7aa52 1361 * @param[in] *pCoeffs points to the filter coefficients.
emilmont 1:fdd22bb7aa52 1362 * @param[in] *pState points to the state buffer.
emilmont 1:fdd22bb7aa52 1363 * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format
emilmont 1:fdd22bb7aa52 1364 * @return none
emilmont 1:fdd22bb7aa52 1365 */
emilmont 1:fdd22bb7aa52 1366
emilmont 1:fdd22bb7aa52 1367 void arm_biquad_cascade_df1_init_q15(
emilmont 1:fdd22bb7aa52 1368 arm_biquad_casd_df1_inst_q15 * S,
emilmont 1:fdd22bb7aa52 1369 uint8_t numStages,
emilmont 1:fdd22bb7aa52 1370 q15_t * pCoeffs,
emilmont 1:fdd22bb7aa52 1371 q15_t * pState,
emilmont 1:fdd22bb7aa52 1372 int8_t postShift);
emilmont 1:fdd22bb7aa52 1373
emilmont 1:fdd22bb7aa52 1374
emilmont 1:fdd22bb7aa52 1375 /**
emilmont 1:fdd22bb7aa52 1376 * @brief Fast but less precise processing function for the Q15 Biquad cascade filter for Cortex-M3 and Cortex-M4.
emilmont 1:fdd22bb7aa52 1377 * @param[in] *S points to an instance of the Q15 Biquad cascade structure.
emilmont 1:fdd22bb7aa52 1378 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 1379 * @param[out] *pDst points to the block of output data.
emilmont 1:fdd22bb7aa52 1380 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 1381 * @return none.
emilmont 1:fdd22bb7aa52 1382 */
emilmont 1:fdd22bb7aa52 1383
emilmont 1:fdd22bb7aa52 1384 void arm_biquad_cascade_df1_fast_q15(
emilmont 1:fdd22bb7aa52 1385 const arm_biquad_casd_df1_inst_q15 * S,
emilmont 1:fdd22bb7aa52 1386 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 1387 q15_t * pDst,
emilmont 1:fdd22bb7aa52 1388 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1389
emilmont 1:fdd22bb7aa52 1390
emilmont 1:fdd22bb7aa52 1391 /**
emilmont 1:fdd22bb7aa52 1392 * @brief Processing function for the Q31 Biquad cascade filter
emilmont 1:fdd22bb7aa52 1393 * @param[in] *S points to an instance of the Q31 Biquad cascade structure.
emilmont 1:fdd22bb7aa52 1394 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 1395 * @param[out] *pDst points to the block of output data.
emilmont 1:fdd22bb7aa52 1396 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 1397 * @return none.
emilmont 1:fdd22bb7aa52 1398 */
emilmont 1:fdd22bb7aa52 1399
emilmont 1:fdd22bb7aa52 1400 void arm_biquad_cascade_df1_q31(
emilmont 1:fdd22bb7aa52 1401 const arm_biquad_casd_df1_inst_q31 * S,
emilmont 1:fdd22bb7aa52 1402 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 1403 q31_t * pDst,
emilmont 1:fdd22bb7aa52 1404 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1405
emilmont 1:fdd22bb7aa52 1406 /**
emilmont 1:fdd22bb7aa52 1407 * @brief Fast but less precise processing function for the Q31 Biquad cascade filter for Cortex-M3 and Cortex-M4.
emilmont 1:fdd22bb7aa52 1408 * @param[in] *S points to an instance of the Q31 Biquad cascade structure.
emilmont 1:fdd22bb7aa52 1409 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 1410 * @param[out] *pDst points to the block of output data.
emilmont 1:fdd22bb7aa52 1411 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 1412 * @return none.
emilmont 1:fdd22bb7aa52 1413 */
emilmont 1:fdd22bb7aa52 1414
emilmont 1:fdd22bb7aa52 1415 void arm_biquad_cascade_df1_fast_q31(
emilmont 1:fdd22bb7aa52 1416 const arm_biquad_casd_df1_inst_q31 * S,
emilmont 1:fdd22bb7aa52 1417 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 1418 q31_t * pDst,
emilmont 1:fdd22bb7aa52 1419 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1420
emilmont 1:fdd22bb7aa52 1421 /**
emilmont 1:fdd22bb7aa52 1422 * @brief Initialization function for the Q31 Biquad cascade filter.
emilmont 1:fdd22bb7aa52 1423 * @param[in,out] *S points to an instance of the Q31 Biquad cascade structure.
emilmont 1:fdd22bb7aa52 1424 * @param[in] numStages number of 2nd order stages in the filter.
emilmont 1:fdd22bb7aa52 1425 * @param[in] *pCoeffs points to the filter coefficients.
emilmont 1:fdd22bb7aa52 1426 * @param[in] *pState points to the state buffer.
emilmont 1:fdd22bb7aa52 1427 * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format
emilmont 1:fdd22bb7aa52 1428 * @return none
emilmont 1:fdd22bb7aa52 1429 */
emilmont 1:fdd22bb7aa52 1430
emilmont 1:fdd22bb7aa52 1431 void arm_biquad_cascade_df1_init_q31(
emilmont 1:fdd22bb7aa52 1432 arm_biquad_casd_df1_inst_q31 * S,
emilmont 1:fdd22bb7aa52 1433 uint8_t numStages,
emilmont 1:fdd22bb7aa52 1434 q31_t * pCoeffs,
emilmont 1:fdd22bb7aa52 1435 q31_t * pState,
emilmont 1:fdd22bb7aa52 1436 int8_t postShift);
emilmont 1:fdd22bb7aa52 1437
emilmont 1:fdd22bb7aa52 1438 /**
emilmont 1:fdd22bb7aa52 1439 * @brief Processing function for the floating-point Biquad cascade filter.
emilmont 1:fdd22bb7aa52 1440 * @param[in] *S points to an instance of the floating-point Biquad cascade structure.
emilmont 1:fdd22bb7aa52 1441 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 1442 * @param[out] *pDst points to the block of output data.
emilmont 1:fdd22bb7aa52 1443 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 1444 * @return none.
emilmont 1:fdd22bb7aa52 1445 */
emilmont 1:fdd22bb7aa52 1446
emilmont 1:fdd22bb7aa52 1447 void arm_biquad_cascade_df1_f32(
emilmont 1:fdd22bb7aa52 1448 const arm_biquad_casd_df1_inst_f32 * S,
emilmont 1:fdd22bb7aa52 1449 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 1450 float32_t * pDst,
emilmont 1:fdd22bb7aa52 1451 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1452
emilmont 1:fdd22bb7aa52 1453 /**
emilmont 1:fdd22bb7aa52 1454 * @brief Initialization function for the floating-point Biquad cascade filter.
emilmont 1:fdd22bb7aa52 1455 * @param[in,out] *S points to an instance of the floating-point Biquad cascade structure.
emilmont 1:fdd22bb7aa52 1456 * @param[in] numStages number of 2nd order stages in the filter.
emilmont 1:fdd22bb7aa52 1457 * @param[in] *pCoeffs points to the filter coefficients.
emilmont 1:fdd22bb7aa52 1458 * @param[in] *pState points to the state buffer.
emilmont 1:fdd22bb7aa52 1459 * @return none
emilmont 1:fdd22bb7aa52 1460 */
emilmont 1:fdd22bb7aa52 1461
emilmont 1:fdd22bb7aa52 1462 void arm_biquad_cascade_df1_init_f32(
emilmont 1:fdd22bb7aa52 1463 arm_biquad_casd_df1_inst_f32 * S,
emilmont 1:fdd22bb7aa52 1464 uint8_t numStages,
emilmont 1:fdd22bb7aa52 1465 float32_t * pCoeffs,
emilmont 1:fdd22bb7aa52 1466 float32_t * pState);
emilmont 1:fdd22bb7aa52 1467
emilmont 1:fdd22bb7aa52 1468
emilmont 1:fdd22bb7aa52 1469 /**
emilmont 1:fdd22bb7aa52 1470 * @brief Instance structure for the floating-point matrix structure.
emilmont 1:fdd22bb7aa52 1471 */
emilmont 1:fdd22bb7aa52 1472
emilmont 1:fdd22bb7aa52 1473 typedef struct
emilmont 1:fdd22bb7aa52 1474 {
emilmont 1:fdd22bb7aa52 1475 uint16_t numRows; /**< number of rows of the matrix. */
emilmont 1:fdd22bb7aa52 1476 uint16_t numCols; /**< number of columns of the matrix. */
emilmont 1:fdd22bb7aa52 1477 float32_t *pData; /**< points to the data of the matrix. */
emilmont 1:fdd22bb7aa52 1478 } arm_matrix_instance_f32;
emilmont 1:fdd22bb7aa52 1479
emilmont 1:fdd22bb7aa52 1480 /**
emilmont 1:fdd22bb7aa52 1481 * @brief Instance structure for the Q15 matrix structure.
emilmont 1:fdd22bb7aa52 1482 */
emilmont 1:fdd22bb7aa52 1483
emilmont 1:fdd22bb7aa52 1484 typedef struct
emilmont 1:fdd22bb7aa52 1485 {
emilmont 1:fdd22bb7aa52 1486 uint16_t numRows; /**< number of rows of the matrix. */
emilmont 1:fdd22bb7aa52 1487 uint16_t numCols; /**< number of columns of the matrix. */
emilmont 1:fdd22bb7aa52 1488 q15_t *pData; /**< points to the data of the matrix. */
emilmont 1:fdd22bb7aa52 1489
emilmont 1:fdd22bb7aa52 1490 } arm_matrix_instance_q15;
emilmont 1:fdd22bb7aa52 1491
emilmont 1:fdd22bb7aa52 1492 /**
emilmont 1:fdd22bb7aa52 1493 * @brief Instance structure for the Q31 matrix structure.
emilmont 1:fdd22bb7aa52 1494 */
emilmont 1:fdd22bb7aa52 1495
emilmont 1:fdd22bb7aa52 1496 typedef struct
emilmont 1:fdd22bb7aa52 1497 {
emilmont 1:fdd22bb7aa52 1498 uint16_t numRows; /**< number of rows of the matrix. */
emilmont 1:fdd22bb7aa52 1499 uint16_t numCols; /**< number of columns of the matrix. */
emilmont 1:fdd22bb7aa52 1500 q31_t *pData; /**< points to the data of the matrix. */
emilmont 1:fdd22bb7aa52 1501
emilmont 1:fdd22bb7aa52 1502 } arm_matrix_instance_q31;
emilmont 1:fdd22bb7aa52 1503
emilmont 1:fdd22bb7aa52 1504
emilmont 1:fdd22bb7aa52 1505
emilmont 1:fdd22bb7aa52 1506 /**
emilmont 1:fdd22bb7aa52 1507 * @brief Floating-point matrix addition.
emilmont 1:fdd22bb7aa52 1508 * @param[in] *pSrcA points to the first input matrix structure
emilmont 1:fdd22bb7aa52 1509 * @param[in] *pSrcB points to the second input matrix structure
emilmont 1:fdd22bb7aa52 1510 * @param[out] *pDst points to output matrix structure
emilmont 1:fdd22bb7aa52 1511 * @return The function returns either
emilmont 1:fdd22bb7aa52 1512 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1513 */
emilmont 1:fdd22bb7aa52 1514
emilmont 1:fdd22bb7aa52 1515 arm_status arm_mat_add_f32(
emilmont 1:fdd22bb7aa52 1516 const arm_matrix_instance_f32 * pSrcA,
emilmont 1:fdd22bb7aa52 1517 const arm_matrix_instance_f32 * pSrcB,
emilmont 1:fdd22bb7aa52 1518 arm_matrix_instance_f32 * pDst);
emilmont 1:fdd22bb7aa52 1519
emilmont 1:fdd22bb7aa52 1520 /**
emilmont 1:fdd22bb7aa52 1521 * @brief Q15 matrix addition.
emilmont 1:fdd22bb7aa52 1522 * @param[in] *pSrcA points to the first input matrix structure
emilmont 1:fdd22bb7aa52 1523 * @param[in] *pSrcB points to the second input matrix structure
emilmont 1:fdd22bb7aa52 1524 * @param[out] *pDst points to output matrix structure
emilmont 1:fdd22bb7aa52 1525 * @return The function returns either
emilmont 1:fdd22bb7aa52 1526 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1527 */
emilmont 1:fdd22bb7aa52 1528
emilmont 1:fdd22bb7aa52 1529 arm_status arm_mat_add_q15(
emilmont 1:fdd22bb7aa52 1530 const arm_matrix_instance_q15 * pSrcA,
emilmont 1:fdd22bb7aa52 1531 const arm_matrix_instance_q15 * pSrcB,
emilmont 1:fdd22bb7aa52 1532 arm_matrix_instance_q15 * pDst);
emilmont 1:fdd22bb7aa52 1533
emilmont 1:fdd22bb7aa52 1534 /**
emilmont 1:fdd22bb7aa52 1535 * @brief Q31 matrix addition.
emilmont 1:fdd22bb7aa52 1536 * @param[in] *pSrcA points to the first input matrix structure
emilmont 1:fdd22bb7aa52 1537 * @param[in] *pSrcB points to the second input matrix structure
emilmont 1:fdd22bb7aa52 1538 * @param[out] *pDst points to output matrix structure
emilmont 1:fdd22bb7aa52 1539 * @return The function returns either
emilmont 1:fdd22bb7aa52 1540 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1541 */
emilmont 1:fdd22bb7aa52 1542
emilmont 1:fdd22bb7aa52 1543 arm_status arm_mat_add_q31(
emilmont 1:fdd22bb7aa52 1544 const arm_matrix_instance_q31 * pSrcA,
emilmont 1:fdd22bb7aa52 1545 const arm_matrix_instance_q31 * pSrcB,
emilmont 1:fdd22bb7aa52 1546 arm_matrix_instance_q31 * pDst);
emilmont 1:fdd22bb7aa52 1547
1050186 5:a912b042151f 1548 /**
1050186 5:a912b042151f 1549 * @brief Floating-point, complex, matrix multiplication.
1050186 5:a912b042151f 1550 * @param[in] *pSrcA points to the first input matrix structure
1050186 5:a912b042151f 1551 * @param[in] *pSrcB points to the second input matrix structure
1050186 5:a912b042151f 1552 * @param[out] *pDst points to output matrix structure
1050186 5:a912b042151f 1553 * @return The function returns either
1050186 5:a912b042151f 1554 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
1050186 5:a912b042151f 1555 */
1050186 5:a912b042151f 1556
1050186 5:a912b042151f 1557 arm_status arm_mat_cmplx_mult_f32(
1050186 5:a912b042151f 1558 const arm_matrix_instance_f32 * pSrcA,
1050186 5:a912b042151f 1559 const arm_matrix_instance_f32 * pSrcB,
1050186 5:a912b042151f 1560 arm_matrix_instance_f32 * pDst);
1050186 5:a912b042151f 1561
1050186 5:a912b042151f 1562 /**
1050186 5:a912b042151f 1563 * @brief Q15, complex, matrix multiplication.
1050186 5:a912b042151f 1564 * @param[in] *pSrcA points to the first input matrix structure
1050186 5:a912b042151f 1565 * @param[in] *pSrcB points to the second input matrix structure
1050186 5:a912b042151f 1566 * @param[out] *pDst points to output matrix structure
1050186 5:a912b042151f 1567 * @return The function returns either
1050186 5:a912b042151f 1568 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
1050186 5:a912b042151f 1569 */
1050186 5:a912b042151f 1570
1050186 5:a912b042151f 1571 arm_status arm_mat_cmplx_mult_q15(
1050186 5:a912b042151f 1572 const arm_matrix_instance_q15 * pSrcA,
1050186 5:a912b042151f 1573 const arm_matrix_instance_q15 * pSrcB,
1050186 5:a912b042151f 1574 arm_matrix_instance_q15 * pDst,
1050186 5:a912b042151f 1575 q15_t * pScratch);
1050186 5:a912b042151f 1576
1050186 5:a912b042151f 1577 /**
1050186 5:a912b042151f 1578 * @brief Q31, complex, matrix multiplication.
1050186 5:a912b042151f 1579 * @param[in] *pSrcA points to the first input matrix structure
1050186 5:a912b042151f 1580 * @param[in] *pSrcB points to the second input matrix structure
1050186 5:a912b042151f 1581 * @param[out] *pDst points to output matrix structure
1050186 5:a912b042151f 1582 * @return The function returns either
1050186 5:a912b042151f 1583 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
1050186 5:a912b042151f 1584 */
1050186 5:a912b042151f 1585
1050186 5:a912b042151f 1586 arm_status arm_mat_cmplx_mult_q31(
1050186 5:a912b042151f 1587 const arm_matrix_instance_q31 * pSrcA,
1050186 5:a912b042151f 1588 const arm_matrix_instance_q31 * pSrcB,
1050186 5:a912b042151f 1589 arm_matrix_instance_q31 * pDst);
1050186 5:a912b042151f 1590
emilmont 1:fdd22bb7aa52 1591
emilmont 1:fdd22bb7aa52 1592 /**
emilmont 1:fdd22bb7aa52 1593 * @brief Floating-point matrix transpose.
emilmont 1:fdd22bb7aa52 1594 * @param[in] *pSrc points to the input matrix
emilmont 1:fdd22bb7aa52 1595 * @param[out] *pDst points to the output matrix
emilmont 2:da51fb522205 1596 * @return The function returns either <code>ARM_MATH_SIZE_MISMATCH</code>
emilmont 1:fdd22bb7aa52 1597 * or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1598 */
emilmont 1:fdd22bb7aa52 1599
emilmont 1:fdd22bb7aa52 1600 arm_status arm_mat_trans_f32(
emilmont 1:fdd22bb7aa52 1601 const arm_matrix_instance_f32 * pSrc,
emilmont 1:fdd22bb7aa52 1602 arm_matrix_instance_f32 * pDst);
emilmont 1:fdd22bb7aa52 1603
emilmont 1:fdd22bb7aa52 1604
emilmont 1:fdd22bb7aa52 1605 /**
emilmont 1:fdd22bb7aa52 1606 * @brief Q15 matrix transpose.
emilmont 1:fdd22bb7aa52 1607 * @param[in] *pSrc points to the input matrix
emilmont 1:fdd22bb7aa52 1608 * @param[out] *pDst points to the output matrix
emilmont 2:da51fb522205 1609 * @return The function returns either <code>ARM_MATH_SIZE_MISMATCH</code>
emilmont 1:fdd22bb7aa52 1610 * or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1611 */
emilmont 1:fdd22bb7aa52 1612
emilmont 1:fdd22bb7aa52 1613 arm_status arm_mat_trans_q15(
emilmont 1:fdd22bb7aa52 1614 const arm_matrix_instance_q15 * pSrc,
emilmont 1:fdd22bb7aa52 1615 arm_matrix_instance_q15 * pDst);
emilmont 1:fdd22bb7aa52 1616
emilmont 1:fdd22bb7aa52 1617 /**
emilmont 1:fdd22bb7aa52 1618 * @brief Q31 matrix transpose.
emilmont 1:fdd22bb7aa52 1619 * @param[in] *pSrc points to the input matrix
emilmont 1:fdd22bb7aa52 1620 * @param[out] *pDst points to the output matrix
emilmont 2:da51fb522205 1621 * @return The function returns either <code>ARM_MATH_SIZE_MISMATCH</code>
emilmont 1:fdd22bb7aa52 1622 * or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1623 */
emilmont 1:fdd22bb7aa52 1624
emilmont 1:fdd22bb7aa52 1625 arm_status arm_mat_trans_q31(
emilmont 1:fdd22bb7aa52 1626 const arm_matrix_instance_q31 * pSrc,
emilmont 1:fdd22bb7aa52 1627 arm_matrix_instance_q31 * pDst);
emilmont 1:fdd22bb7aa52 1628
emilmont 1:fdd22bb7aa52 1629
emilmont 1:fdd22bb7aa52 1630 /**
emilmont 1:fdd22bb7aa52 1631 * @brief Floating-point matrix multiplication
emilmont 1:fdd22bb7aa52 1632 * @param[in] *pSrcA points to the first input matrix structure
emilmont 1:fdd22bb7aa52 1633 * @param[in] *pSrcB points to the second input matrix structure
emilmont 1:fdd22bb7aa52 1634 * @param[out] *pDst points to output matrix structure
emilmont 1:fdd22bb7aa52 1635 * @return The function returns either
emilmont 1:fdd22bb7aa52 1636 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1637 */
emilmont 1:fdd22bb7aa52 1638
emilmont 1:fdd22bb7aa52 1639 arm_status arm_mat_mult_f32(
emilmont 1:fdd22bb7aa52 1640 const arm_matrix_instance_f32 * pSrcA,
emilmont 1:fdd22bb7aa52 1641 const arm_matrix_instance_f32 * pSrcB,
emilmont 1:fdd22bb7aa52 1642 arm_matrix_instance_f32 * pDst);
emilmont 1:fdd22bb7aa52 1643
emilmont 1:fdd22bb7aa52 1644 /**
emilmont 1:fdd22bb7aa52 1645 * @brief Q15 matrix multiplication
emilmont 1:fdd22bb7aa52 1646 * @param[in] *pSrcA points to the first input matrix structure
emilmont 1:fdd22bb7aa52 1647 * @param[in] *pSrcB points to the second input matrix structure
emilmont 1:fdd22bb7aa52 1648 * @param[out] *pDst points to output matrix structure
1050186 5:a912b042151f 1649 * @param[in] *pState points to the array for storing intermediate results
emilmont 1:fdd22bb7aa52 1650 * @return The function returns either
emilmont 1:fdd22bb7aa52 1651 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1652 */
emilmont 1:fdd22bb7aa52 1653
emilmont 1:fdd22bb7aa52 1654 arm_status arm_mat_mult_q15(
emilmont 1:fdd22bb7aa52 1655 const arm_matrix_instance_q15 * pSrcA,
emilmont 1:fdd22bb7aa52 1656 const arm_matrix_instance_q15 * pSrcB,
emilmont 1:fdd22bb7aa52 1657 arm_matrix_instance_q15 * pDst,
emilmont 1:fdd22bb7aa52 1658 q15_t * pState);
emilmont 1:fdd22bb7aa52 1659
emilmont 1:fdd22bb7aa52 1660 /**
emilmont 1:fdd22bb7aa52 1661 * @brief Q15 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4
emilmont 1:fdd22bb7aa52 1662 * @param[in] *pSrcA points to the first input matrix structure
emilmont 1:fdd22bb7aa52 1663 * @param[in] *pSrcB points to the second input matrix structure
emilmont 1:fdd22bb7aa52 1664 * @param[out] *pDst points to output matrix structure
mbed_official 3:7a284390b0ce 1665 * @param[in] *pState points to the array for storing intermediate results
emilmont 1:fdd22bb7aa52 1666 * @return The function returns either
emilmont 1:fdd22bb7aa52 1667 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1668 */
emilmont 1:fdd22bb7aa52 1669
emilmont 1:fdd22bb7aa52 1670 arm_status arm_mat_mult_fast_q15(
emilmont 1:fdd22bb7aa52 1671 const arm_matrix_instance_q15 * pSrcA,
emilmont 1:fdd22bb7aa52 1672 const arm_matrix_instance_q15 * pSrcB,
emilmont 1:fdd22bb7aa52 1673 arm_matrix_instance_q15 * pDst,
emilmont 1:fdd22bb7aa52 1674 q15_t * pState);
emilmont 1:fdd22bb7aa52 1675
emilmont 1:fdd22bb7aa52 1676 /**
emilmont 1:fdd22bb7aa52 1677 * @brief Q31 matrix multiplication
emilmont 1:fdd22bb7aa52 1678 * @param[in] *pSrcA points to the first input matrix structure
emilmont 1:fdd22bb7aa52 1679 * @param[in] *pSrcB points to the second input matrix structure
emilmont 1:fdd22bb7aa52 1680 * @param[out] *pDst points to output matrix structure
emilmont 1:fdd22bb7aa52 1681 * @return The function returns either
emilmont 1:fdd22bb7aa52 1682 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1683 */
emilmont 1:fdd22bb7aa52 1684
emilmont 1:fdd22bb7aa52 1685 arm_status arm_mat_mult_q31(
emilmont 1:fdd22bb7aa52 1686 const arm_matrix_instance_q31 * pSrcA,
emilmont 1:fdd22bb7aa52 1687 const arm_matrix_instance_q31 * pSrcB,
emilmont 1:fdd22bb7aa52 1688 arm_matrix_instance_q31 * pDst);
emilmont 1:fdd22bb7aa52 1689
emilmont 1:fdd22bb7aa52 1690 /**
emilmont 1:fdd22bb7aa52 1691 * @brief Q31 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4
emilmont 1:fdd22bb7aa52 1692 * @param[in] *pSrcA points to the first input matrix structure
emilmont 1:fdd22bb7aa52 1693 * @param[in] *pSrcB points to the second input matrix structure
emilmont 1:fdd22bb7aa52 1694 * @param[out] *pDst points to output matrix structure
emilmont 1:fdd22bb7aa52 1695 * @return The function returns either
emilmont 1:fdd22bb7aa52 1696 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1697 */
emilmont 1:fdd22bb7aa52 1698
emilmont 1:fdd22bb7aa52 1699 arm_status arm_mat_mult_fast_q31(
emilmont 1:fdd22bb7aa52 1700 const arm_matrix_instance_q31 * pSrcA,
emilmont 1:fdd22bb7aa52 1701 const arm_matrix_instance_q31 * pSrcB,
emilmont 1:fdd22bb7aa52 1702 arm_matrix_instance_q31 * pDst);
emilmont 1:fdd22bb7aa52 1703
emilmont 1:fdd22bb7aa52 1704
emilmont 1:fdd22bb7aa52 1705 /**
emilmont 1:fdd22bb7aa52 1706 * @brief Floating-point matrix subtraction
emilmont 1:fdd22bb7aa52 1707 * @param[in] *pSrcA points to the first input matrix structure
emilmont 1:fdd22bb7aa52 1708 * @param[in] *pSrcB points to the second input matrix structure
emilmont 1:fdd22bb7aa52 1709 * @param[out] *pDst points to output matrix structure
emilmont 1:fdd22bb7aa52 1710 * @return The function returns either
emilmont 1:fdd22bb7aa52 1711 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1712 */
emilmont 1:fdd22bb7aa52 1713
emilmont 1:fdd22bb7aa52 1714 arm_status arm_mat_sub_f32(
emilmont 1:fdd22bb7aa52 1715 const arm_matrix_instance_f32 * pSrcA,
emilmont 1:fdd22bb7aa52 1716 const arm_matrix_instance_f32 * pSrcB,
emilmont 1:fdd22bb7aa52 1717 arm_matrix_instance_f32 * pDst);
emilmont 1:fdd22bb7aa52 1718
emilmont 1:fdd22bb7aa52 1719 /**
emilmont 1:fdd22bb7aa52 1720 * @brief Q15 matrix subtraction
emilmont 1:fdd22bb7aa52 1721 * @param[in] *pSrcA points to the first input matrix structure
emilmont 1:fdd22bb7aa52 1722 * @param[in] *pSrcB points to the second input matrix structure
emilmont 1:fdd22bb7aa52 1723 * @param[out] *pDst points to output matrix structure
emilmont 1:fdd22bb7aa52 1724 * @return The function returns either
emilmont 1:fdd22bb7aa52 1725 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1726 */
emilmont 1:fdd22bb7aa52 1727
emilmont 1:fdd22bb7aa52 1728 arm_status arm_mat_sub_q15(
emilmont 1:fdd22bb7aa52 1729 const arm_matrix_instance_q15 * pSrcA,
emilmont 1:fdd22bb7aa52 1730 const arm_matrix_instance_q15 * pSrcB,
emilmont 1:fdd22bb7aa52 1731 arm_matrix_instance_q15 * pDst);
emilmont 1:fdd22bb7aa52 1732
emilmont 1:fdd22bb7aa52 1733 /**
emilmont 1:fdd22bb7aa52 1734 * @brief Q31 matrix subtraction
emilmont 1:fdd22bb7aa52 1735 * @param[in] *pSrcA points to the first input matrix structure
emilmont 1:fdd22bb7aa52 1736 * @param[in] *pSrcB points to the second input matrix structure
emilmont 1:fdd22bb7aa52 1737 * @param[out] *pDst points to output matrix structure
emilmont 1:fdd22bb7aa52 1738 * @return The function returns either
emilmont 1:fdd22bb7aa52 1739 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1740 */
emilmont 1:fdd22bb7aa52 1741
emilmont 1:fdd22bb7aa52 1742 arm_status arm_mat_sub_q31(
emilmont 1:fdd22bb7aa52 1743 const arm_matrix_instance_q31 * pSrcA,
emilmont 1:fdd22bb7aa52 1744 const arm_matrix_instance_q31 * pSrcB,
emilmont 1:fdd22bb7aa52 1745 arm_matrix_instance_q31 * pDst);
emilmont 1:fdd22bb7aa52 1746
emilmont 1:fdd22bb7aa52 1747 /**
emilmont 1:fdd22bb7aa52 1748 * @brief Floating-point matrix scaling.
emilmont 1:fdd22bb7aa52 1749 * @param[in] *pSrc points to the input matrix
emilmont 1:fdd22bb7aa52 1750 * @param[in] scale scale factor
emilmont 1:fdd22bb7aa52 1751 * @param[out] *pDst points to the output matrix
emilmont 1:fdd22bb7aa52 1752 * @return The function returns either
emilmont 1:fdd22bb7aa52 1753 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1754 */
emilmont 1:fdd22bb7aa52 1755
emilmont 1:fdd22bb7aa52 1756 arm_status arm_mat_scale_f32(
emilmont 1:fdd22bb7aa52 1757 const arm_matrix_instance_f32 * pSrc,
emilmont 1:fdd22bb7aa52 1758 float32_t scale,
emilmont 1:fdd22bb7aa52 1759 arm_matrix_instance_f32 * pDst);
emilmont 1:fdd22bb7aa52 1760
emilmont 1:fdd22bb7aa52 1761 /**
emilmont 1:fdd22bb7aa52 1762 * @brief Q15 matrix scaling.
emilmont 1:fdd22bb7aa52 1763 * @param[in] *pSrc points to input matrix
emilmont 1:fdd22bb7aa52 1764 * @param[in] scaleFract fractional portion of the scale factor
emilmont 1:fdd22bb7aa52 1765 * @param[in] shift number of bits to shift the result by
emilmont 1:fdd22bb7aa52 1766 * @param[out] *pDst points to output matrix
emilmont 1:fdd22bb7aa52 1767 * @return The function returns either
emilmont 1:fdd22bb7aa52 1768 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1769 */
emilmont 1:fdd22bb7aa52 1770
emilmont 1:fdd22bb7aa52 1771 arm_status arm_mat_scale_q15(
emilmont 1:fdd22bb7aa52 1772 const arm_matrix_instance_q15 * pSrc,
emilmont 1:fdd22bb7aa52 1773 q15_t scaleFract,
emilmont 1:fdd22bb7aa52 1774 int32_t shift,
emilmont 1:fdd22bb7aa52 1775 arm_matrix_instance_q15 * pDst);
emilmont 1:fdd22bb7aa52 1776
emilmont 1:fdd22bb7aa52 1777 /**
emilmont 1:fdd22bb7aa52 1778 * @brief Q31 matrix scaling.
emilmont 1:fdd22bb7aa52 1779 * @param[in] *pSrc points to input matrix
emilmont 1:fdd22bb7aa52 1780 * @param[in] scaleFract fractional portion of the scale factor
emilmont 1:fdd22bb7aa52 1781 * @param[in] shift number of bits to shift the result by
emilmont 1:fdd22bb7aa52 1782 * @param[out] *pDst points to output matrix structure
emilmont 1:fdd22bb7aa52 1783 * @return The function returns either
emilmont 1:fdd22bb7aa52 1784 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1785 */
emilmont 1:fdd22bb7aa52 1786
emilmont 1:fdd22bb7aa52 1787 arm_status arm_mat_scale_q31(
emilmont 1:fdd22bb7aa52 1788 const arm_matrix_instance_q31 * pSrc,
emilmont 1:fdd22bb7aa52 1789 q31_t scaleFract,
emilmont 1:fdd22bb7aa52 1790 int32_t shift,
emilmont 1:fdd22bb7aa52 1791 arm_matrix_instance_q31 * pDst);
emilmont 1:fdd22bb7aa52 1792
emilmont 1:fdd22bb7aa52 1793
emilmont 1:fdd22bb7aa52 1794 /**
emilmont 1:fdd22bb7aa52 1795 * @brief Q31 matrix initialization.
emilmont 1:fdd22bb7aa52 1796 * @param[in,out] *S points to an instance of the floating-point matrix structure.
emilmont 1:fdd22bb7aa52 1797 * @param[in] nRows number of rows in the matrix.
emilmont 1:fdd22bb7aa52 1798 * @param[in] nColumns number of columns in the matrix.
emilmont 2:da51fb522205 1799 * @param[in] *pData points to the matrix data array.
emilmont 1:fdd22bb7aa52 1800 * @return none
emilmont 1:fdd22bb7aa52 1801 */
emilmont 1:fdd22bb7aa52 1802
emilmont 1:fdd22bb7aa52 1803 void arm_mat_init_q31(
emilmont 1:fdd22bb7aa52 1804 arm_matrix_instance_q31 * S,
emilmont 1:fdd22bb7aa52 1805 uint16_t nRows,
emilmont 1:fdd22bb7aa52 1806 uint16_t nColumns,
emilmont 1:fdd22bb7aa52 1807 q31_t * pData);
emilmont 1:fdd22bb7aa52 1808
emilmont 1:fdd22bb7aa52 1809 /**
emilmont 1:fdd22bb7aa52 1810 * @brief Q15 matrix initialization.
emilmont 1:fdd22bb7aa52 1811 * @param[in,out] *S points to an instance of the floating-point matrix structure.
emilmont 1:fdd22bb7aa52 1812 * @param[in] nRows number of rows in the matrix.
emilmont 1:fdd22bb7aa52 1813 * @param[in] nColumns number of columns in the matrix.
emilmont 2:da51fb522205 1814 * @param[in] *pData points to the matrix data array.
emilmont 1:fdd22bb7aa52 1815 * @return none
emilmont 1:fdd22bb7aa52 1816 */
emilmont 1:fdd22bb7aa52 1817
emilmont 1:fdd22bb7aa52 1818 void arm_mat_init_q15(
emilmont 1:fdd22bb7aa52 1819 arm_matrix_instance_q15 * S,
emilmont 1:fdd22bb7aa52 1820 uint16_t nRows,
emilmont 1:fdd22bb7aa52 1821 uint16_t nColumns,
emilmont 1:fdd22bb7aa52 1822 q15_t * pData);
emilmont 1:fdd22bb7aa52 1823
emilmont 1:fdd22bb7aa52 1824 /**
emilmont 1:fdd22bb7aa52 1825 * @brief Floating-point matrix initialization.
emilmont 1:fdd22bb7aa52 1826 * @param[in,out] *S points to an instance of the floating-point matrix structure.
emilmont 1:fdd22bb7aa52 1827 * @param[in] nRows number of rows in the matrix.
emilmont 1:fdd22bb7aa52 1828 * @param[in] nColumns number of columns in the matrix.
emilmont 2:da51fb522205 1829 * @param[in] *pData points to the matrix data array.
emilmont 1:fdd22bb7aa52 1830 * @return none
emilmont 1:fdd22bb7aa52 1831 */
emilmont 1:fdd22bb7aa52 1832
emilmont 1:fdd22bb7aa52 1833 void arm_mat_init_f32(
emilmont 1:fdd22bb7aa52 1834 arm_matrix_instance_f32 * S,
emilmont 1:fdd22bb7aa52 1835 uint16_t nRows,
emilmont 1:fdd22bb7aa52 1836 uint16_t nColumns,
emilmont 1:fdd22bb7aa52 1837 float32_t * pData);
emilmont 1:fdd22bb7aa52 1838
emilmont 1:fdd22bb7aa52 1839
emilmont 1:fdd22bb7aa52 1840
emilmont 1:fdd22bb7aa52 1841 /**
emilmont 1:fdd22bb7aa52 1842 * @brief Instance structure for the Q15 PID Control.
emilmont 1:fdd22bb7aa52 1843 */
emilmont 1:fdd22bb7aa52 1844 typedef struct
emilmont 1:fdd22bb7aa52 1845 {
emilmont 1:fdd22bb7aa52 1846 q15_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */
mbed_official 3:7a284390b0ce 1847 #ifdef ARM_MATH_CM0_FAMILY
emilmont 1:fdd22bb7aa52 1848 q15_t A1;
emilmont 1:fdd22bb7aa52 1849 q15_t A2;
emilmont 1:fdd22bb7aa52 1850 #else
emilmont 1:fdd22bb7aa52 1851 q31_t A1; /**< The derived gain A1 = -Kp - 2Kd | Kd.*/
emilmont 1:fdd22bb7aa52 1852 #endif
emilmont 1:fdd22bb7aa52 1853 q15_t state[3]; /**< The state array of length 3. */
emilmont 1:fdd22bb7aa52 1854 q15_t Kp; /**< The proportional gain. */
emilmont 1:fdd22bb7aa52 1855 q15_t Ki; /**< The integral gain. */
emilmont 1:fdd22bb7aa52 1856 q15_t Kd; /**< The derivative gain. */
emilmont 1:fdd22bb7aa52 1857 } arm_pid_instance_q15;
emilmont 1:fdd22bb7aa52 1858
emilmont 1:fdd22bb7aa52 1859 /**
emilmont 1:fdd22bb7aa52 1860 * @brief Instance structure for the Q31 PID Control.
emilmont 1:fdd22bb7aa52 1861 */
emilmont 1:fdd22bb7aa52 1862 typedef struct
emilmont 1:fdd22bb7aa52 1863 {
emilmont 1:fdd22bb7aa52 1864 q31_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */
emilmont 1:fdd22bb7aa52 1865 q31_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */
emilmont 1:fdd22bb7aa52 1866 q31_t A2; /**< The derived gain, A2 = Kd . */
emilmont 1:fdd22bb7aa52 1867 q31_t state[3]; /**< The state array of length 3. */
emilmont 1:fdd22bb7aa52 1868 q31_t Kp; /**< The proportional gain. */
emilmont 1:fdd22bb7aa52 1869 q31_t Ki; /**< The integral gain. */
emilmont 1:fdd22bb7aa52 1870 q31_t Kd; /**< The derivative gain. */
emilmont 1:fdd22bb7aa52 1871
emilmont 1:fdd22bb7aa52 1872 } arm_pid_instance_q31;
emilmont 1:fdd22bb7aa52 1873
emilmont 1:fdd22bb7aa52 1874 /**
emilmont 1:fdd22bb7aa52 1875 * @brief Instance structure for the floating-point PID Control.
emilmont 1:fdd22bb7aa52 1876 */
emilmont 1:fdd22bb7aa52 1877 typedef struct
emilmont 1:fdd22bb7aa52 1878 {
emilmont 1:fdd22bb7aa52 1879 float32_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */
emilmont 1:fdd22bb7aa52 1880 float32_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */
emilmont 1:fdd22bb7aa52 1881 float32_t A2; /**< The derived gain, A2 = Kd . */
emilmont 1:fdd22bb7aa52 1882 float32_t state[3]; /**< The state array of length 3. */
emilmont 1:fdd22bb7aa52 1883 float32_t Kp; /**< The proportional gain. */
emilmont 1:fdd22bb7aa52 1884 float32_t Ki; /**< The integral gain. */
emilmont 1:fdd22bb7aa52 1885 float32_t Kd; /**< The derivative gain. */
emilmont 1:fdd22bb7aa52 1886 } arm_pid_instance_f32;
emilmont 1:fdd22bb7aa52 1887
emilmont 1:fdd22bb7aa52 1888
emilmont 1:fdd22bb7aa52 1889
emilmont 1:fdd22bb7aa52 1890 /**
emilmont 1:fdd22bb7aa52 1891 * @brief Initialization function for the floating-point PID Control.
emilmont 1:fdd22bb7aa52 1892 * @param[in,out] *S points to an instance of the PID structure.
emilmont 1:fdd22bb7aa52 1893 * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state.
emilmont 1:fdd22bb7aa52 1894 * @return none.
emilmont 1:fdd22bb7aa52 1895 */
emilmont 1:fdd22bb7aa52 1896 void arm_pid_init_f32(
emilmont 1:fdd22bb7aa52 1897 arm_pid_instance_f32 * S,
emilmont 1:fdd22bb7aa52 1898 int32_t resetStateFlag);
emilmont 1:fdd22bb7aa52 1899
emilmont 1:fdd22bb7aa52 1900 /**
emilmont 1:fdd22bb7aa52 1901 * @brief Reset function for the floating-point PID Control.
emilmont 1:fdd22bb7aa52 1902 * @param[in,out] *S is an instance of the floating-point PID Control structure
emilmont 1:fdd22bb7aa52 1903 * @return none
emilmont 1:fdd22bb7aa52 1904 */
emilmont 1:fdd22bb7aa52 1905 void arm_pid_reset_f32(
emilmont 1:fdd22bb7aa52 1906 arm_pid_instance_f32 * S);
emilmont 1:fdd22bb7aa52 1907
emilmont 1:fdd22bb7aa52 1908
emilmont 1:fdd22bb7aa52 1909 /**
emilmont 1:fdd22bb7aa52 1910 * @brief Initialization function for the Q31 PID Control.
emilmont 1:fdd22bb7aa52 1911 * @param[in,out] *S points to an instance of the Q15 PID structure.
emilmont 1:fdd22bb7aa52 1912 * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state.
emilmont 1:fdd22bb7aa52 1913 * @return none.
emilmont 1:fdd22bb7aa52 1914 */
emilmont 1:fdd22bb7aa52 1915 void arm_pid_init_q31(
emilmont 1:fdd22bb7aa52 1916 arm_pid_instance_q31 * S,
emilmont 1:fdd22bb7aa52 1917 int32_t resetStateFlag);
emilmont 1:fdd22bb7aa52 1918
emilmont 1:fdd22bb7aa52 1919
emilmont 1:fdd22bb7aa52 1920 /**
emilmont 1:fdd22bb7aa52 1921 * @brief Reset function for the Q31 PID Control.
emilmont 1:fdd22bb7aa52 1922 * @param[in,out] *S points to an instance of the Q31 PID Control structure
emilmont 1:fdd22bb7aa52 1923 * @return none
emilmont 1:fdd22bb7aa52 1924 */
emilmont 1:fdd22bb7aa52 1925
emilmont 1:fdd22bb7aa52 1926 void arm_pid_reset_q31(
emilmont 1:fdd22bb7aa52 1927 arm_pid_instance_q31 * S);
emilmont 1:fdd22bb7aa52 1928
emilmont 1:fdd22bb7aa52 1929 /**
emilmont 1:fdd22bb7aa52 1930 * @brief Initialization function for the Q15 PID Control.
emilmont 1:fdd22bb7aa52 1931 * @param[in,out] *S points to an instance of the Q15 PID structure.
emilmont 1:fdd22bb7aa52 1932 * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state.
emilmont 1:fdd22bb7aa52 1933 * @return none.
emilmont 1:fdd22bb7aa52 1934 */
emilmont 1:fdd22bb7aa52 1935 void arm_pid_init_q15(
emilmont 1:fdd22bb7aa52 1936 arm_pid_instance_q15 * S,
emilmont 1:fdd22bb7aa52 1937 int32_t resetStateFlag);
emilmont 1:fdd22bb7aa52 1938
emilmont 1:fdd22bb7aa52 1939 /**
emilmont 1:fdd22bb7aa52 1940 * @brief Reset function for the Q15 PID Control.
emilmont 1:fdd22bb7aa52 1941 * @param[in,out] *S points to an instance of the q15 PID Control structure
emilmont 1:fdd22bb7aa52 1942 * @return none
emilmont 1:fdd22bb7aa52 1943 */
emilmont 1:fdd22bb7aa52 1944 void arm_pid_reset_q15(
emilmont 1:fdd22bb7aa52 1945 arm_pid_instance_q15 * S);
emilmont 1:fdd22bb7aa52 1946
emilmont 1:fdd22bb7aa52 1947
emilmont 1:fdd22bb7aa52 1948 /**
emilmont 1:fdd22bb7aa52 1949 * @brief Instance structure for the floating-point Linear Interpolate function.
emilmont 1:fdd22bb7aa52 1950 */
emilmont 1:fdd22bb7aa52 1951 typedef struct
emilmont 1:fdd22bb7aa52 1952 {
emilmont 1:fdd22bb7aa52 1953 uint32_t nValues; /**< nValues */
emilmont 1:fdd22bb7aa52 1954 float32_t x1; /**< x1 */
emilmont 1:fdd22bb7aa52 1955 float32_t xSpacing; /**< xSpacing */
emilmont 1:fdd22bb7aa52 1956 float32_t *pYData; /**< pointer to the table of Y values */
emilmont 1:fdd22bb7aa52 1957 } arm_linear_interp_instance_f32;
emilmont 1:fdd22bb7aa52 1958
emilmont 1:fdd22bb7aa52 1959 /**
emilmont 1:fdd22bb7aa52 1960 * @brief Instance structure for the floating-point bilinear interpolation function.
emilmont 1:fdd22bb7aa52 1961 */
emilmont 1:fdd22bb7aa52 1962
emilmont 1:fdd22bb7aa52 1963 typedef struct
emilmont 1:fdd22bb7aa52 1964 {
emilmont 1:fdd22bb7aa52 1965 uint16_t numRows; /**< number of rows in the data table. */
emilmont 1:fdd22bb7aa52 1966 uint16_t numCols; /**< number of columns in the data table. */
emilmont 1:fdd22bb7aa52 1967 float32_t *pData; /**< points to the data table. */
emilmont 1:fdd22bb7aa52 1968 } arm_bilinear_interp_instance_f32;
emilmont 1:fdd22bb7aa52 1969
emilmont 1:fdd22bb7aa52 1970 /**
emilmont 1:fdd22bb7aa52 1971 * @brief Instance structure for the Q31 bilinear interpolation function.
emilmont 1:fdd22bb7aa52 1972 */
emilmont 1:fdd22bb7aa52 1973
emilmont 1:fdd22bb7aa52 1974 typedef struct
emilmont 1:fdd22bb7aa52 1975 {
emilmont 1:fdd22bb7aa52 1976 uint16_t numRows; /**< number of rows in the data table. */
emilmont 1:fdd22bb7aa52 1977 uint16_t numCols; /**< number of columns in the data table. */
emilmont 1:fdd22bb7aa52 1978 q31_t *pData; /**< points to the data table. */
emilmont 1:fdd22bb7aa52 1979 } arm_bilinear_interp_instance_q31;
emilmont 1:fdd22bb7aa52 1980
emilmont 1:fdd22bb7aa52 1981 /**
emilmont 1:fdd22bb7aa52 1982 * @brief Instance structure for the Q15 bilinear interpolation function.
emilmont 1:fdd22bb7aa52 1983 */
emilmont 1:fdd22bb7aa52 1984
emilmont 1:fdd22bb7aa52 1985 typedef struct
emilmont 1:fdd22bb7aa52 1986 {
emilmont 1:fdd22bb7aa52 1987 uint16_t numRows; /**< number of rows in the data table. */
emilmont 1:fdd22bb7aa52 1988 uint16_t numCols; /**< number of columns in the data table. */
emilmont 1:fdd22bb7aa52 1989 q15_t *pData; /**< points to the data table. */
emilmont 1:fdd22bb7aa52 1990 } arm_bilinear_interp_instance_q15;
emilmont 1:fdd22bb7aa52 1991
emilmont 1:fdd22bb7aa52 1992 /**
emilmont 1:fdd22bb7aa52 1993 * @brief Instance structure for the Q15 bilinear interpolation function.
emilmont 1:fdd22bb7aa52 1994 */
emilmont 1:fdd22bb7aa52 1995
emilmont 1:fdd22bb7aa52 1996 typedef struct
emilmont 1:fdd22bb7aa52 1997 {
emilmont 1:fdd22bb7aa52 1998 uint16_t numRows; /**< number of rows in the data table. */
emilmont 1:fdd22bb7aa52 1999 uint16_t numCols; /**< number of columns in the data table. */
emilmont 1:fdd22bb7aa52 2000 q7_t *pData; /**< points to the data table. */
emilmont 1:fdd22bb7aa52 2001 } arm_bilinear_interp_instance_q7;
emilmont 1:fdd22bb7aa52 2002
emilmont 1:fdd22bb7aa52 2003
emilmont 1:fdd22bb7aa52 2004 /**
emilmont 1:fdd22bb7aa52 2005 * @brief Q7 vector multiplication.
emilmont 1:fdd22bb7aa52 2006 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 2007 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 2008 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2009 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2010 * @return none.
emilmont 1:fdd22bb7aa52 2011 */
emilmont 1:fdd22bb7aa52 2012
emilmont 1:fdd22bb7aa52 2013 void arm_mult_q7(
emilmont 1:fdd22bb7aa52 2014 q7_t * pSrcA,
emilmont 1:fdd22bb7aa52 2015 q7_t * pSrcB,
emilmont 1:fdd22bb7aa52 2016 q7_t * pDst,
emilmont 1:fdd22bb7aa52 2017 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2018
emilmont 1:fdd22bb7aa52 2019 /**
emilmont 1:fdd22bb7aa52 2020 * @brief Q15 vector multiplication.
emilmont 1:fdd22bb7aa52 2021 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 2022 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 2023 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2024 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2025 * @return none.
emilmont 1:fdd22bb7aa52 2026 */
emilmont 1:fdd22bb7aa52 2027
emilmont 1:fdd22bb7aa52 2028 void arm_mult_q15(
emilmont 1:fdd22bb7aa52 2029 q15_t * pSrcA,
emilmont 1:fdd22bb7aa52 2030 q15_t * pSrcB,
emilmont 1:fdd22bb7aa52 2031 q15_t * pDst,
emilmont 1:fdd22bb7aa52 2032 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2033
emilmont 1:fdd22bb7aa52 2034 /**
emilmont 1:fdd22bb7aa52 2035 * @brief Q31 vector multiplication.
emilmont 1:fdd22bb7aa52 2036 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 2037 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 2038 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2039 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2040 * @return none.
emilmont 1:fdd22bb7aa52 2041 */
emilmont 1:fdd22bb7aa52 2042
emilmont 1:fdd22bb7aa52 2043 void arm_mult_q31(
emilmont 1:fdd22bb7aa52 2044 q31_t * pSrcA,
emilmont 1:fdd22bb7aa52 2045 q31_t * pSrcB,
emilmont 1:fdd22bb7aa52 2046 q31_t * pDst,
emilmont 1:fdd22bb7aa52 2047 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2048
emilmont 1:fdd22bb7aa52 2049 /**
emilmont 1:fdd22bb7aa52 2050 * @brief Floating-point vector multiplication.
emilmont 1:fdd22bb7aa52 2051 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 2052 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 2053 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2054 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2055 * @return none.
emilmont 1:fdd22bb7aa52 2056 */
emilmont 1:fdd22bb7aa52 2057
emilmont 1:fdd22bb7aa52 2058 void arm_mult_f32(
emilmont 1:fdd22bb7aa52 2059 float32_t * pSrcA,
emilmont 1:fdd22bb7aa52 2060 float32_t * pSrcB,
emilmont 1:fdd22bb7aa52 2061 float32_t * pDst,
emilmont 1:fdd22bb7aa52 2062 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2063
emilmont 1:fdd22bb7aa52 2064
mbed_official 3:7a284390b0ce 2065
mbed_official 3:7a284390b0ce 2066
emilmont 1:fdd22bb7aa52 2067
emilmont 1:fdd22bb7aa52 2068
emilmont 1:fdd22bb7aa52 2069 /**
emilmont 1:fdd22bb7aa52 2070 * @brief Instance structure for the Q15 CFFT/CIFFT function.
emilmont 1:fdd22bb7aa52 2071 */
emilmont 1:fdd22bb7aa52 2072
emilmont 1:fdd22bb7aa52 2073 typedef struct
emilmont 1:fdd22bb7aa52 2074 {
emilmont 1:fdd22bb7aa52 2075 uint16_t fftLen; /**< length of the FFT. */
emilmont 1:fdd22bb7aa52 2076 uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
emilmont 1:fdd22bb7aa52 2077 uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
emilmont 1:fdd22bb7aa52 2078 q15_t *pTwiddle; /**< points to the Sin twiddle factor table. */
emilmont 1:fdd22bb7aa52 2079 uint16_t *pBitRevTable; /**< points to the bit reversal table. */
emilmont 1:fdd22bb7aa52 2080 uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
emilmont 1:fdd22bb7aa52 2081 uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
emilmont 1:fdd22bb7aa52 2082 } arm_cfft_radix2_instance_q15;
emilmont 1:fdd22bb7aa52 2083
mbed_official 3:7a284390b0ce 2084 arm_status arm_cfft_radix2_init_q15(
mbed_official 3:7a284390b0ce 2085 arm_cfft_radix2_instance_q15 * S,
mbed_official 3:7a284390b0ce 2086 uint16_t fftLen,
mbed_official 3:7a284390b0ce 2087 uint8_t ifftFlag,
mbed_official 3:7a284390b0ce 2088 uint8_t bitReverseFlag);
mbed_official 3:7a284390b0ce 2089
mbed_official 3:7a284390b0ce 2090 void arm_cfft_radix2_q15(
mbed_official 3:7a284390b0ce 2091 const arm_cfft_radix2_instance_q15 * S,
mbed_official 3:7a284390b0ce 2092 q15_t * pSrc);
mbed_official 3:7a284390b0ce 2093
mbed_official 3:7a284390b0ce 2094
mbed_official 3:7a284390b0ce 2095
mbed_official 3:7a284390b0ce 2096 /**
mbed_official 3:7a284390b0ce 2097 * @brief Instance structure for the Q15 CFFT/CIFFT function.
mbed_official 3:7a284390b0ce 2098 */
mbed_official 3:7a284390b0ce 2099
mbed_official 3:7a284390b0ce 2100 typedef struct
mbed_official 3:7a284390b0ce 2101 {
mbed_official 3:7a284390b0ce 2102 uint16_t fftLen; /**< length of the FFT. */
mbed_official 3:7a284390b0ce 2103 uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
mbed_official 3:7a284390b0ce 2104 uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
mbed_official 3:7a284390b0ce 2105 q15_t *pTwiddle; /**< points to the twiddle factor table. */
mbed_official 3:7a284390b0ce 2106 uint16_t *pBitRevTable; /**< points to the bit reversal table. */
mbed_official 3:7a284390b0ce 2107 uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
mbed_official 3:7a284390b0ce 2108 uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
mbed_official 3:7a284390b0ce 2109 } arm_cfft_radix4_instance_q15;
mbed_official 3:7a284390b0ce 2110
mbed_official 3:7a284390b0ce 2111 arm_status arm_cfft_radix4_init_q15(
mbed_official 3:7a284390b0ce 2112 arm_cfft_radix4_instance_q15 * S,
mbed_official 3:7a284390b0ce 2113 uint16_t fftLen,
mbed_official 3:7a284390b0ce 2114 uint8_t ifftFlag,
mbed_official 3:7a284390b0ce 2115 uint8_t bitReverseFlag);
mbed_official 3:7a284390b0ce 2116
mbed_official 3:7a284390b0ce 2117 void arm_cfft_radix4_q15(
mbed_official 3:7a284390b0ce 2118 const arm_cfft_radix4_instance_q15 * S,
mbed_official 3:7a284390b0ce 2119 q15_t * pSrc);
mbed_official 3:7a284390b0ce 2120
emilmont 1:fdd22bb7aa52 2121 /**
emilmont 1:fdd22bb7aa52 2122 * @brief Instance structure for the Radix-2 Q31 CFFT/CIFFT function.
emilmont 1:fdd22bb7aa52 2123 */
emilmont 1:fdd22bb7aa52 2124
emilmont 1:fdd22bb7aa52 2125 typedef struct
emilmont 1:fdd22bb7aa52 2126 {
emilmont 1:fdd22bb7aa52 2127 uint16_t fftLen; /**< length of the FFT. */
emilmont 1:fdd22bb7aa52 2128 uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
emilmont 1:fdd22bb7aa52 2129 uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
emilmont 1:fdd22bb7aa52 2130 q31_t *pTwiddle; /**< points to the Twiddle factor table. */
emilmont 1:fdd22bb7aa52 2131 uint16_t *pBitRevTable; /**< points to the bit reversal table. */
emilmont 1:fdd22bb7aa52 2132 uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
emilmont 1:fdd22bb7aa52 2133 uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
emilmont 1:fdd22bb7aa52 2134 } arm_cfft_radix2_instance_q31;
emilmont 1:fdd22bb7aa52 2135
mbed_official 3:7a284390b0ce 2136 arm_status arm_cfft_radix2_init_q31(
mbed_official 3:7a284390b0ce 2137 arm_cfft_radix2_instance_q31 * S,
mbed_official 3:7a284390b0ce 2138 uint16_t fftLen,
mbed_official 3:7a284390b0ce 2139 uint8_t ifftFlag,
mbed_official 3:7a284390b0ce 2140 uint8_t bitReverseFlag);
mbed_official 3:7a284390b0ce 2141
mbed_official 3:7a284390b0ce 2142 void arm_cfft_radix2_q31(
mbed_official 3:7a284390b0ce 2143 const arm_cfft_radix2_instance_q31 * S,
mbed_official 3:7a284390b0ce 2144 q31_t * pSrc);
mbed_official 3:7a284390b0ce 2145
mbed_official 3:7a284390b0ce 2146 /**
mbed_official 3:7a284390b0ce 2147 * @brief Instance structure for the Q31 CFFT/CIFFT function.
mbed_official 3:7a284390b0ce 2148 */
mbed_official 3:7a284390b0ce 2149
mbed_official 3:7a284390b0ce 2150 typedef struct
mbed_official 3:7a284390b0ce 2151 {
mbed_official 3:7a284390b0ce 2152 uint16_t fftLen; /**< length of the FFT. */
mbed_official 3:7a284390b0ce 2153 uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
mbed_official 3:7a284390b0ce 2154 uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
mbed_official 3:7a284390b0ce 2155 q31_t *pTwiddle; /**< points to the twiddle factor table. */
mbed_official 3:7a284390b0ce 2156 uint16_t *pBitRevTable; /**< points to the bit reversal table. */
mbed_official 3:7a284390b0ce 2157 uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
mbed_official 3:7a284390b0ce 2158 uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
mbed_official 3:7a284390b0ce 2159 } arm_cfft_radix4_instance_q31;
mbed_official 3:7a284390b0ce 2160
mbed_official 3:7a284390b0ce 2161 void arm_cfft_radix4_q31(
mbed_official 3:7a284390b0ce 2162 const arm_cfft_radix4_instance_q31 * S,
mbed_official 3:7a284390b0ce 2163 q31_t * pSrc);
mbed_official 3:7a284390b0ce 2164
mbed_official 3:7a284390b0ce 2165 arm_status arm_cfft_radix4_init_q31(
mbed_official 3:7a284390b0ce 2166 arm_cfft_radix4_instance_q31 * S,
mbed_official 3:7a284390b0ce 2167 uint16_t fftLen,
mbed_official 3:7a284390b0ce 2168 uint8_t ifftFlag,
mbed_official 3:7a284390b0ce 2169 uint8_t bitReverseFlag);
mbed_official 3:7a284390b0ce 2170
emilmont 1:fdd22bb7aa52 2171 /**
emilmont 1:fdd22bb7aa52 2172 * @brief Instance structure for the floating-point CFFT/CIFFT function.
emilmont 1:fdd22bb7aa52 2173 */
emilmont 1:fdd22bb7aa52 2174
emilmont 1:fdd22bb7aa52 2175 typedef struct
emilmont 1:fdd22bb7aa52 2176 {
emilmont 1:fdd22bb7aa52 2177 uint16_t fftLen; /**< length of the FFT. */
emilmont 1:fdd22bb7aa52 2178 uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
emilmont 1:fdd22bb7aa52 2179 uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
emilmont 1:fdd22bb7aa52 2180 float32_t *pTwiddle; /**< points to the Twiddle factor table. */
emilmont 1:fdd22bb7aa52 2181 uint16_t *pBitRevTable; /**< points to the bit reversal table. */
emilmont 1:fdd22bb7aa52 2182 uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
emilmont 1:fdd22bb7aa52 2183 uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
emilmont 1:fdd22bb7aa52 2184 float32_t onebyfftLen; /**< value of 1/fftLen. */
emilmont 1:fdd22bb7aa52 2185 } arm_cfft_radix2_instance_f32;
emilmont 1:fdd22bb7aa52 2186
mbed_official 3:7a284390b0ce 2187 /* Deprecated */
emilmont 1:fdd22bb7aa52 2188 arm_status arm_cfft_radix2_init_f32(
emilmont 1:fdd22bb7aa52 2189 arm_cfft_radix2_instance_f32 * S,
emilmont 1:fdd22bb7aa52 2190 uint16_t fftLen,
emilmont 1:fdd22bb7aa52 2191 uint8_t ifftFlag,
emilmont 1:fdd22bb7aa52 2192 uint8_t bitReverseFlag);
emilmont 1:fdd22bb7aa52 2193
mbed_official 3:7a284390b0ce 2194 /* Deprecated */
mbed_official 3:7a284390b0ce 2195 void arm_cfft_radix2_f32(
mbed_official 3:7a284390b0ce 2196 const arm_cfft_radix2_instance_f32 * S,
emilmont 1:fdd22bb7aa52 2197 float32_t * pSrc);
emilmont 1:fdd22bb7aa52 2198
emilmont 1:fdd22bb7aa52 2199 /**
mbed_official 3:7a284390b0ce 2200 * @brief Instance structure for the floating-point CFFT/CIFFT function.
mbed_official 3:7a284390b0ce 2201 */
mbed_official 3:7a284390b0ce 2202
mbed_official 3:7a284390b0ce 2203 typedef struct
mbed_official 3:7a284390b0ce 2204 {
mbed_official 3:7a284390b0ce 2205 uint16_t fftLen; /**< length of the FFT. */
mbed_official 3:7a284390b0ce 2206 uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
mbed_official 3:7a284390b0ce 2207 uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
mbed_official 3:7a284390b0ce 2208 float32_t *pTwiddle; /**< points to the Twiddle factor table. */
mbed_official 3:7a284390b0ce 2209 uint16_t *pBitRevTable; /**< points to the bit reversal table. */
mbed_official 3:7a284390b0ce 2210 uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
mbed_official 3:7a284390b0ce 2211 uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
mbed_official 3:7a284390b0ce 2212 float32_t onebyfftLen; /**< value of 1/fftLen. */
mbed_official 3:7a284390b0ce 2213 } arm_cfft_radix4_instance_f32;
mbed_official 3:7a284390b0ce 2214
mbed_official 3:7a284390b0ce 2215 /* Deprecated */
emilmont 1:fdd22bb7aa52 2216 arm_status arm_cfft_radix4_init_f32(
emilmont 1:fdd22bb7aa52 2217 arm_cfft_radix4_instance_f32 * S,
emilmont 1:fdd22bb7aa52 2218 uint16_t fftLen,
emilmont 1:fdd22bb7aa52 2219 uint8_t ifftFlag,
emilmont 1:fdd22bb7aa52 2220 uint8_t bitReverseFlag);
emilmont 1:fdd22bb7aa52 2221
mbed_official 3:7a284390b0ce 2222 /* Deprecated */
mbed_official 3:7a284390b0ce 2223 void arm_cfft_radix4_f32(
mbed_official 3:7a284390b0ce 2224 const arm_cfft_radix4_instance_f32 * S,
mbed_official 3:7a284390b0ce 2225 float32_t * pSrc);
mbed_official 3:7a284390b0ce 2226
mbed_official 3:7a284390b0ce 2227 /**
mbed_official 3:7a284390b0ce 2228 * @brief Instance structure for the floating-point CFFT/CIFFT function.
mbed_official 3:7a284390b0ce 2229 */
mbed_official 3:7a284390b0ce 2230
mbed_official 3:7a284390b0ce 2231 typedef struct
mbed_official 3:7a284390b0ce 2232 {
mbed_official 3:7a284390b0ce 2233 uint16_t fftLen; /**< length of the FFT. */
mbed_official 3:7a284390b0ce 2234 const float32_t *pTwiddle; /**< points to the Twiddle factor table. */
mbed_official 3:7a284390b0ce 2235 const uint16_t *pBitRevTable; /**< points to the bit reversal table. */
mbed_official 3:7a284390b0ce 2236 uint16_t bitRevLength; /**< bit reversal table length. */
mbed_official 3:7a284390b0ce 2237 } arm_cfft_instance_f32;
mbed_official 3:7a284390b0ce 2238
mbed_official 3:7a284390b0ce 2239 void arm_cfft_f32(
mbed_official 3:7a284390b0ce 2240 const arm_cfft_instance_f32 * S,
mbed_official 3:7a284390b0ce 2241 float32_t * p1,
mbed_official 3:7a284390b0ce 2242 uint8_t ifftFlag,
mbed_official 3:7a284390b0ce 2243 uint8_t bitReverseFlag);
emilmont 1:fdd22bb7aa52 2244
emilmont 1:fdd22bb7aa52 2245 /**
emilmont 1:fdd22bb7aa52 2246 * @brief Instance structure for the Q15 RFFT/RIFFT function.
emilmont 1:fdd22bb7aa52 2247 */
emilmont 1:fdd22bb7aa52 2248
emilmont 1:fdd22bb7aa52 2249 typedef struct
emilmont 1:fdd22bb7aa52 2250 {
emilmont 1:fdd22bb7aa52 2251 uint32_t fftLenReal; /**< length of the real FFT. */
emilmont 1:fdd22bb7aa52 2252 uint32_t fftLenBy2; /**< length of the complex FFT. */
emilmont 1:fdd22bb7aa52 2253 uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */
emilmont 1:fdd22bb7aa52 2254 uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */
emilmont 1:fdd22bb7aa52 2255 uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
emilmont 1:fdd22bb7aa52 2256 q15_t *pTwiddleAReal; /**< points to the real twiddle factor table. */
emilmont 1:fdd22bb7aa52 2257 q15_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */
emilmont 1:fdd22bb7aa52 2258 arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */
emilmont 1:fdd22bb7aa52 2259 } arm_rfft_instance_q15;
emilmont 1:fdd22bb7aa52 2260
mbed_official 3:7a284390b0ce 2261 arm_status arm_rfft_init_q15(
mbed_official 3:7a284390b0ce 2262 arm_rfft_instance_q15 * S,
mbed_official 3:7a284390b0ce 2263 arm_cfft_radix4_instance_q15 * S_CFFT,
mbed_official 3:7a284390b0ce 2264 uint32_t fftLenReal,
mbed_official 3:7a284390b0ce 2265 uint32_t ifftFlagR,
mbed_official 3:7a284390b0ce 2266 uint32_t bitReverseFlag);
mbed_official 3:7a284390b0ce 2267
mbed_official 3:7a284390b0ce 2268 void arm_rfft_q15(
mbed_official 3:7a284390b0ce 2269 const arm_rfft_instance_q15 * S,
mbed_official 3:7a284390b0ce 2270 q15_t * pSrc,
mbed_official 3:7a284390b0ce 2271 q15_t * pDst);
mbed_official 3:7a284390b0ce 2272
emilmont 1:fdd22bb7aa52 2273 /**
emilmont 1:fdd22bb7aa52 2274 * @brief Instance structure for the Q31 RFFT/RIFFT function.
emilmont 1:fdd22bb7aa52 2275 */
emilmont 1:fdd22bb7aa52 2276
emilmont 1:fdd22bb7aa52 2277 typedef struct
emilmont 1:fdd22bb7aa52 2278 {
emilmont 1:fdd22bb7aa52 2279 uint32_t fftLenReal; /**< length of the real FFT. */
emilmont 1:fdd22bb7aa52 2280 uint32_t fftLenBy2; /**< length of the complex FFT. */
emilmont 1:fdd22bb7aa52 2281 uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */
emilmont 1:fdd22bb7aa52 2282 uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */
emilmont 1:fdd22bb7aa52 2283 uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
emilmont 1:fdd22bb7aa52 2284 q31_t *pTwiddleAReal; /**< points to the real twiddle factor table. */
emilmont 1:fdd22bb7aa52 2285 q31_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */
emilmont 1:fdd22bb7aa52 2286 arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */
emilmont 1:fdd22bb7aa52 2287 } arm_rfft_instance_q31;
emilmont 1:fdd22bb7aa52 2288
mbed_official 3:7a284390b0ce 2289 arm_status arm_rfft_init_q31(
mbed_official 3:7a284390b0ce 2290 arm_rfft_instance_q31 * S,
mbed_official 3:7a284390b0ce 2291 arm_cfft_radix4_instance_q31 * S_CFFT,
mbed_official 3:7a284390b0ce 2292 uint32_t fftLenReal,
mbed_official 3:7a284390b0ce 2293 uint32_t ifftFlagR,
mbed_official 3:7a284390b0ce 2294 uint32_t bitReverseFlag);
mbed_official 3:7a284390b0ce 2295
mbed_official 3:7a284390b0ce 2296 void arm_rfft_q31(
mbed_official 3:7a284390b0ce 2297 const arm_rfft_instance_q31 * S,
mbed_official 3:7a284390b0ce 2298 q31_t * pSrc,
mbed_official 3:7a284390b0ce 2299 q31_t * pDst);
mbed_official 3:7a284390b0ce 2300
emilmont 1:fdd22bb7aa52 2301 /**
emilmont 1:fdd22bb7aa52 2302 * @brief Instance structure for the floating-point RFFT/RIFFT function.
emilmont 1:fdd22bb7aa52 2303 */
emilmont 1:fdd22bb7aa52 2304
emilmont 1:fdd22bb7aa52 2305 typedef struct
emilmont 1:fdd22bb7aa52 2306 {
emilmont 1:fdd22bb7aa52 2307 uint32_t fftLenReal; /**< length of the real FFT. */
emilmont 1:fdd22bb7aa52 2308 uint16_t fftLenBy2; /**< length of the complex FFT. */
emilmont 1:fdd22bb7aa52 2309 uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */
emilmont 1:fdd22bb7aa52 2310 uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */
emilmont 1:fdd22bb7aa52 2311 uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
emilmont 1:fdd22bb7aa52 2312 float32_t *pTwiddleAReal; /**< points to the real twiddle factor table. */
emilmont 1:fdd22bb7aa52 2313 float32_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */
emilmont 1:fdd22bb7aa52 2314 arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */
emilmont 1:fdd22bb7aa52 2315 } arm_rfft_instance_f32;
emilmont 1:fdd22bb7aa52 2316
emilmont 1:fdd22bb7aa52 2317 arm_status arm_rfft_init_f32(
emilmont 1:fdd22bb7aa52 2318 arm_rfft_instance_f32 * S,
emilmont 1:fdd22bb7aa52 2319 arm_cfft_radix4_instance_f32 * S_CFFT,
emilmont 1:fdd22bb7aa52 2320 uint32_t fftLenReal,
emilmont 1:fdd22bb7aa52 2321 uint32_t ifftFlagR,
emilmont 1:fdd22bb7aa52 2322 uint32_t bitReverseFlag);
emilmont 1:fdd22bb7aa52 2323
emilmont 1:fdd22bb7aa52 2324 void arm_rfft_f32(
emilmont 1:fdd22bb7aa52 2325 const arm_rfft_instance_f32 * S,
emilmont 1:fdd22bb7aa52 2326 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 2327 float32_t * pDst);
emilmont 1:fdd22bb7aa52 2328
emilmont 1:fdd22bb7aa52 2329 /**
mbed_official 3:7a284390b0ce 2330 * @brief Instance structure for the floating-point RFFT/RIFFT function.
mbed_official 3:7a284390b0ce 2331 */
mbed_official 3:7a284390b0ce 2332
mbed_official 3:7a284390b0ce 2333 typedef struct
mbed_official 3:7a284390b0ce 2334 {
mbed_official 3:7a284390b0ce 2335 arm_cfft_instance_f32 Sint; /**< Internal CFFT structure. */
mbed_official 3:7a284390b0ce 2336 uint16_t fftLenRFFT; /**< length of the real sequence */
mbed_official 3:7a284390b0ce 2337 float32_t * pTwiddleRFFT; /**< Twiddle factors real stage */
mbed_official 3:7a284390b0ce 2338 } arm_rfft_fast_instance_f32 ;
mbed_official 3:7a284390b0ce 2339
mbed_official 3:7a284390b0ce 2340 arm_status arm_rfft_fast_init_f32 (
mbed_official 3:7a284390b0ce 2341 arm_rfft_fast_instance_f32 * S,
mbed_official 3:7a284390b0ce 2342 uint16_t fftLen);
mbed_official 3:7a284390b0ce 2343
mbed_official 3:7a284390b0ce 2344 void arm_rfft_fast_f32(
mbed_official 3:7a284390b0ce 2345 arm_rfft_fast_instance_f32 * S,
mbed_official 3:7a284390b0ce 2346 float32_t * p, float32_t * pOut,
mbed_official 3:7a284390b0ce 2347 uint8_t ifftFlag);
mbed_official 3:7a284390b0ce 2348
mbed_official 3:7a284390b0ce 2349 /**
emilmont 1:fdd22bb7aa52 2350 * @brief Instance structure for the floating-point DCT4/IDCT4 function.
emilmont 1:fdd22bb7aa52 2351 */
emilmont 1:fdd22bb7aa52 2352
emilmont 1:fdd22bb7aa52 2353 typedef struct
emilmont 1:fdd22bb7aa52 2354 {
emilmont 1:fdd22bb7aa52 2355 uint16_t N; /**< length of the DCT4. */
emilmont 1:fdd22bb7aa52 2356 uint16_t Nby2; /**< half of the length of the DCT4. */
emilmont 1:fdd22bb7aa52 2357 float32_t normalize; /**< normalizing factor. */
emilmont 1:fdd22bb7aa52 2358 float32_t *pTwiddle; /**< points to the twiddle factor table. */
emilmont 1:fdd22bb7aa52 2359 float32_t *pCosFactor; /**< points to the cosFactor table. */
emilmont 1:fdd22bb7aa52 2360 arm_rfft_instance_f32 *pRfft; /**< points to the real FFT instance. */
emilmont 1:fdd22bb7aa52 2361 arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */
emilmont 1:fdd22bb7aa52 2362 } arm_dct4_instance_f32;
emilmont 1:fdd22bb7aa52 2363
emilmont 1:fdd22bb7aa52 2364 /**
emilmont 1:fdd22bb7aa52 2365 * @brief Initialization function for the floating-point DCT4/IDCT4.
emilmont 1:fdd22bb7aa52 2366 * @param[in,out] *S points to an instance of floating-point DCT4/IDCT4 structure.
emilmont 1:fdd22bb7aa52 2367 * @param[in] *S_RFFT points to an instance of floating-point RFFT/RIFFT structure.
emilmont 1:fdd22bb7aa52 2368 * @param[in] *S_CFFT points to an instance of floating-point CFFT/CIFFT structure.
emilmont 1:fdd22bb7aa52 2369 * @param[in] N length of the DCT4.
emilmont 1:fdd22bb7aa52 2370 * @param[in] Nby2 half of the length of the DCT4.
emilmont 1:fdd22bb7aa52 2371 * @param[in] normalize normalizing factor.
emilmont 2:da51fb522205 2372 * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>fftLenReal</code> is not a supported transform length.
emilmont 1:fdd22bb7aa52 2373 */
emilmont 1:fdd22bb7aa52 2374
emilmont 1:fdd22bb7aa52 2375 arm_status arm_dct4_init_f32(
emilmont 1:fdd22bb7aa52 2376 arm_dct4_instance_f32 * S,
emilmont 1:fdd22bb7aa52 2377 arm_rfft_instance_f32 * S_RFFT,
emilmont 1:fdd22bb7aa52 2378 arm_cfft_radix4_instance_f32 * S_CFFT,
emilmont 1:fdd22bb7aa52 2379 uint16_t N,
emilmont 1:fdd22bb7aa52 2380 uint16_t Nby2,
emilmont 1:fdd22bb7aa52 2381 float32_t normalize);
emilmont 1:fdd22bb7aa52 2382
emilmont 1:fdd22bb7aa52 2383 /**
emilmont 1:fdd22bb7aa52 2384 * @brief Processing function for the floating-point DCT4/IDCT4.
emilmont 1:fdd22bb7aa52 2385 * @param[in] *S points to an instance of the floating-point DCT4/IDCT4 structure.
emilmont 1:fdd22bb7aa52 2386 * @param[in] *pState points to state buffer.
emilmont 1:fdd22bb7aa52 2387 * @param[in,out] *pInlineBuffer points to the in-place input and output buffer.
emilmont 1:fdd22bb7aa52 2388 * @return none.
emilmont 1:fdd22bb7aa52 2389 */
emilmont 1:fdd22bb7aa52 2390
emilmont 1:fdd22bb7aa52 2391 void arm_dct4_f32(
emilmont 1:fdd22bb7aa52 2392 const arm_dct4_instance_f32 * S,
emilmont 1:fdd22bb7aa52 2393 float32_t * pState,
emilmont 1:fdd22bb7aa52 2394 float32_t * pInlineBuffer);
emilmont 1:fdd22bb7aa52 2395
emilmont 1:fdd22bb7aa52 2396 /**
emilmont 1:fdd22bb7aa52 2397 * @brief Instance structure for the Q31 DCT4/IDCT4 function.
emilmont 1:fdd22bb7aa52 2398 */
emilmont 1:fdd22bb7aa52 2399
emilmont 1:fdd22bb7aa52 2400 typedef struct
emilmont 1:fdd22bb7aa52 2401 {
emilmont 1:fdd22bb7aa52 2402 uint16_t N; /**< length of the DCT4. */
emilmont 1:fdd22bb7aa52 2403 uint16_t Nby2; /**< half of the length of the DCT4. */
emilmont 1:fdd22bb7aa52 2404 q31_t normalize; /**< normalizing factor. */
emilmont 1:fdd22bb7aa52 2405 q31_t *pTwiddle; /**< points to the twiddle factor table. */
emilmont 1:fdd22bb7aa52 2406 q31_t *pCosFactor; /**< points to the cosFactor table. */
emilmont 1:fdd22bb7aa52 2407 arm_rfft_instance_q31 *pRfft; /**< points to the real FFT instance. */
emilmont 1:fdd22bb7aa52 2408 arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */
emilmont 1:fdd22bb7aa52 2409 } arm_dct4_instance_q31;
emilmont 1:fdd22bb7aa52 2410
emilmont 1:fdd22bb7aa52 2411 /**
emilmont 1:fdd22bb7aa52 2412 * @brief Initialization function for the Q31 DCT4/IDCT4.
emilmont 1:fdd22bb7aa52 2413 * @param[in,out] *S points to an instance of Q31 DCT4/IDCT4 structure.
emilmont 1:fdd22bb7aa52 2414 * @param[in] *S_RFFT points to an instance of Q31 RFFT/RIFFT structure
emilmont 1:fdd22bb7aa52 2415 * @param[in] *S_CFFT points to an instance of Q31 CFFT/CIFFT structure
emilmont 1:fdd22bb7aa52 2416 * @param[in] N length of the DCT4.
emilmont 1:fdd22bb7aa52 2417 * @param[in] Nby2 half of the length of the DCT4.
emilmont 1:fdd22bb7aa52 2418 * @param[in] normalize normalizing factor.
emilmont 2:da51fb522205 2419 * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>N</code> is not a supported transform length.
emilmont 1:fdd22bb7aa52 2420 */
emilmont 1:fdd22bb7aa52 2421
emilmont 1:fdd22bb7aa52 2422 arm_status arm_dct4_init_q31(
emilmont 1:fdd22bb7aa52 2423 arm_dct4_instance_q31 * S,
emilmont 1:fdd22bb7aa52 2424 arm_rfft_instance_q31 * S_RFFT,
emilmont 1:fdd22bb7aa52 2425 arm_cfft_radix4_instance_q31 * S_CFFT,
emilmont 1:fdd22bb7aa52 2426 uint16_t N,
emilmont 1:fdd22bb7aa52 2427 uint16_t Nby2,
emilmont 1:fdd22bb7aa52 2428 q31_t normalize);
emilmont 1:fdd22bb7aa52 2429
emilmont 1:fdd22bb7aa52 2430 /**
emilmont 1:fdd22bb7aa52 2431 * @brief Processing function for the Q31 DCT4/IDCT4.
emilmont 1:fdd22bb7aa52 2432 * @param[in] *S points to an instance of the Q31 DCT4 structure.
emilmont 1:fdd22bb7aa52 2433 * @param[in] *pState points to state buffer.
emilmont 1:fdd22bb7aa52 2434 * @param[in,out] *pInlineBuffer points to the in-place input and output buffer.
emilmont 1:fdd22bb7aa52 2435 * @return none.
emilmont 1:fdd22bb7aa52 2436 */
emilmont 1:fdd22bb7aa52 2437
emilmont 1:fdd22bb7aa52 2438 void arm_dct4_q31(
emilmont 1:fdd22bb7aa52 2439 const arm_dct4_instance_q31 * S,
emilmont 1:fdd22bb7aa52 2440 q31_t * pState,
emilmont 1:fdd22bb7aa52 2441 q31_t * pInlineBuffer);
emilmont 1:fdd22bb7aa52 2442
emilmont 1:fdd22bb7aa52 2443 /**
emilmont 1:fdd22bb7aa52 2444 * @brief Instance structure for the Q15 DCT4/IDCT4 function.
emilmont 1:fdd22bb7aa52 2445 */
emilmont 1:fdd22bb7aa52 2446
emilmont 1:fdd22bb7aa52 2447 typedef struct
emilmont 1:fdd22bb7aa52 2448 {
emilmont 1:fdd22bb7aa52 2449 uint16_t N; /**< length of the DCT4. */
emilmont 1:fdd22bb7aa52 2450 uint16_t Nby2; /**< half of the length of the DCT4. */
emilmont 1:fdd22bb7aa52 2451 q15_t normalize; /**< normalizing factor. */
emilmont 1:fdd22bb7aa52 2452 q15_t *pTwiddle; /**< points to the twiddle factor table. */
emilmont 1:fdd22bb7aa52 2453 q15_t *pCosFactor; /**< points to the cosFactor table. */
emilmont 1:fdd22bb7aa52 2454 arm_rfft_instance_q15 *pRfft; /**< points to the real FFT instance. */
emilmont 1:fdd22bb7aa52 2455 arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */
emilmont 1:fdd22bb7aa52 2456 } arm_dct4_instance_q15;
emilmont 1:fdd22bb7aa52 2457
emilmont 1:fdd22bb7aa52 2458 /**
emilmont 1:fdd22bb7aa52 2459 * @brief Initialization function for the Q15 DCT4/IDCT4.
emilmont 1:fdd22bb7aa52 2460 * @param[in,out] *S points to an instance of Q15 DCT4/IDCT4 structure.
emilmont 1:fdd22bb7aa52 2461 * @param[in] *S_RFFT points to an instance of Q15 RFFT/RIFFT structure.
emilmont 1:fdd22bb7aa52 2462 * @param[in] *S_CFFT points to an instance of Q15 CFFT/CIFFT structure.
emilmont 1:fdd22bb7aa52 2463 * @param[in] N length of the DCT4.
emilmont 1:fdd22bb7aa52 2464 * @param[in] Nby2 half of the length of the DCT4.
emilmont 1:fdd22bb7aa52 2465 * @param[in] normalize normalizing factor.
emilmont 2:da51fb522205 2466 * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>N</code> is not a supported transform length.
emilmont 1:fdd22bb7aa52 2467 */
emilmont 1:fdd22bb7aa52 2468
emilmont 1:fdd22bb7aa52 2469 arm_status arm_dct4_init_q15(
emilmont 1:fdd22bb7aa52 2470 arm_dct4_instance_q15 * S,
emilmont 1:fdd22bb7aa52 2471 arm_rfft_instance_q15 * S_RFFT,
emilmont 1:fdd22bb7aa52 2472 arm_cfft_radix4_instance_q15 * S_CFFT,
emilmont 1:fdd22bb7aa52 2473 uint16_t N,
emilmont 1:fdd22bb7aa52 2474 uint16_t Nby2,
emilmont 1:fdd22bb7aa52 2475 q15_t normalize);
emilmont 1:fdd22bb7aa52 2476
emilmont 1:fdd22bb7aa52 2477 /**
emilmont 1:fdd22bb7aa52 2478 * @brief Processing function for the Q15 DCT4/IDCT4.
emilmont 1:fdd22bb7aa52 2479 * @param[in] *S points to an instance of the Q15 DCT4 structure.
emilmont 1:fdd22bb7aa52 2480 * @param[in] *pState points to state buffer.
emilmont 1:fdd22bb7aa52 2481 * @param[in,out] *pInlineBuffer points to the in-place input and output buffer.
emilmont 1:fdd22bb7aa52 2482 * @return none.
emilmont 1:fdd22bb7aa52 2483 */
emilmont 1:fdd22bb7aa52 2484
emilmont 1:fdd22bb7aa52 2485 void arm_dct4_q15(
emilmont 1:fdd22bb7aa52 2486 const arm_dct4_instance_q15 * S,
emilmont 1:fdd22bb7aa52 2487 q15_t * pState,
emilmont 1:fdd22bb7aa52 2488 q15_t * pInlineBuffer);
emilmont 1:fdd22bb7aa52 2489
emilmont 1:fdd22bb7aa52 2490 /**
emilmont 1:fdd22bb7aa52 2491 * @brief Floating-point vector addition.
emilmont 1:fdd22bb7aa52 2492 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 2493 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 2494 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2495 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2496 * @return none.
emilmont 1:fdd22bb7aa52 2497 */
emilmont 1:fdd22bb7aa52 2498
emilmont 1:fdd22bb7aa52 2499 void arm_add_f32(
emilmont 1:fdd22bb7aa52 2500 float32_t * pSrcA,
emilmont 1:fdd22bb7aa52 2501 float32_t * pSrcB,
emilmont 1:fdd22bb7aa52 2502 float32_t * pDst,
emilmont 1:fdd22bb7aa52 2503 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2504
emilmont 1:fdd22bb7aa52 2505 /**
emilmont 1:fdd22bb7aa52 2506 * @brief Q7 vector addition.
emilmont 1:fdd22bb7aa52 2507 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 2508 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 2509 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2510 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2511 * @return none.
emilmont 1:fdd22bb7aa52 2512 */
emilmont 1:fdd22bb7aa52 2513
emilmont 1:fdd22bb7aa52 2514 void arm_add_q7(
emilmont 1:fdd22bb7aa52 2515 q7_t * pSrcA,
emilmont 1:fdd22bb7aa52 2516 q7_t * pSrcB,
emilmont 1:fdd22bb7aa52 2517 q7_t * pDst,
emilmont 1:fdd22bb7aa52 2518 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2519
emilmont 1:fdd22bb7aa52 2520 /**
emilmont 1:fdd22bb7aa52 2521 * @brief Q15 vector addition.
emilmont 1:fdd22bb7aa52 2522 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 2523 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 2524 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2525 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2526 * @return none.
emilmont 1:fdd22bb7aa52 2527 */
emilmont 1:fdd22bb7aa52 2528
emilmont 1:fdd22bb7aa52 2529 void arm_add_q15(
emilmont 1:fdd22bb7aa52 2530 q15_t * pSrcA,
emilmont 1:fdd22bb7aa52 2531 q15_t * pSrcB,
emilmont 1:fdd22bb7aa52 2532 q15_t * pDst,
emilmont 1:fdd22bb7aa52 2533 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2534
emilmont 1:fdd22bb7aa52 2535 /**
emilmont 1:fdd22bb7aa52 2536 * @brief Q31 vector addition.
emilmont 1:fdd22bb7aa52 2537 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 2538 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 2539 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2540 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2541 * @return none.
emilmont 1:fdd22bb7aa52 2542 */
emilmont 1:fdd22bb7aa52 2543
emilmont 1:fdd22bb7aa52 2544 void arm_add_q31(
emilmont 1:fdd22bb7aa52 2545 q31_t * pSrcA,
emilmont 1:fdd22bb7aa52 2546 q31_t * pSrcB,
emilmont 1:fdd22bb7aa52 2547 q31_t * pDst,
emilmont 1:fdd22bb7aa52 2548 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2549
emilmont 1:fdd22bb7aa52 2550 /**
emilmont 1:fdd22bb7aa52 2551 * @brief Floating-point vector subtraction.
emilmont 1:fdd22bb7aa52 2552 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 2553 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 2554 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2555 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2556 * @return none.
emilmont 1:fdd22bb7aa52 2557 */
emilmont 1:fdd22bb7aa52 2558
emilmont 1:fdd22bb7aa52 2559 void arm_sub_f32(
emilmont 1:fdd22bb7aa52 2560 float32_t * pSrcA,
emilmont 1:fdd22bb7aa52 2561 float32_t * pSrcB,
emilmont 1:fdd22bb7aa52 2562 float32_t * pDst,
emilmont 1:fdd22bb7aa52 2563 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2564
emilmont 1:fdd22bb7aa52 2565 /**
emilmont 1:fdd22bb7aa52 2566 * @brief Q7 vector subtraction.
emilmont 1:fdd22bb7aa52 2567 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 2568 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 2569 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2570 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2571 * @return none.
emilmont 1:fdd22bb7aa52 2572 */
emilmont 1:fdd22bb7aa52 2573
emilmont 1:fdd22bb7aa52 2574 void arm_sub_q7(
emilmont 1:fdd22bb7aa52 2575 q7_t * pSrcA,
emilmont 1:fdd22bb7aa52 2576 q7_t * pSrcB,
emilmont 1:fdd22bb7aa52 2577 q7_t * pDst,
emilmont 1:fdd22bb7aa52 2578 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2579
emilmont 1:fdd22bb7aa52 2580 /**
emilmont 1:fdd22bb7aa52 2581 * @brief Q15 vector subtraction.
emilmont 1:fdd22bb7aa52 2582 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 2583 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 2584 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2585 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2586 * @return none.
emilmont 1:fdd22bb7aa52 2587 */
emilmont 1:fdd22bb7aa52 2588
emilmont 1:fdd22bb7aa52 2589 void arm_sub_q15(
emilmont 1:fdd22bb7aa52 2590 q15_t * pSrcA,
emilmont 1:fdd22bb7aa52 2591 q15_t * pSrcB,
emilmont 1:fdd22bb7aa52 2592 q15_t * pDst,
emilmont 1:fdd22bb7aa52 2593 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2594
emilmont 1:fdd22bb7aa52 2595 /**
emilmont 1:fdd22bb7aa52 2596 * @brief Q31 vector subtraction.
emilmont 1:fdd22bb7aa52 2597 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 2598 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 2599 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2600 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2601 * @return none.
emilmont 1:fdd22bb7aa52 2602 */
emilmont 1:fdd22bb7aa52 2603
emilmont 1:fdd22bb7aa52 2604 void arm_sub_q31(
emilmont 1:fdd22bb7aa52 2605 q31_t * pSrcA,
emilmont 1:fdd22bb7aa52 2606 q31_t * pSrcB,
emilmont 1:fdd22bb7aa52 2607 q31_t * pDst,
emilmont 1:fdd22bb7aa52 2608 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2609
emilmont 1:fdd22bb7aa52 2610 /**
emilmont 1:fdd22bb7aa52 2611 * @brief Multiplies a floating-point vector by a scalar.
emilmont 1:fdd22bb7aa52 2612 * @param[in] *pSrc points to the input vector
emilmont 1:fdd22bb7aa52 2613 * @param[in] scale scale factor to be applied
emilmont 1:fdd22bb7aa52 2614 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2615 * @param[in] blockSize number of samples in the vector
emilmont 1:fdd22bb7aa52 2616 * @return none.
emilmont 1:fdd22bb7aa52 2617 */
emilmont 1:fdd22bb7aa52 2618
emilmont 1:fdd22bb7aa52 2619 void arm_scale_f32(
emilmont 1:fdd22bb7aa52 2620 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 2621 float32_t scale,
emilmont 1:fdd22bb7aa52 2622 float32_t * pDst,
emilmont 1:fdd22bb7aa52 2623 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2624
emilmont 1:fdd22bb7aa52 2625 /**
emilmont 1:fdd22bb7aa52 2626 * @brief Multiplies a Q7 vector by a scalar.
emilmont 1:fdd22bb7aa52 2627 * @param[in] *pSrc points to the input vector
emilmont 1:fdd22bb7aa52 2628 * @param[in] scaleFract fractional portion of the scale value
emilmont 1:fdd22bb7aa52 2629 * @param[in] shift number of bits to shift the result by
emilmont 1:fdd22bb7aa52 2630 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2631 * @param[in] blockSize number of samples in the vector
emilmont 1:fdd22bb7aa52 2632 * @return none.
emilmont 1:fdd22bb7aa52 2633 */
emilmont 1:fdd22bb7aa52 2634
emilmont 1:fdd22bb7aa52 2635 void arm_scale_q7(
emilmont 1:fdd22bb7aa52 2636 q7_t * pSrc,
emilmont 1:fdd22bb7aa52 2637 q7_t scaleFract,
emilmont 1:fdd22bb7aa52 2638 int8_t shift,
emilmont 1:fdd22bb7aa52 2639 q7_t * pDst,
emilmont 1:fdd22bb7aa52 2640 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2641
emilmont 1:fdd22bb7aa52 2642 /**
emilmont 1:fdd22bb7aa52 2643 * @brief Multiplies a Q15 vector by a scalar.
emilmont 1:fdd22bb7aa52 2644 * @param[in] *pSrc points to the input vector
emilmont 1:fdd22bb7aa52 2645 * @param[in] scaleFract fractional portion of the scale value
emilmont 1:fdd22bb7aa52 2646 * @param[in] shift number of bits to shift the result by
emilmont 1:fdd22bb7aa52 2647 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2648 * @param[in] blockSize number of samples in the vector
emilmont 1:fdd22bb7aa52 2649 * @return none.
emilmont 1:fdd22bb7aa52 2650 */
emilmont 1:fdd22bb7aa52 2651
emilmont 1:fdd22bb7aa52 2652 void arm_scale_q15(
emilmont 1:fdd22bb7aa52 2653 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 2654 q15_t scaleFract,
emilmont 1:fdd22bb7aa52 2655 int8_t shift,
emilmont 1:fdd22bb7aa52 2656 q15_t * pDst,
emilmont 1:fdd22bb7aa52 2657 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2658
emilmont 1:fdd22bb7aa52 2659 /**
emilmont 1:fdd22bb7aa52 2660 * @brief Multiplies a Q31 vector by a scalar.
emilmont 1:fdd22bb7aa52 2661 * @param[in] *pSrc points to the input vector
emilmont 1:fdd22bb7aa52 2662 * @param[in] scaleFract fractional portion of the scale value
emilmont 1:fdd22bb7aa52 2663 * @param[in] shift number of bits to shift the result by
emilmont 1:fdd22bb7aa52 2664 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2665 * @param[in] blockSize number of samples in the vector
emilmont 1:fdd22bb7aa52 2666 * @return none.
emilmont 1:fdd22bb7aa52 2667 */
emilmont 1:fdd22bb7aa52 2668
emilmont 1:fdd22bb7aa52 2669 void arm_scale_q31(
emilmont 1:fdd22bb7aa52 2670 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 2671 q31_t scaleFract,
emilmont 1:fdd22bb7aa52 2672 int8_t shift,
emilmont 1:fdd22bb7aa52 2673 q31_t * pDst,
emilmont 1:fdd22bb7aa52 2674 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2675
emilmont 1:fdd22bb7aa52 2676 /**
emilmont 1:fdd22bb7aa52 2677 * @brief Q7 vector absolute value.
emilmont 1:fdd22bb7aa52 2678 * @param[in] *pSrc points to the input buffer
emilmont 1:fdd22bb7aa52 2679 * @param[out] *pDst points to the output buffer
emilmont 1:fdd22bb7aa52 2680 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2681 * @return none.
emilmont 1:fdd22bb7aa52 2682 */
emilmont 1:fdd22bb7aa52 2683
emilmont 1:fdd22bb7aa52 2684 void arm_abs_q7(
emilmont 1:fdd22bb7aa52 2685 q7_t * pSrc,
emilmont 1:fdd22bb7aa52 2686 q7_t * pDst,
emilmont 1:fdd22bb7aa52 2687 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2688
emilmont 1:fdd22bb7aa52 2689 /**
emilmont 1:fdd22bb7aa52 2690 * @brief Floating-point vector absolute value.
emilmont 1:fdd22bb7aa52 2691 * @param[in] *pSrc points to the input buffer
emilmont 1:fdd22bb7aa52 2692 * @param[out] *pDst points to the output buffer
emilmont 1:fdd22bb7aa52 2693 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2694 * @return none.
emilmont 1:fdd22bb7aa52 2695 */
emilmont 1:fdd22bb7aa52 2696
emilmont 1:fdd22bb7aa52 2697 void arm_abs_f32(
emilmont 1:fdd22bb7aa52 2698 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 2699 float32_t * pDst,
emilmont 1:fdd22bb7aa52 2700 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2701
emilmont 1:fdd22bb7aa52 2702 /**
emilmont 1:fdd22bb7aa52 2703 * @brief Q15 vector absolute value.
emilmont 1:fdd22bb7aa52 2704 * @param[in] *pSrc points to the input buffer
emilmont 1:fdd22bb7aa52 2705 * @param[out] *pDst points to the output buffer
emilmont 1:fdd22bb7aa52 2706 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2707 * @return none.
emilmont 1:fdd22bb7aa52 2708 */
emilmont 1:fdd22bb7aa52 2709
emilmont 1:fdd22bb7aa52 2710 void arm_abs_q15(
emilmont 1:fdd22bb7aa52 2711 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 2712 q15_t * pDst,
emilmont 1:fdd22bb7aa52 2713 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2714
emilmont 1:fdd22bb7aa52 2715 /**
emilmont 1:fdd22bb7aa52 2716 * @brief Q31 vector absolute value.
emilmont 1:fdd22bb7aa52 2717 * @param[in] *pSrc points to the input buffer
emilmont 1:fdd22bb7aa52 2718 * @param[out] *pDst points to the output buffer
emilmont 1:fdd22bb7aa52 2719 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2720 * @return none.
emilmont 1:fdd22bb7aa52 2721 */
emilmont 1:fdd22bb7aa52 2722
emilmont 1:fdd22bb7aa52 2723 void arm_abs_q31(
emilmont 1:fdd22bb7aa52 2724 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 2725 q31_t * pDst,
emilmont 1:fdd22bb7aa52 2726 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2727
emilmont 1:fdd22bb7aa52 2728 /**
emilmont 1:fdd22bb7aa52 2729 * @brief Dot product of floating-point vectors.
emilmont 1:fdd22bb7aa52 2730 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 2731 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 2732 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2733 * @param[out] *result output result returned here
emilmont 1:fdd22bb7aa52 2734 * @return none.
emilmont 1:fdd22bb7aa52 2735 */
emilmont 1:fdd22bb7aa52 2736
emilmont 1:fdd22bb7aa52 2737 void arm_dot_prod_f32(
emilmont 1:fdd22bb7aa52 2738 float32_t * pSrcA,
emilmont 1:fdd22bb7aa52 2739 float32_t * pSrcB,
emilmont 1:fdd22bb7aa52 2740 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 2741 float32_t * result);
emilmont 1:fdd22bb7aa52 2742
emilmont 1:fdd22bb7aa52 2743 /**
emilmont 1:fdd22bb7aa52 2744 * @brief Dot product of Q7 vectors.
emilmont 1:fdd22bb7aa52 2745 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 2746 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 2747 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2748 * @param[out] *result output result returned here
emilmont 1:fdd22bb7aa52 2749 * @return none.
emilmont 1:fdd22bb7aa52 2750 */
emilmont 1:fdd22bb7aa52 2751
emilmont 1:fdd22bb7aa52 2752 void arm_dot_prod_q7(
emilmont 1:fdd22bb7aa52 2753 q7_t * pSrcA,
emilmont 1:fdd22bb7aa52 2754 q7_t * pSrcB,
emilmont 1:fdd22bb7aa52 2755 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 2756 q31_t * result);
emilmont 1:fdd22bb7aa52 2757
emilmont 1:fdd22bb7aa52 2758 /**
emilmont 1:fdd22bb7aa52 2759 * @brief Dot product of Q15 vectors.
emilmont 1:fdd22bb7aa52 2760 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 2761 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 2762 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2763 * @param[out] *result output result returned here
emilmont 1:fdd22bb7aa52 2764 * @return none.
emilmont 1:fdd22bb7aa52 2765 */
emilmont 1:fdd22bb7aa52 2766
emilmont 1:fdd22bb7aa52 2767 void arm_dot_prod_q15(
emilmont 1:fdd22bb7aa52 2768 q15_t * pSrcA,
emilmont 1:fdd22bb7aa52 2769 q15_t * pSrcB,
emilmont 1:fdd22bb7aa52 2770 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 2771 q63_t * result);
emilmont 1:fdd22bb7aa52 2772
emilmont 1:fdd22bb7aa52 2773 /**
emilmont 1:fdd22bb7aa52 2774 * @brief Dot product of Q31 vectors.
emilmont 1:fdd22bb7aa52 2775 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 2776 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 2777 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2778 * @param[out] *result output result returned here
emilmont 1:fdd22bb7aa52 2779 * @return none.
emilmont 1:fdd22bb7aa52 2780 */
emilmont 1:fdd22bb7aa52 2781
emilmont 1:fdd22bb7aa52 2782 void arm_dot_prod_q31(
emilmont 1:fdd22bb7aa52 2783 q31_t * pSrcA,
emilmont 1:fdd22bb7aa52 2784 q31_t * pSrcB,
emilmont 1:fdd22bb7aa52 2785 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 2786 q63_t * result);
emilmont 1:fdd22bb7aa52 2787
emilmont 1:fdd22bb7aa52 2788 /**
emilmont 1:fdd22bb7aa52 2789 * @brief Shifts the elements of a Q7 vector a specified number of bits.
emilmont 1:fdd22bb7aa52 2790 * @param[in] *pSrc points to the input vector
emilmont 1:fdd22bb7aa52 2791 * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right.
emilmont 1:fdd22bb7aa52 2792 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2793 * @param[in] blockSize number of samples in the vector
emilmont 1:fdd22bb7aa52 2794 * @return none.
emilmont 1:fdd22bb7aa52 2795 */
emilmont 1:fdd22bb7aa52 2796
emilmont 1:fdd22bb7aa52 2797 void arm_shift_q7(
emilmont 1:fdd22bb7aa52 2798 q7_t * pSrc,
emilmont 1:fdd22bb7aa52 2799 int8_t shiftBits,
emilmont 1:fdd22bb7aa52 2800 q7_t * pDst,
emilmont 1:fdd22bb7aa52 2801 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2802
emilmont 1:fdd22bb7aa52 2803 /**
emilmont 1:fdd22bb7aa52 2804 * @brief Shifts the elements of a Q15 vector a specified number of bits.
emilmont 1:fdd22bb7aa52 2805 * @param[in] *pSrc points to the input vector
emilmont 1:fdd22bb7aa52 2806 * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right.
emilmont 1:fdd22bb7aa52 2807 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2808 * @param[in] blockSize number of samples in the vector
emilmont 1:fdd22bb7aa52 2809 * @return none.
emilmont 1:fdd22bb7aa52 2810 */
emilmont 1:fdd22bb7aa52 2811
emilmont 1:fdd22bb7aa52 2812 void arm_shift_q15(
emilmont 1:fdd22bb7aa52 2813 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 2814 int8_t shiftBits,
emilmont 1:fdd22bb7aa52 2815 q15_t * pDst,
emilmont 1:fdd22bb7aa52 2816 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2817
emilmont 1:fdd22bb7aa52 2818 /**
emilmont 1:fdd22bb7aa52 2819 * @brief Shifts the elements of a Q31 vector a specified number of bits.
emilmont 1:fdd22bb7aa52 2820 * @param[in] *pSrc points to the input vector
emilmont 1:fdd22bb7aa52 2821 * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right.
emilmont 1:fdd22bb7aa52 2822 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2823 * @param[in] blockSize number of samples in the vector
emilmont 1:fdd22bb7aa52 2824 * @return none.
emilmont 1:fdd22bb7aa52 2825 */
emilmont 1:fdd22bb7aa52 2826
emilmont 1:fdd22bb7aa52 2827 void arm_shift_q31(
emilmont 1:fdd22bb7aa52 2828 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 2829 int8_t shiftBits,
emilmont 1:fdd22bb7aa52 2830 q31_t * pDst,
emilmont 1:fdd22bb7aa52 2831 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2832
emilmont 1:fdd22bb7aa52 2833 /**
emilmont 1:fdd22bb7aa52 2834 * @brief Adds a constant offset to a floating-point vector.
emilmont 1:fdd22bb7aa52 2835 * @param[in] *pSrc points to the input vector
emilmont 1:fdd22bb7aa52 2836 * @param[in] offset is the offset to be added
emilmont 1:fdd22bb7aa52 2837 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2838 * @param[in] blockSize number of samples in the vector
emilmont 1:fdd22bb7aa52 2839 * @return none.
emilmont 1:fdd22bb7aa52 2840 */
emilmont 1:fdd22bb7aa52 2841
emilmont 1:fdd22bb7aa52 2842 void arm_offset_f32(
emilmont 1:fdd22bb7aa52 2843 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 2844 float32_t offset,
emilmont 1:fdd22bb7aa52 2845 float32_t * pDst,
emilmont 1:fdd22bb7aa52 2846 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2847
emilmont 1:fdd22bb7aa52 2848 /**
emilmont 1:fdd22bb7aa52 2849 * @brief Adds a constant offset to a Q7 vector.
emilmont 1:fdd22bb7aa52 2850 * @param[in] *pSrc points to the input vector
emilmont 1:fdd22bb7aa52 2851 * @param[in] offset is the offset to be added
emilmont 1:fdd22bb7aa52 2852 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2853 * @param[in] blockSize number of samples in the vector
emilmont 1:fdd22bb7aa52 2854 * @return none.
emilmont 1:fdd22bb7aa52 2855 */
emilmont 1:fdd22bb7aa52 2856
emilmont 1:fdd22bb7aa52 2857 void arm_offset_q7(
emilmont 1:fdd22bb7aa52 2858 q7_t * pSrc,
emilmont 1:fdd22bb7aa52 2859 q7_t offset,
emilmont 1:fdd22bb7aa52 2860 q7_t * pDst,
emilmont 1:fdd22bb7aa52 2861 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2862
emilmont 1:fdd22bb7aa52 2863 /**
emilmont 1:fdd22bb7aa52 2864 * @brief Adds a constant offset to a Q15 vector.
emilmont 1:fdd22bb7aa52 2865 * @param[in] *pSrc points to the input vector
emilmont 1:fdd22bb7aa52 2866 * @param[in] offset is the offset to be added
emilmont 1:fdd22bb7aa52 2867 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2868 * @param[in] blockSize number of samples in the vector
emilmont 1:fdd22bb7aa52 2869 * @return none.
emilmont 1:fdd22bb7aa52 2870 */
emilmont 1:fdd22bb7aa52 2871
emilmont 1:fdd22bb7aa52 2872 void arm_offset_q15(
emilmont 1:fdd22bb7aa52 2873 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 2874 q15_t offset,
emilmont 1:fdd22bb7aa52 2875 q15_t * pDst,
emilmont 1:fdd22bb7aa52 2876 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2877
emilmont 1:fdd22bb7aa52 2878 /**
emilmont 1:fdd22bb7aa52 2879 * @brief Adds a constant offset to a Q31 vector.
emilmont 1:fdd22bb7aa52 2880 * @param[in] *pSrc points to the input vector
emilmont 1:fdd22bb7aa52 2881 * @param[in] offset is the offset to be added
emilmont 1:fdd22bb7aa52 2882 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2883 * @param[in] blockSize number of samples in the vector
emilmont 1:fdd22bb7aa52 2884 * @return none.
emilmont 1:fdd22bb7aa52 2885 */
emilmont 1:fdd22bb7aa52 2886
emilmont 1:fdd22bb7aa52 2887 void arm_offset_q31(
emilmont 1:fdd22bb7aa52 2888 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 2889 q31_t offset,
emilmont 1:fdd22bb7aa52 2890 q31_t * pDst,
emilmont 1:fdd22bb7aa52 2891 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2892
emilmont 1:fdd22bb7aa52 2893 /**
emilmont 1:fdd22bb7aa52 2894 * @brief Negates the elements of a floating-point vector.
emilmont 1:fdd22bb7aa52 2895 * @param[in] *pSrc points to the input vector
emilmont 1:fdd22bb7aa52 2896 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2897 * @param[in] blockSize number of samples in the vector
emilmont 1:fdd22bb7aa52 2898 * @return none.
emilmont 1:fdd22bb7aa52 2899 */
emilmont 1:fdd22bb7aa52 2900
emilmont 1:fdd22bb7aa52 2901 void arm_negate_f32(
emilmont 1:fdd22bb7aa52 2902 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 2903 float32_t * pDst,
emilmont 1:fdd22bb7aa52 2904 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2905
emilmont 1:fdd22bb7aa52 2906 /**
emilmont 1:fdd22bb7aa52 2907 * @brief Negates the elements of a Q7 vector.
emilmont 1:fdd22bb7aa52 2908 * @param[in] *pSrc points to the input vector
emilmont 1:fdd22bb7aa52 2909 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2910 * @param[in] blockSize number of samples in the vector
emilmont 1:fdd22bb7aa52 2911 * @return none.
emilmont 1:fdd22bb7aa52 2912 */
emilmont 1:fdd22bb7aa52 2913
emilmont 1:fdd22bb7aa52 2914 void arm_negate_q7(
emilmont 1:fdd22bb7aa52 2915 q7_t * pSrc,
emilmont 1:fdd22bb7aa52 2916 q7_t * pDst,
emilmont 1:fdd22bb7aa52 2917 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2918
emilmont 1:fdd22bb7aa52 2919 /**
emilmont 1:fdd22bb7aa52 2920 * @brief Negates the elements of a Q15 vector.
emilmont 1:fdd22bb7aa52 2921 * @param[in] *pSrc points to the input vector
emilmont 1:fdd22bb7aa52 2922 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2923 * @param[in] blockSize number of samples in the vector
emilmont 1:fdd22bb7aa52 2924 * @return none.
emilmont 1:fdd22bb7aa52 2925 */
emilmont 1:fdd22bb7aa52 2926
emilmont 1:fdd22bb7aa52 2927 void arm_negate_q15(
emilmont 1:fdd22bb7aa52 2928 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 2929 q15_t * pDst,
emilmont 1:fdd22bb7aa52 2930 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2931
emilmont 1:fdd22bb7aa52 2932 /**
emilmont 1:fdd22bb7aa52 2933 * @brief Negates the elements of a Q31 vector.
emilmont 1:fdd22bb7aa52 2934 * @param[in] *pSrc points to the input vector
emilmont 1:fdd22bb7aa52 2935 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2936 * @param[in] blockSize number of samples in the vector
emilmont 1:fdd22bb7aa52 2937 * @return none.
emilmont 1:fdd22bb7aa52 2938 */
emilmont 1:fdd22bb7aa52 2939
emilmont 1:fdd22bb7aa52 2940 void arm_negate_q31(
emilmont 1:fdd22bb7aa52 2941 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 2942 q31_t * pDst,
emilmont 1:fdd22bb7aa52 2943 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2944 /**
mbed_official 3:7a284390b0ce 2945 * @brief Copies the elements of a floating-point vector.
emilmont 1:fdd22bb7aa52 2946 * @param[in] *pSrc input pointer
emilmont 1:fdd22bb7aa52 2947 * @param[out] *pDst output pointer
emilmont 1:fdd22bb7aa52 2948 * @param[in] blockSize number of samples to process
emilmont 1:fdd22bb7aa52 2949 * @return none.
emilmont 1:fdd22bb7aa52 2950 */
emilmont 1:fdd22bb7aa52 2951 void arm_copy_f32(
emilmont 1:fdd22bb7aa52 2952 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 2953 float32_t * pDst,
emilmont 1:fdd22bb7aa52 2954 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2955
emilmont 1:fdd22bb7aa52 2956 /**
mbed_official 3:7a284390b0ce 2957 * @brief Copies the elements of a Q7 vector.
emilmont 1:fdd22bb7aa52 2958 * @param[in] *pSrc input pointer
emilmont 1:fdd22bb7aa52 2959 * @param[out] *pDst output pointer
emilmont 1:fdd22bb7aa52 2960 * @param[in] blockSize number of samples to process
emilmont 1:fdd22bb7aa52 2961 * @return none.
emilmont 1:fdd22bb7aa52 2962 */
emilmont 1:fdd22bb7aa52 2963 void arm_copy_q7(
emilmont 1:fdd22bb7aa52 2964 q7_t * pSrc,
emilmont 1:fdd22bb7aa52 2965 q7_t * pDst,
emilmont 1:fdd22bb7aa52 2966 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2967
emilmont 1:fdd22bb7aa52 2968 /**
mbed_official 3:7a284390b0ce 2969 * @brief Copies the elements of a Q15 vector.
emilmont 1:fdd22bb7aa52 2970 * @param[in] *pSrc input pointer
emilmont 1:fdd22bb7aa52 2971 * @param[out] *pDst output pointer
emilmont 1:fdd22bb7aa52 2972 * @param[in] blockSize number of samples to process
emilmont 1:fdd22bb7aa52 2973 * @return none.
emilmont 1:fdd22bb7aa52 2974 */
emilmont 1:fdd22bb7aa52 2975 void arm_copy_q15(
emilmont 1:fdd22bb7aa52 2976 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 2977 q15_t * pDst,
emilmont 1:fdd22bb7aa52 2978 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2979
emilmont 1:fdd22bb7aa52 2980 /**
mbed_official 3:7a284390b0ce 2981 * @brief Copies the elements of a Q31 vector.
emilmont 1:fdd22bb7aa52 2982 * @param[in] *pSrc input pointer
emilmont 1:fdd22bb7aa52 2983 * @param[out] *pDst output pointer
emilmont 1:fdd22bb7aa52 2984 * @param[in] blockSize number of samples to process
emilmont 1:fdd22bb7aa52 2985 * @return none.
emilmont 1:fdd22bb7aa52 2986 */
emilmont 1:fdd22bb7aa52 2987 void arm_copy_q31(
emilmont 1:fdd22bb7aa52 2988 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 2989 q31_t * pDst,
emilmont 1:fdd22bb7aa52 2990 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2991 /**
mbed_official 3:7a284390b0ce 2992 * @brief Fills a constant value into a floating-point vector.
emilmont 1:fdd22bb7aa52 2993 * @param[in] value input value to be filled
emilmont 1:fdd22bb7aa52 2994 * @param[out] *pDst output pointer
emilmont 1:fdd22bb7aa52 2995 * @param[in] blockSize number of samples to process
emilmont 1:fdd22bb7aa52 2996 * @return none.
emilmont 1:fdd22bb7aa52 2997 */
emilmont 1:fdd22bb7aa52 2998 void arm_fill_f32(
emilmont 1:fdd22bb7aa52 2999 float32_t value,
emilmont 1:fdd22bb7aa52 3000 float32_t * pDst,
emilmont 1:fdd22bb7aa52 3001 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 3002
emilmont 1:fdd22bb7aa52 3003 /**
mbed_official 3:7a284390b0ce 3004 * @brief Fills a constant value into a Q7 vector.
emilmont 1:fdd22bb7aa52 3005 * @param[in] value input value to be filled
emilmont 1:fdd22bb7aa52 3006 * @param[out] *pDst output pointer
emilmont 1:fdd22bb7aa52 3007 * @param[in] blockSize number of samples to process
emilmont 1:fdd22bb7aa52 3008 * @return none.
emilmont 1:fdd22bb7aa52 3009 */
emilmont 1:fdd22bb7aa52 3010 void arm_fill_q7(
emilmont 1:fdd22bb7aa52 3011 q7_t value,
emilmont 1:fdd22bb7aa52 3012 q7_t * pDst,
emilmont 1:fdd22bb7aa52 3013 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 3014
emilmont 1:fdd22bb7aa52 3015 /**
mbed_official 3:7a284390b0ce 3016 * @brief Fills a constant value into a Q15 vector.
emilmont 1:fdd22bb7aa52 3017 * @param[in] value input value to be filled
emilmont 1:fdd22bb7aa52 3018 * @param[out] *pDst output pointer
emilmont 1:fdd22bb7aa52 3019 * @param[in] blockSize number of samples to process
emilmont 1:fdd22bb7aa52 3020 * @return none.
emilmont 1:fdd22bb7aa52 3021 */
emilmont 1:fdd22bb7aa52 3022 void arm_fill_q15(
emilmont 1:fdd22bb7aa52 3023 q15_t value,
emilmont 1:fdd22bb7aa52 3024 q15_t * pDst,
emilmont 1:fdd22bb7aa52 3025 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 3026
emilmont 1:fdd22bb7aa52 3027 /**
mbed_official 3:7a284390b0ce 3028 * @brief Fills a constant value into a Q31 vector.
emilmont 1:fdd22bb7aa52 3029 * @param[in] value input value to be filled
emilmont 1:fdd22bb7aa52 3030 * @param[out] *pDst output pointer
emilmont 1:fdd22bb7aa52 3031 * @param[in] blockSize number of samples to process
emilmont 1:fdd22bb7aa52 3032 * @return none.
emilmont 1:fdd22bb7aa52 3033 */
emilmont 1:fdd22bb7aa52 3034 void arm_fill_q31(
emilmont 1:fdd22bb7aa52 3035 q31_t value,
emilmont 1:fdd22bb7aa52 3036 q31_t * pDst,
emilmont 1:fdd22bb7aa52 3037 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 3038
mbed_official 3:7a284390b0ce 3039 /**
mbed_official 3:7a284390b0ce 3040 * @brief Convolution of floating-point sequences.
mbed_official 3:7a284390b0ce 3041 * @param[in] *pSrcA points to the first input sequence.
mbed_official 3:7a284390b0ce 3042 * @param[in] srcALen length of the first input sequence.
mbed_official 3:7a284390b0ce 3043 * @param[in] *pSrcB points to the second input sequence.
mbed_official 3:7a284390b0ce 3044 * @param[in] srcBLen length of the second input sequence.
mbed_official 3:7a284390b0ce 3045 * @param[out] *pDst points to the location where the output result is written. Length srcALen+srcBLen-1.
mbed_official 3:7a284390b0ce 3046 * @return none.
emilmont 1:fdd22bb7aa52 3047 */
emilmont 1:fdd22bb7aa52 3048
emilmont 1:fdd22bb7aa52 3049 void arm_conv_f32(
emilmont 1:fdd22bb7aa52 3050 float32_t * pSrcA,
emilmont 1:fdd22bb7aa52 3051 uint32_t srcALen,
emilmont 1:fdd22bb7aa52 3052 float32_t * pSrcB,
emilmont 1:fdd22bb7aa52 3053 uint32_t srcBLen,
emilmont 1:fdd22bb7aa52 3054 float32_t * pDst);
emilmont 1:fdd22bb7aa52 3055
mbed_official 3:7a284390b0ce 3056
mbed_official 3:7a284390b0ce 3057 /**
mbed_official 3:7a284390b0ce 3058 * @brief Convolution of Q15 sequences.
mbed_official 3:7a284390b0ce 3059 * @param[in] *pSrcA points to the first input sequence.
mbed_official 3:7a284390b0ce 3060 * @param[in] srcALen length of the first input sequence.
mbed_official 3:7a284390b0ce 3061 * @param[in] *pSrcB points to the second input sequence.
mbed_official 3:7a284390b0ce 3062 * @param[in] srcBLen length of the second input sequence.
mbed_official 3:7a284390b0ce 3063 * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1.
mbed_official 3:7a284390b0ce 3064 * @param[in] *pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
mbed_official 3:7a284390b0ce 3065 * @param[in] *pScratch2 points to scratch buffer of size min(srcALen, srcBLen).
mbed_official 3:7a284390b0ce 3066 * @return none.
emilmont 1:fdd22bb7aa52 3067 */
emilmont 1:fdd22bb7aa52 3068
emilmont 1:fdd22bb7aa52 3069
emilmont 1:fdd22bb7aa52 3070 void arm_conv_opt_q15(
emilmont 1:fdd22bb7aa52 3071 q15_t * pSrcA,
emilmont 1:fdd22bb7aa52 3072 uint32_t srcALen,
emilmont 1:fdd22bb7aa52 3073 q15_t * pSrcB,
emilmont 1:fdd22bb7aa52 3074 uint32_t srcBLen,
emilmont 1:fdd22bb7aa52 3075 q15_t * pDst,
emilmont 1:fdd22bb7aa52 3076 q15_t * pScratch1,
emilmont 1:fdd22bb7aa52 3077 q15_t * pScratch2);
emilmont 1:fdd22bb7aa52 3078
emilmont 1:fdd22bb7aa52 3079
mbed_official 3:7a284390b0ce 3080 /**
mbed_official 3:7a284390b0ce 3081 * @brief Convolution of Q15 sequences.
mbed_official 3:7a284390b0ce 3082 * @param[in] *pSrcA points to the first input sequence.
mbed_official 3:7a284390b0ce 3083 * @param[in] srcALen length of the first input sequence.
mbed_official 3:7a284390b0ce 3084 * @param[in] *pSrcB points to the second input sequence.
mbed_official 3:7a284390b0ce 3085 * @param[in] srcBLen length of the second input sequence.
mbed_official 3:7a284390b0ce 3086 * @param[out] *pDst points to the location where the output result is written. Length srcALen+srcBLen-1.
mbed_official 3:7a284390b0ce 3087 * @return none.
emilmont 1:fdd22bb7aa52 3088 */
emilmont 1:fdd22bb7aa52 3089
emilmont 1:fdd22bb7aa52 3090 void arm_conv_q15(
emilmont 1:fdd22bb7aa52 3091 q15_t * pSrcA,
emilmont 1:fdd22bb7aa52 3092 uint32_t srcALen,
emilmont 1:fdd22bb7aa52 3093 q15_t * pSrcB,
emilmont 1:fdd22bb7aa52 3094 uint32_t srcBLen,
emilmont 1:fdd22bb7aa52 3095 q15_t * pDst);
emilmont 1:fdd22bb7aa52 3096
emilmont 1:fdd22bb7aa52 3097 /**
emilmont 1:fdd22bb7aa52 3098 * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4
emilmont 1:fdd22bb7aa52 3099 * @param[in] *pSrcA points to the first input sequence.
emilmont 1:fdd22bb7aa52 3100 * @param[in] srcALen length of the first input sequence.
emilmont 1:fdd22bb7aa52 3101 * @param[in] *pSrcB points to the second input sequence.
emilmont 1:fdd22bb7aa52 3102 * @param[in] srcBLen length of the second input sequence.
emilmont 1:fdd22bb7aa52 3103 * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1.
emilmont 1:fdd22bb7aa52 3104 * @return none.
emilmont 1:fdd22bb7aa52 3105 */
emilmont 1:fdd22bb7aa52 3106
emilmont 1:fdd22bb7aa52 3107 void arm_conv_fast_q15(
emilmont 2:da51fb522205 3108 q15_t * pSrcA,
emilmont 2:da51fb522205 3109 uint32_t srcALen,
emilmont 2:da51fb522205 3110 q15_t * pSrcB,
emilmont 2:da51fb522205 3111 uint32_t srcBLen,
emilmont 2:da51fb522205 3112 q15_t * pDst);
emilmont 1:fdd22bb7aa52 3113
emilmont 1:fdd22bb7aa52 3114 /**
emilmont 1:fdd22bb7aa52 3115 * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4
emilmont 1:fdd22bb7aa52 3116 * @param[in] *pSrcA points to the first input sequence.
emilmont 1:fdd22bb7aa52 3117 * @param[in] srcALen length of the first input sequence.
emilmont 1:fdd22bb7aa52 3118 * @param[in] *pSrcB points to the second input sequence.
emilmont 1:fdd22bb7aa52 3119 * @param[in] srcBLen length of the second input sequence.
emilmont 1:fdd22bb7aa52 3120 * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1.
mbed_official 3:7a284390b0ce 3121 * @param[in] *pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
mbed_official 3:7a284390b0ce 3122 * @param[in] *pScratch2 points to scratch buffer of size min(srcALen, srcBLen).
mbed_official 3:7a284390b0ce 3123 * @return none.
emilmont 1:fdd22bb7aa52 3124 */
emilmont 1:fdd22bb7aa52 3125
emilmont 1:fdd22bb7aa52 3126 void arm_conv_fast_opt_q15(
emilmont 1:fdd22bb7aa52 3127 q15_t * pSrcA,
emilmont 1:fdd22bb7aa52 3128 uint32_t srcALen,
emilmont 1:fdd22bb7aa52 3129 q15_t * pSrcB,
emilmont 1:fdd22bb7aa52 3130 uint32_t srcBLen,
emilmont 1:fdd22bb7aa52 3131 q15_t * pDst,
emilmont 1:fdd22bb7aa52 3132 q15_t * pScratch1,
emilmont 1:fdd22bb7aa52 3133 q15_t * pScratch2);
emilmont 1:fdd22bb7aa52 3134
emilmont 1:fdd22bb7aa52 3135
emilmont 1:fdd22bb7aa52 3136
emilmont 1:fdd22bb7aa52 3137 /**
emilmont 1:fdd22bb7aa52 3138 * @brief Convolution of Q31 sequences.
emilmont 1:fdd22bb7aa52 3139 * @param[in] *pSrcA points to the first input sequence.
emilmont 1:fdd22bb7aa52 3140 * @param[in] srcALen length of the first input sequence.
emilmont 1:fdd22bb7aa52 3141 * @param[in] *pSrcB points to the second input sequence.
emilmont 1:fdd22bb7aa52 3142 * @param[in] srcBLen length of the second input sequence.
emilmont 1:fdd22bb7aa52 3143 * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1.
emilmont 1:fdd22bb7aa52 3144 * @return none.
emilmont 1:fdd22bb7aa52 3145 */
emilmont 1:fdd22bb7aa52 3146
emilmont 1:fdd22bb7aa52 3147 void arm_conv_q31(
emilmont 1:fdd22bb7aa52 3148 q31_t * pSrcA,
emilmont 1:fdd22bb7aa52 3149 uint32_t srcALen,
emilmont 1:fdd22bb7aa52 3150 q31_t * pSrcB,
emilmont 1:fdd22bb7aa52 3151 uint32_t srcBLen,
emilmont 1:fdd22bb7aa52 3152 q31_t * pDst);
emilmont 1:fdd22bb7aa52 3153
emilmont 1:fdd22bb7aa52 3154 /**
emilmont 1:fdd22bb7aa52 3155 * @brief Convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4
emilmont 1:fdd22bb7aa52 3156 * @param[in] *pSrcA points to the first input sequence.
emilmont 1:fdd22bb7aa52 3157 * @param[in] srcALen length of the first input sequence.
emilmont 1:fdd22bb7aa52 3158 * @param[in] *pSrcB points to the second input sequence.
emilmont 1:fdd22bb7aa52 3159 * @param[in] srcBLen length of the second input sequence.
emilmont 1:fdd22bb7aa52 3160 * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1.
emilmont 1:fdd22bb7aa52 3161 * @return none.
emilmont 1:fdd22bb7aa52 3162 */
emilmont 1:fdd22bb7aa52 3163
emilmont 1:fdd22bb7aa52 3164 void arm_conv_fast_q31(
emilmont 1:fdd22bb7aa52 3165 q31_t * pSrcA,
emilmont 1:fdd22bb7aa52 3166 uint32_t srcALen,
emilmont 1:fdd22bb7aa52 3167 q31_t * pSrcB,
emilmont 1:fdd22bb7aa52 3168 uint32_t srcBLen,
emilmont 1:fdd22bb7aa52 3169 q31_t * pDst);
emilmont 1:fdd22bb7aa52 3170
emilmont 1:fdd22bb7aa52 3171
mbed_official 3:7a284390b0ce 3172 /**
mbed_official 3:7a284390b0ce 3173 * @brief Convolution of Q7 sequences.
mbed_official 3:7a284390b0ce 3174 * @param[in] *pSrcA points to the first input sequence.
mbed_official 3:7a284390b0ce 3175 * @param[in] srcALen length of the first input sequence.
mbed_official 3:7a284390b0ce 3176 * @param[in] *pSrcB points to the second input sequence.
mbed_official 3:7a284390b0ce 3177 * @param[in] srcBLen length of the second input sequence.
mbed_official 3:7a284390b0ce 3178 * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1.
mbed_official 3:7a284390b0ce 3179 * @param[in] *pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
mbed_official 3:7a284390b0ce 3180 * @param[in] *pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen).
mbed_official 3:7a284390b0ce 3181 * @return none.
emilmont 1:fdd22bb7aa52 3182 */
emilmont 1:fdd22bb7aa52 3183
emilmont 1:fdd22bb7aa52 3184 void arm_conv_opt_q7(
emilmont 1:fdd22bb7aa52 3185 q7_t * pSrcA,
emilmont 1:fdd22bb7aa52 3186 uint32_t srcALen,
emilmont 1:fdd22bb7aa52 3187 q7_t * pSrcB,
emilmont 1:fdd22bb7aa52 3188 uint32_t srcBLen,
emilmont 1:fdd22bb7aa52 3189 q7_t * pDst,
emilmont 1:fdd22bb7aa52 3190 q15_t * pScratch1,
emilmont 1:fdd22bb7aa52 3191 q15_t * pScratch2);
emilmont 1:fdd22bb7aa52 3192
emilmont 1:fdd22bb7aa52 3193
emilmont 1:fdd22bb7aa52 3194
emilmont 1:fdd22bb7aa52 3195 /**
emilmont 1:fdd22bb7aa52 3196 * @brief Convolution of Q7 sequences.
emilmont 1:fdd22bb7aa52 3197 * @param[in] *pSrcA points to the first input sequence.
emilmont 1:fdd22bb7aa52 3198 * @param[in] srcALen length of the first input sequence.
emilmont 1:fdd22bb7aa52 3199 * @param[in] *pSrcB points to the second input sequence.
emilmont 1:fdd22bb7aa52 3200 * @param[in] srcBLen length of the second input sequence.
emilmont 1:fdd22bb7aa52 3201 * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1.
emilmont 1:fdd22bb7aa52 3202 * @return none.
emilmont 1:fdd22bb7aa52 3203 */
emilmont 1:fdd22bb7aa52 3204
emilmont 1:fdd22bb7aa52 3205 void arm_conv_q7(
emilmont 1:fdd22bb7aa52 3206 q7_t * pSrcA,
emilmont 1:fdd22bb7aa52 3207 uint32_t srcALen,
emilmont 1:fdd22bb7aa52 3208 q7_t * pSrcB,
emilmont 1:fdd22bb7aa52 3209 uint32_t srcBLen,
emilmont 1:fdd22bb7aa52 3210 q7_t * pDst);
emilmont 1:fdd22bb7aa52 3211
emilmont 1:fdd22bb7aa52 3212
emilmont 1:fdd22bb7aa52 3213 /**
emilmont 1:fdd22bb7aa52 3214 * @brief Partial convolution of floating-point sequences.
emilmont 1:fdd22bb7aa52 3215 * @param[in] *pSrcA points to the first input sequence.
emilmont 1:fdd22bb7aa52 3216 * @param[in] srcALen length of the first input sequence.
emilmont 1:fdd22bb7aa52 3217 * @param[in] *pSrcB points to the second input sequence.
emilmont 1:fdd22bb7aa52 3218 * @param[in] srcBLen length of the second input sequence.
emilmont 1:fdd22bb7aa52 3219 * @param[out] *pDst points to the block of output data
emilmont 1:fdd22bb7aa52 3220 * @param[in] firstIndex is the first output sample to start with.
emilmont 1:fdd22bb7aa52 3221 * @param[in] numPoints is the number of output points to be computed.
emilmont 1:fdd22bb7aa52 3222 * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2].
emilmont 1:fdd22bb7aa52 3223 */
emilmont 1:fdd22bb7aa52 3224
emilmont 1:fdd22bb7aa52 3225 arm_status arm_conv_partial_f32(
emilmont 1:fdd22bb7aa52 3226 float32_t * pSrcA,
emilmont 1:fdd22bb7aa52 3227 uint32_t srcALen,
emilmont 1:fdd22bb7aa52 3228 float32_t * pSrcB,
emilmont 1:fdd22bb7aa52 3229 uint32_t srcBLen,
emilmont 1:fdd22bb7aa52 3230 float32_t * pDst,
emilmont 1:fdd22bb7aa52 3231 uint32_t firstIndex,
emilmont 1:fdd22bb7aa52 3232 uint32_t numPoints);
emilmont 1:fdd22bb7aa52 3233
mbed_official 3:7a284390b0ce 3234 /**
mbed_official 3:7a284390b0ce 3235 * @brief Partial convolution of Q15 sequences.
mbed_official 3:7a284390b0ce 3236 * @param[in] *pSrcA points to the first input sequence.
mbed_official 3:7a284390b0ce 3237 * @param[in] srcALen length of the first input sequence.
mbed_official 3:7a284390b0ce 3238 * @param[in] *pSrcB points to the second input sequence.
mbed_official 3:7a284390b0ce 3239 * @param[in] srcBLen length of the second input sequence.
mbed_official 3:7a284390b0ce 3240 * @param[out] *pDst points to the block of output data
mbed_official 3:7a284390b0ce 3241 * @param[in] firstIndex is the first output sample to start with.
mbed_official 3:7a284390b0ce 3242 * @param[in] numPoints is the number of output points to be computed.
mbed_official 3:7a284390b0ce 3243 * @param[in] * pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
mbed_official 3:7a284390b0ce 3244 * @param[in] * pScratch2 points to scratch buffer of size min(srcALen, srcBLen).
mbed_official 3:7a284390b0ce 3245 * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2].
emilmont 1:fdd22bb7aa52 3246 */
emilmont 1:fdd22bb7aa52 3247
emilmont 1:fdd22bb7aa52 3248 arm_status arm_conv_partial_opt_q15(
emilmont 1:fdd22bb7aa52 3249 q15_t * pSrcA,
emilmont 1:fdd22bb7aa52 3250 uint32_t srcALen,
emilmont 1:fdd22bb7aa52 3251 q15_t * pSrcB,
emilmont 1:fdd22bb7aa52 3252 uint32_t srcBLen,
emilmont 1:fdd22bb7aa52 3253 q15_t * pDst,
emilmont 1:fdd22bb7aa52 3254 uint32_t firstIndex,
emilmont 1:fdd22bb7aa52 3255 uint32_t numPoints,
emilmont 1:fdd22bb7aa52 3256 q15_t * pScratch1,
emilmont 1:fdd22bb7aa52 3257 q15_t * pScratch2);
emilmont 1:fdd22bb7aa52 3258
emilmont 1:fdd22bb7aa52 3259
emilmont 1:fdd22bb7aa52 3260 /**
emilmont 1:fdd22bb7aa52 3261 * @brief Partial convolution of Q15 sequences.
emilmont 1:fdd22bb7aa52 3262 * @param[in] *pSrcA points to the first input sequence.
emilmont 1:fdd22bb7aa52 3263 * @param[in] srcALen length of the first input sequence.
emilmont 1:fdd22bb7aa52 3264 * @param[in] *pSrcB points to the second input sequence.
emilmont 1:fdd22bb7aa52 3265 * @param[in] srcBLen length of the second input sequence.
emilmont 1:fdd22bb7aa52 3266 * @param[out] *pDst points to the block of output data
emilmont 1:fdd22bb7aa52 3267 * @param[in] firstIndex is the first output sample to start with.
emilmont 1:fdd22bb7aa52 3268 * @param[in] numPoints is the number of output points to be computed.
emilmont 1:fdd22bb7aa52 3269 * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2].
emilmont 1:fdd22bb7aa52 3270 */
emilmont 1:fdd22bb7aa52 3271
emilmont 1:fdd22bb7aa52 3272 arm_status arm_conv_partial_q15(
emilmont 1:fdd22bb7aa52 3273 q15_t * pSrcA,
emilmont 1:fdd22bb7aa52 3274 uint32_t srcALen,
emilmont 1:fdd22bb7aa52 3275 q15_t * pSrcB,
emilmont 1:fdd22bb7aa52 3276 uint32_t srcBLen,
emilmont 1:fdd22bb7aa52 3277 q15_t * pDst,
emilmont 1:fdd22bb7aa52 3278 uint32_t firstIndex,
emilmont 1:fdd22bb7aa52 3279 uint32_t numPoints);
emilmont 1:fdd22bb7aa52 3280
emilmont 1:fdd22bb7aa52 3281 /**
emilmont 1:fdd22bb7aa52 3282 * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4
emilmont 1:fdd22bb7aa52 3283 * @param[in] *pSrcA points to the first input sequence.
emilmont 1:fdd22bb7aa52 3284 * @param[in] srcALen length of the first input sequence.
emilmont 1:fdd22bb7aa52 3285 * @param[in] *pSrcB points to the second input sequence.
emilmont 1:fdd22bb7aa52 3286 * @param[in] srcBLen length of the second input sequence.
emilmont 1:fdd22bb7aa52 3287 * @param[out] *pDst points to the block of output data
emilmont 1:fdd22bb7aa52 3288 * @param[in] firstIndex is the first output sample to start with.
emilmont 1:fdd22bb7aa52 3289 * @param[in] numPoints is the number of output points to be computed.
emilmont 1:fdd22bb7aa52 3290 * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2].
emilmont 1:fdd22bb7aa52 3291 */
emilmont 1:fdd22bb7aa52 3292
emilmont 1:fdd22bb7aa52 3293 arm_status arm_conv_partial_fast_q15(
emilmont 2:da51fb522205 3294 q15_t * pSrcA,
emilmont 2:da51fb522205 3295 uint32_t srcALen,
emilmont 2:da51fb522205 3296 q15_t * pSrcB,
emilmont 2:da51fb522205 3297 uint32_t srcBLen,
emilmont 2:da51fb522205 3298 q15_t * pDst,
emilmont 2:da51fb522205 3299 uint32_t firstIndex,
emilmont 2:da51fb522205 3300 uint32_t numPoints);
emilmont 1:fdd22bb7aa52 3301
emilmont 1:fdd22bb7aa52 3302
emilmont 1:fdd22bb7aa52 3303 /**
emilmont 1:fdd22bb7aa52 3304 * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4
emilmont 1:fdd22bb7aa52 3305 * @param[in] *pSrcA points to the first input sequence.
emilmont 1:fdd22bb7aa52 3306 * @param[in] srcALen length of the first input sequence.
emilmont 1:fdd22bb7aa52 3307 * @param[in] *pSrcB points to the second input sequence.
emilmont 1:fdd22bb7aa52 3308 * @param[in] srcBLen length of the second input sequence.
emilmont 1:fdd22bb7aa52 3309 * @param[out] *pDst points to the block of output data
emilmont 1:fdd22bb7aa52 3310 * @param[in] firstIndex is the first output sample to start with.
emilmont 1:fdd22bb7aa52 3311 * @param[in] numPoints is the number of output points to be computed.
mbed_official 3:7a284390b0ce 3312 * @param[in] * pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
mbed_official 3:7a284390b0ce 3313 * @param[in] * pScratch2 points to scratch buffer of size min(srcALen, srcBLen).
mbed_official 3:7a284390b0ce 3314 * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2].
emilmont 1:fdd22bb7aa52 3315 */
emilmont 1:fdd22bb7aa52 3316
emilmont 1:fdd22bb7aa52 3317 arm_status arm_conv_partial_fast_opt_q15(
emilmont 1:fdd22bb7aa52 3318 q15_t * pSrcA,
emilmont 1:fdd22bb7aa52 3319 uint32_t srcALen,
emilmont 1:fdd22bb7aa52 3320 q15_t * pSrcB,
emilmont 1:fdd22bb7aa52 3321 uint32_t srcBLen,
emilmont 1:fdd22bb7aa52 3322 q15_t * pDst,
emilmont 1:fdd22bb7aa52 3323 uint32_t firstIndex,
emilmont 1:fdd22bb7aa52 3324 uint32_t numPoints,
emilmont 1:fdd22bb7aa52 3325 q15_t * pScratch1,
emilmont 1:fdd22bb7aa52 3326 q15_t * pScratch2);
emilmont 1:fdd22bb7aa52 3327
emilmont 1:fdd22bb7aa52 3328
emilmont 1:fdd22bb7aa52 3329 /**
emilmont 1:fdd22bb7aa52 3330 * @brief Partial convolution of Q31 sequences.
emilmont 1:fdd22bb7aa52 3331 * @param[in] *pSrcA points to the first input sequence.
emilmont 1:fdd22bb7aa52 3332 * @param[in] srcALen length of the first input sequence.
emilmont 1:fdd22bb7aa52 3333 * @param[in] *pSrcB points to the second input sequence.
emilmont 1:fdd22bb7aa52 3334 * @param[in] srcBLen length of the second input sequence.
emilmont 1:fdd22bb7aa52 3335 * @param[out] *pDst points to the block of output data
emilmont 1:fdd22bb7aa52 3336 * @param[in] firstIndex is the first output sample to start with.
emilmont 1:fdd22bb7aa52 3337 * @param[in] numPoints is the number of output points to be computed.
emilmont 1:fdd22bb7aa52 3338 * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2].
emilmont 1:fdd22bb7aa52 3339 */
emilmont 1:fdd22bb7aa52 3340
emilmont 1:fdd22bb7aa52 3341 arm_status arm_conv_partial_q31(
emilmont 1:fdd22bb7aa52 3342 q31_t * pSrcA,
emilmont 1:fdd22bb7aa52 3343 uint32_t srcALen,
emilmont 1:fdd22bb7aa52 3344 q31_t * pSrcB,
emilmont 1:fdd22bb7aa52 3345 uint32_t srcBLen,
emilmont 1:fdd22bb7aa52 3346 q31_t * pDst,
emilmont 1:fdd22bb7aa52 3347 uint32_t firstIndex,
emilmont 1:fdd22bb7aa52 3348 uint32_t numPoints);
emilmont 1:fdd22bb7aa52 3349
emilmont 1:fdd22bb7aa52 3350
emilmont 1:fdd22bb7aa52 3351 /**
emilmont 1:fdd22bb7aa52 3352 * @brief Partial convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4
emilmont 1:fdd22bb7aa52 3353 * @param[in] *pSrcA points to the first input sequence.
emilmont 1:fdd22bb7aa52 3354 * @param[in] srcALen length of the first input sequence.
emilmont 1:fdd22bb7aa52 3355 * @param[in] *pSrcB points to the second input sequence.
emilmont 1:fdd22bb7aa52 3356 * @param[in] srcBLen length of the second input sequence.
emilmont 1:fdd22bb7aa52 3357 * @param[out] *pDst points to the block of output data
emilmont 1:fdd22bb7aa52 3358 * @param[in] firstIndex is the first output sample to start with.
emilmont 1:fdd22bb7aa52 3359 * @param[in] numPoints is the number of output points to be computed.
emilmont 1:fdd22bb7aa52 3360 * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2].
emilmont 1:fdd22bb7aa52 3361 */
emilmont 1:fdd22bb7aa52 3362
emilmont 1:fdd22bb7aa52 3363 arm_status arm_conv_partial_fast_q31(
emilmont 1:fdd22bb7aa52 3364 q31_t * pSrcA,
emilmont 1:fdd22bb7aa52 3365 uint32_t srcALen,
emilmont 1:fdd22bb7aa52 3366 q31_t * pSrcB,
emilmont 1:fdd22bb7aa52 3367 uint32_t srcBLen,
emilmont 1:fdd22bb7aa52 3368 q31_t * pDst,
emilmont 1:fdd22bb7aa52 3369 uint32_t firstIndex,
emilmont 1:fdd22bb7aa52 3370 uint32_t numPoints);
emilmont 1:fdd22bb7aa52 3371
emilmont 1:fdd22bb7aa52 3372
mbed_official 3:7a284390b0ce 3373 /**
mbed_official 3:7a284390b0ce 3374 * @brief Partial convolution of Q7 sequences
mbed_official 3:7a284390b0ce 3375 * @param[in] *pSrcA points to the first input sequence.
mbed_official 3:7a284390b0ce 3376 * @param[in] srcALen length of the first input sequence.
mbed_official 3:7a284390b0ce 3377 * @param[in] *pSrcB points to the second input sequence.
mbed_official 3:7a284390b0ce 3378 * @param[in] srcBLen length of the second input sequence.
mbed_official 3:7a284390b0ce 3379 * @param[out] *pDst points to the block of output data
mbed_official 3:7a284390b0ce 3380 * @param[in] firstIndex is the first output sample to start with.
mbed_official 3:7a284390b0ce 3381 * @param[in] numPoints is the number of output points to be computed.
mbed_official 3:7a284390b0ce 3382 * @param[in] *pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
mbed_official 3:7a284390b0ce 3383 * @param[in] *pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen).
mbed_official 3:7a284390b0ce 3384 * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2].
emilmont 1:fdd22bb7aa52 3385 */
emilmont 1:fdd22bb7aa52 3386
emilmont 1:fdd22bb7aa52 3387 arm_status arm_conv_partial_opt_q7(
emilmont 1:fdd22bb7aa52 3388 q7_t * pSrcA,
emilmont 1:fdd22bb7aa52 3389 uint32_t srcALen,
emilmont 1:fdd22bb7aa52 3390 q7_t * pSrcB,
emilmont 1:fdd22bb7aa52 3391 uint32_t srcBLen,
emilmont 1:fdd22bb7aa52 3392 q7_t * pDst,
emilmont 1:fdd22bb7aa52 3393 uint32_t firstIndex,
emilmont 1:fdd22bb7aa52 3394 uint32_t numPoints,
emilmont 1:fdd22bb7aa52 3395 q15_t * pScratch1,
emilmont 1:fdd22bb7aa52 3396 q15_t * pScratch2);
emilmont 1:fdd22bb7aa52 3397
emilmont 1:fdd22bb7aa52 3398
emilmont 1:fdd22bb7aa52 3399 /**
emilmont 1:fdd22bb7aa52 3400 * @brief Partial convolution of Q7 sequences.
emilmont 1:fdd22bb7aa52 3401 * @param[in] *pSrcA points to the first input sequence.
emilmont 1:fdd22bb7aa52 3402 * @param[in] srcALen length of the first input sequence.
emilmont 1:fdd22bb7aa52 3403 * @param[in] *pSrcB points to the second input sequence.
emilmont 1:fdd22bb7aa52 3404 * @param[in] srcBLen length of the second input sequence.
emilmont 1:fdd22bb7aa52 3405 * @param[out] *pDst points to the block of output data
emilmont 1:fdd22bb7aa52 3406 * @param[in] firstIndex is the first output sample to start with.
emilmont 1:fdd22bb7aa52 3407 * @param[in] numPoints is the number of output points to be computed.
emilmont 1:fdd22bb7aa52 3408 * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2].
emilmont 1:fdd22bb7aa52 3409 */
emilmont 1:fdd22bb7aa52 3410
emilmont 1:fdd22bb7aa52 3411 arm_status arm_conv_partial_q7(
emilmont 1:fdd22bb7aa52 3412 q7_t * pSrcA,
emilmont 1:fdd22bb7aa52 3413 uint32_t srcALen,
emilmont 1:fdd22bb7aa52 3414 q7_t * pSrcB,
emilmont 1:fdd22bb7aa52 3415 uint32_t srcBLen,
emilmont 1:fdd22bb7aa52 3416 q7_t * pDst,
emilmont 1:fdd22bb7aa52 3417 uint32_t firstIndex,
emilmont 1:fdd22bb7aa52 3418 uint32_t numPoints);
emilmont 1:fdd22bb7aa52 3419
emilmont 1:fdd22bb7aa52 3420
emilmont 1:fdd22bb7aa52 3421
emilmont 1:fdd22bb7aa52 3422 /**
emilmont 1:fdd22bb7aa52 3423 * @brief Instance structure for the Q15 FIR decimator.
emilmont 1:fdd22bb7aa52 3424 */
emilmont 1:fdd22bb7aa52 3425
emilmont 1:fdd22bb7aa52 3426 typedef struct
emilmont 1:fdd22bb7aa52 3427 {
emilmont 1:fdd22bb7aa52 3428 uint8_t M; /**< decimation factor. */
emilmont 1:fdd22bb7aa52 3429 uint16_t numTaps; /**< number of coefficients in the filter. */
emilmont 1:fdd22bb7aa52 3430 q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/
emilmont 1:fdd22bb7aa52 3431 q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */
emilmont 1:fdd22bb7aa52 3432 } arm_fir_decimate_instance_q15;
emilmont 1:fdd22bb7aa52 3433
emilmont 1:fdd22bb7aa52 3434 /**
emilmont 1:fdd22bb7aa52 3435 * @brief Instance structure for the Q31 FIR decimator.
emilmont 1:fdd22bb7aa52 3436 */
emilmont 1:fdd22bb7aa52 3437
emilmont 1:fdd22bb7aa52 3438 typedef struct
emilmont 1:fdd22bb7aa52 3439 {
emilmont 1:fdd22bb7aa52 3440 uint8_t M; /**< decimation factor. */
emilmont 1:fdd22bb7aa52 3441 uint16_t numTaps; /**< number of coefficients in the filter. */
emilmont 1:fdd22bb7aa52 3442 q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/
emilmont 1:fdd22bb7aa52 3443 q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */
emilmont 1:fdd22bb7aa52 3444
emilmont 1:fdd22bb7aa52 3445 } arm_fir_decimate_instance_q31;
emilmont 1:fdd22bb7aa52 3446
emilmont 1:fdd22bb7aa52 3447 /**
emilmont 1:fdd22bb7aa52 3448 * @brief Instance structure for the floating-point FIR decimator.
emilmont 1:fdd22bb7aa52 3449 */
emilmont 1:fdd22bb7aa52 3450
emilmont 1:fdd22bb7aa52 3451 typedef struct
emilmont 1:fdd22bb7aa52 3452 {
emilmont 1:fdd22bb7aa52 3453 uint8_t M; /**< decimation factor. */
emilmont 1:fdd22bb7aa52 3454 uint16_t numTaps; /**< number of coefficients in the filter. */
emilmont 1:fdd22bb7aa52 3455 float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/
emilmont 1:fdd22bb7aa52 3456 float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */
emilmont 1:fdd22bb7aa52 3457
emilmont 1:fdd22bb7aa52 3458 } arm_fir_decimate_instance_f32;
emilmont 1:fdd22bb7aa52 3459
emilmont 1:fdd22bb7aa52 3460
emilmont 1:fdd22bb7aa52 3461
emilmont 1:fdd22bb7aa52 3462 /**
emilmont 1:fdd22bb7aa52 3463 * @brief Processing function for the floating-point FIR decimator.
emilmont 1:fdd22bb7aa52 3464 * @param[in] *S points to an instance of the floating-point FIR decimator structure.
emilmont 1:fdd22bb7aa52 3465 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 3466 * @param[out] *pDst points to the block of output data
emilmont 1:fdd22bb7aa52 3467 * @param[in] blockSize number of input samples to process per call.
emilmont 1:fdd22bb7aa52 3468 * @return none
emilmont 1:fdd22bb7aa52 3469 */
emilmont 1:fdd22bb7aa52 3470
emilmont 1:fdd22bb7aa52 3471 void arm_fir_decimate_f32(
emilmont 1:fdd22bb7aa52 3472 const arm_fir_decimate_instance_f32 * S,
emilmont 1:fdd22bb7aa52 3473 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 3474 float32_t * pDst,
emilmont 1:fdd22bb7aa52 3475 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 3476
emilmont 1:fdd22bb7aa52 3477
emilmont 1:fdd22bb7aa52 3478 /**
emilmont 1:fdd22bb7aa52 3479 * @brief Initialization function for the floating-point FIR decimator.
emilmont 1:fdd22bb7aa52 3480 * @param[in,out] *S points to an instance of the floating-point FIR decimator structure.
emilmont 1:fdd22bb7aa52 3481 * @param[in] numTaps number of coefficients in the filter.
emilmont 1:fdd22bb7aa52 3482 * @param[in] M decimation factor.
emilmont 1:fdd22bb7aa52 3483 * @param[in] *pCoeffs points to the filter coefficients.
emilmont 1:fdd22bb7aa52 3484 * @param[in] *pState points to the state buffer.
emilmont 1:fdd22bb7aa52 3485 * @param[in] blockSize number of input samples to process per call.
emilmont 1:fdd22bb7aa52 3486 * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if
emilmont 1:fdd22bb7aa52 3487 * <code>blockSize</code> is not a multiple of <code>M</code>.
emilmont 1:fdd22bb7aa52 3488 */
emilmont 1:fdd22bb7aa52 3489
emilmont 1:fdd22bb7aa52 3490 arm_status arm_fir_decimate_init_f32(
emilmont 1:fdd22bb7aa52 3491 arm_fir_decimate_instance_f32 * S,
emilmont 1:fdd22bb7aa52 3492 uint16_t numTaps,
emilmont 1:fdd22bb7aa52 3493 uint8_t M,
emilmont 1:fdd22bb7aa52 3494 float32_t * pCoeffs,
emilmont 1:fdd22bb7aa52 3495 float32_t * pState,
emilmont 1:fdd22bb7aa52 3496 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 3497
emilmont 1:fdd22bb7aa52 3498 /**
emilmont 1:fdd22bb7aa52 3499 * @brief Processing function for the Q15 FIR decimator.
emilmont 1:fdd22bb7aa52 3500 * @param[in] *S points to an instance of the Q15 FIR decimator structure.
emilmont 1:fdd22bb7aa52 3501 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 3502 * @param[out] *pDst points to the block of output data
emilmont 1:fdd22bb7aa52 3503 * @param[in] blockSize number of input samples to process per call.
emilmont 1:fdd22bb7aa52 3504 * @return none
emilmont 1:fdd22bb7aa52 3505 */
emilmont 1:fdd22bb7aa52 3506
emilmont 1:fdd22bb7aa52 3507 void arm_fir_decimate_q15(
emilmont 1:fdd22bb7aa52 3508 const arm_fir_decimate_instance_q15 * S,
emilmont 1:fdd22bb7aa52 3509 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 3510 q15_t * pDst,
emilmont 1:fdd22bb7aa52 3511 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 3512
emilmont 1:fdd22bb7aa52 3513 /**
emilmont 1:fdd22bb7aa52 3514 * @brief Processing function for the Q15 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4.
emilmont 1:fdd22bb7aa52 3515 * @param[in] *S points to an instance of the Q15 FIR decimator structure.
emilmont 1:fdd22bb7aa52 3516 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 3517 * @param[out] *pDst points to the block of output data
emilmont 1:fdd22bb7aa52 3518 * @param[in] blockSize number of input samples to process per call.
emilmont 1:fdd22bb7aa52 3519 * @return none
emilmont 1:fdd22bb7aa52 3520 */
emilmont 1:fdd22bb7aa52 3521
emilmont 1:fdd22bb7aa52 3522 void arm_fir_decimate_fast_q15(
emilmont 1:fdd22bb7aa52 3523 const arm_fir_decimate_instance_q15 * S,
emilmont 1:fdd22bb7aa52 3524 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 3525 q15_t * pDst,
emilmont 1:fdd22bb7aa52 3526 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 3527
emilmont 1:fdd22bb7aa52 3528
emilmont 1:fdd22bb7aa52 3529
emilmont 1:fdd22bb7aa52 3530 /**
emilmont 1:fdd22bb7aa52 3531 * @brief Initialization function for the Q15 FIR decimator.
emilmont 1:fdd22bb7aa52 3532 * @param[in,out] *S points to an instance of the Q15 FIR decimator structure.
emilmont 1:fdd22bb7aa52 3533 * @param[in] numTaps number of coefficients in the filter.
emilmont 1:fdd22bb7aa52 3534 * @param[in] M decimation factor.
emilmont 1:fdd22bb7aa52 3535 * @param[in] *pCoeffs points to the filter coefficients.
emilmont 1:fdd22bb7aa52 3536 * @param[in] *pState points to the state buffer.
emilmont 1:fdd22bb7aa52 3537 * @param[in] blockSize number of input samples to process per call.
emilmont 1:fdd22bb7aa52 3538 * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if
emilmont 1:fdd22bb7aa52 3539 * <code>blockSize</code> is not a multiple of <code>M</code>.
emilmont 1:fdd22bb7aa52 3540 */
emilmont 1:fdd22bb7aa52 3541
emilmont 1:fdd22bb7aa52 3542 arm_status arm_fir_decimate_init_q15(
emilmont 1:fdd22bb7aa52 3543 arm_fir_decimate_instance_q15 * S,
emilmont 1:fdd22bb7aa52 3544 uint16_t numTaps,
emilmont 1:fdd22bb7aa52 3545 uint8_t M,
emilmont 1:fdd22bb7aa52 3546 q15_t * pCoeffs,
emilmont 1:fdd22bb7aa52 3547 q15_t * pState,
emilmont 1:fdd22bb7aa52 3548 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 3549
emilmont 1:fdd22bb7aa52 3550 /**
emilmont 1:fdd22bb7aa52 3551 * @brief Processing function for the Q31 FIR decimator.
emilmont 1:fdd22bb7aa52 3552 * @param[in] *S points to an instance of the Q31 FIR decimator structure.
emilmont 1:fdd22bb7aa52 3553 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 3554 * @param[out] *pDst points to the block of output data
emilmont 1:fdd22bb7aa52 3555 * @param[in] blockSize number of input samples to process per call.
emilmont 1:fdd22bb7aa52 3556 * @return none
emilmont 1:fdd22bb7aa52 3557 */
emilmont 1:fdd22bb7aa52 3558
emilmont 1:fdd22bb7aa52 3559 void arm_fir_decimate_q31(
emilmont 1:fdd22bb7aa52 3560 const arm_fir_decimate_instance_q31 * S,
emilmont 1:fdd22bb7aa52 3561 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 3562 q31_t * pDst,
emilmont 1:fdd22bb7aa52 3563 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 3564
emilmont 1:fdd22bb7aa52 3565 /**
emilmont 1:fdd22bb7aa52 3566 * @brief Processing function for the Q31 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4.
emilmont 1:fdd22bb7aa52 3567 * @param[in] *S points to an instance of the Q31 FIR decimator structure.
emilmont 1:fdd22bb7aa52 3568 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 3569 * @param[out] *pDst points to the block of output data
emilmont 1:fdd22bb7aa52 3570 * @param[in] blockSize number of input samples to process per call.
emilmont 1:fdd22bb7aa52 3571 * @return none
emilmont 1:fdd22bb7aa52 3572 */
emilmont 1:fdd22bb7aa52 3573
emilmont 1:fdd22bb7aa52 3574 void arm_fir_decimate_fast_q31(
emilmont 1:fdd22bb7aa52 3575 arm_fir_decimate_instance_q31 * S,
emilmont 1:fdd22bb7aa52 3576 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 3577 q31_t * pDst,
emilmont 1:fdd22bb7aa52 3578 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 3579
emilmont 1:fdd22bb7aa52 3580
emilmont 1:fdd22bb7aa52 3581 /**
emilmont 1:fdd22bb7aa52 3582 * @brief Initialization function for the Q31 FIR decimator.
emilmont 1:fdd22bb7aa52 3583 * @param[in,out] *S points to an instance of the Q31 FIR decimator structure.
emilmont 1:fdd22bb7aa52 3584 * @param[in] numTaps number of coefficients in the filter.
emilmont 1:fdd22bb7aa52 3585 * @param[in] M decimation factor.
emilmont 1:fdd22bb7aa52 3586 * @param[in] *pCoeffs points to the filter coefficients.
emilmont 1:fdd22bb7aa52 3587 * @param[in] *pState points to the state buffer.
emilmont 1:fdd22bb7aa52 3588 * @param[in] blockSize number of input samples to process per call.
emilmont 1:fdd22bb7aa52 3589 * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if
emilmont 1:fdd22bb7aa52 3590 * <code>blockSize</code> is not a multiple of <code>M</code>.
emilmont 1:fdd22bb7aa52 3591 */
emilmont 1:fdd22bb7aa52 3592
emilmont 1:fdd22bb7aa52 3593 arm_status arm_fir_decimate_init_q31(
emilmont 1:fdd22bb7aa52 3594 arm_fir_decimate_instance_q31 * S,
emilmont 1:fdd22bb7aa52 3595 uint16_t numTaps,
emilmont 1:fdd22bb7aa52 3596 uint8_t M,
emilmont 1:fdd22bb7aa52 3597 q31_t * pCoeffs,
emilmont 1:fdd22bb7aa52 3598 q31_t * pState,
emilmont 1:fdd22bb7aa52 3599 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 3600
emilmont 1:fdd22bb7aa52 3601
emilmont 1:fdd22bb7aa52 3602
emilmont 1:fdd22bb7aa52 3603 /**
emilmont 1:fdd22bb7aa52 3604 * @brief Instance structure for the Q15 FIR interpolator.
emilmont 1:fdd22bb7aa52 3605 */
emilmont 1:fdd22bb7aa52 3606
emilmont 1:fdd22bb7aa52 3607 typedef struct
emilmont 1:fdd22bb7aa52 3608 {
emilmont 1:fdd22bb7aa52 3609 uint8_t L; /**< upsample factor. */
emilmont 1:fdd22bb7aa52 3610 uint16_t phaseLength; /**< length of each polyphase filter component. */
emilmont 1:fdd22bb7aa52 3611 q15_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */
emilmont 1:fdd22bb7aa52 3612 q15_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */
emilmont 1:fdd22bb7aa52 3613 } arm_fir_interpolate_instance_q15;
emilmont 1:fdd22bb7aa52 3614
emilmont 1:fdd22bb7aa52 3615 /**
emilmont 1:fdd22bb7aa52 3616 * @brief Instance structure for the Q31 FIR interpolator.
emilmont 1:fdd22bb7aa52 3617 */
emilmont 1:fdd22bb7aa52 3618
emilmont 1:fdd22bb7aa52 3619 typedef struct
emilmont 1:fdd22bb7aa52 3620 {
emilmont 1:fdd22bb7aa52 3621 uint8_t L; /**< upsample factor. */
emilmont 1:fdd22bb7aa52 3622 uint16_t phaseLength; /**< length of each polyphase filter component. */
emilmont 1:fdd22bb7aa52 3623 q31_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */
emilmont 1:fdd22bb7aa52 3624 q31_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */
emilmont 1:fdd22bb7aa52 3625 } arm_fir_interpolate_instance_q31;
emilmont 1:fdd22bb7aa52 3626
emilmont 1:fdd22bb7aa52 3627 /**
emilmont 1:fdd22bb7aa52 3628 * @brief Instance structure for the floating-point FIR interpolator.
emilmont 1:fdd22bb7aa52 3629 */
emilmont 1:fdd22bb7aa52 3630
emilmont 1:fdd22bb7aa52 3631 typedef struct
emilmont 1:fdd22bb7aa52 3632 {
emilmont 1:fdd22bb7aa52 3633 uint8_t L; /**< upsample factor. */
emilmont 1:fdd22bb7aa52 3634 uint16_t phaseLength; /**< length of each polyphase filter component. */
emilmont 1:fdd22bb7aa52 3635 float32_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */
emilmont 1:fdd22bb7aa52 3636 float32_t *pState; /**< points to the state variable array. The array is of length phaseLength+numTaps-1. */
emilmont 1:fdd22bb7aa52 3637 } arm_fir_interpolate_instance_f32;
emilmont 1:fdd22bb7aa52 3638
emilmont 1:fdd22bb7aa52 3639
emilmont 1:fdd22bb7aa52 3640 /**
emilmont 1:fdd22bb7aa52 3641 * @brief Processing function for the Q15 FIR interpolator.
emilmont 1:fdd22bb7aa52 3642 * @param[in] *S points to an instance of the Q15 FIR interpolator structure.
emilmont 1:fdd22bb7aa52 3643 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 3644 * @param[out] *pDst points to the block of output data.
emilmont 1:fdd22bb7aa52 3645 * @param[in] blockSize number of input samples to process per call.
emilmont 1:fdd22bb7aa52 3646 * @return none.
emilmont 1:fdd22bb7aa52 3647 */
emilmont 1:fdd22bb7aa52 3648
emilmont 1:fdd22bb7aa52 3649 void arm_fir_interpolate_q15(
emilmont 1:fdd22bb7aa52 3650 const arm_fir_interpolate_instance_q15 * S,
emilmont 1:fdd22bb7aa52 3651 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 3652 q15_t * pDst,
emilmont 1:fdd22bb7aa52 3653 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 3654
emilmont 1:fdd22bb7aa52 3655
emilmont 1:fdd22bb7aa52 3656 /**
emilmont 1:fdd22bb7aa52 3657 * @brief Initialization function for the Q15 FIR interpolator.
emilmont 1:fdd22bb7aa52 3658 * @param[in,out] *S points to an instance of the Q15 FIR interpolator structure.
emilmont 1:fdd22bb7aa52 3659 * @param[in] L upsample factor.
emilmont 1:fdd22bb7aa52 3660 * @param[in] numTaps number of filter coefficients in the filter.
emilmont 1:fdd22bb7aa52 3661 * @param[in] *pCoeffs points to the filter coefficient buffer.
emilmont 1:fdd22bb7aa52 3662 * @param[in] *pState points to the state buffer.
emilmont 1:fdd22bb7aa52 3663 * @param[in] blockSize number of input samples to process per call.
emilmont 1:fdd22bb7aa52 3664 * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if
emilmont 1:fdd22bb7aa52 3665 * the filter length <code>numTaps</code> is not a multiple of the interpolation factor <code>L</code>.
emilmont 1:fdd22bb7aa52 3666 */
emilmont 1:fdd22bb7aa52 3667
emilmont 1:fdd22bb7aa52 3668 arm_status arm_fir_interpolate_init_q15(
emilmont 1:fdd22bb7aa52 3669 arm_fir_interpolate_instance_q15 * S,
emilmont 1:fdd22bb7aa52 3670 uint8_t L,
emilmont 1:fdd22bb7aa52 3671 uint16_t numTaps,
emilmont 1:fdd22bb7aa52 3672 q15_t * pCoeffs,
emilmont 1:fdd22bb7aa52 3673 q15_t * pState,
emilmont 1:fdd22bb7aa52 3674 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 3675
emilmont 1:fdd22bb7aa52 3676 /**
emilmont 1:fdd22bb7aa52 3677 * @brief Processing function for the Q31 FIR interpolator.
emilmont 1:fdd22bb7aa52 3678 * @param[in] *S points to an instance of the Q15 FIR interpolator structure.
emilmont 1:fdd22bb7aa52 3679 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 3680 * @param[out] *pDst points to the block of output data.
emilmont 1:fdd22bb7aa52 3681 * @param[in] blockSize number of input samples to process per call.
emilmont 1:fdd22bb7aa52 3682 * @return none.
emilmont 1:fdd22bb7aa52 3683 */
emilmont 1:fdd22bb7aa52 3684
emilmont 1:fdd22bb7aa52 3685 void arm_fir_interpolate_q31(
emilmont 1:fdd22bb7aa52 3686 const arm_fir_interpolate_instance_q31 * S,
emilmont 1:fdd22bb7aa52 3687 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 3688 q31_t * pDst,
emilmont 1:fdd22bb7aa52 3689 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 3690
emilmont 1:fdd22bb7aa52 3691 /**
emilmont 1:fdd22bb7aa52 3692 * @brief Initialization function for the Q31 FIR interpolator.
emilmont 1:fdd22bb7aa52 3693 * @param[in,out] *S points to an instance of the Q31 FIR interpolator structure.
emilmont 1:fdd22bb7aa52 3694 * @param[in] L upsample factor.
emilmont 1:fdd22bb7aa52 3695 * @param[in] numTaps number of filter coefficients in the filter.
emilmont 1:fdd22bb7aa52 3696 * @param[in] *pCoeffs points to the filter coefficient buffer.
emilmont 1:fdd22bb7aa52 3697 * @param[in] *pState points to the state buffer.
emilmont 1:fdd22bb7aa52 3698 * @param[in] blockSize number of input samples to process per call.
emilmont 1:fdd22bb7aa52 3699 * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if
emilmont 1:fdd22bb7aa52 3700 * the filter length <code>numTaps</code> is not a multiple of the interpolation factor <code>L</code>.
emilmont 1:fdd22bb7aa52 3701 */
emilmont 1:fdd22bb7aa52 3702
emilmont 1:fdd22bb7aa52 3703 arm_status arm_fir_interpolate_init_q31(
emilmont 1:fdd22bb7aa52 3704 arm_fir_interpolate_instance_q31 * S,
emilmont 1:fdd22bb7aa52 3705 uint8_t L,
emilmont 1:fdd22bb7aa52 3706 uint16_t numTaps,
emilmont 1:fdd22bb7aa52 3707 q31_t * pCoeffs,
emilmont 1:fdd22bb7aa52 3708 q31_t * pState,
emilmont 1:fdd22bb7aa52 3709 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 3710
emilmont 1:fdd22bb7aa52 3711
emilmont 1:fdd22bb7aa52 3712 /**
emilmont 1:fdd22bb7aa52 3713 * @brief Processing function for the floating-point FIR interpolator.
emilmont 1:fdd22bb7aa52 3714 * @param[in] *S points to an instance of the floating-point FIR interpolator structure.
emilmont 1:fdd22bb7aa52 3715 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 3716 * @param[out] *pDst points to the block of output data.
emilmont 1:fdd22bb7aa52 3717 * @param[in] blockSize number of input samples to process per call.
emilmont 1:fdd22bb7aa52 3718 * @return none.
emilmont 1:fdd22bb7aa52 3719 */
emilmont 1:fdd22bb7aa52 3720
emilmont 1:fdd22bb7aa52 3721 void arm_fir_interpolate_f32(
emilmont 1:fdd22bb7aa52 3722 const arm_fir_interpolate_instance_f32 * S,
emilmont 1:fdd22bb7aa52 3723 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 3724 float32_t * pDst,
emilmont 1:fdd22bb7aa52 3725 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 3726
emilmont 1:fdd22bb7aa52 3727 /**
emilmont 1:fdd22bb7aa52 3728 * @brief Initialization function for the floating-point FIR interpolator.
emilmont 1:fdd22bb7aa52 3729 * @param[in,out] *S points to an instance of the floating-point FIR interpolator structure.
emilmont 1:fdd22bb7aa52 3730 * @param[in] L upsample factor.
emilmont 1:fdd22bb7aa52 3731 * @param[in] numTaps number of filter coefficients in the filter.
emilmont 1:fdd22bb7aa52 3732 * @param[in] *pCoeffs points to the filter coefficient buffer.
emilmont 1:fdd22bb7aa52 3733 * @param[in] *pState points to the state buffer.
emilmont 1:fdd22bb7aa52 3734 * @param[in] blockSize number of input samples to process per call.
emilmont 1:fdd22bb7aa52 3735 * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if
emilmont 1:fdd22bb7aa52 3736 * the filter length <code>numTaps</code> is not a multiple of the interpolation factor <code>L</code>.
emilmont 1:fdd22bb7aa52 3737 */
emilmont 1:fdd22bb7aa52 3738
emilmont 1:fdd22bb7aa52 3739 arm_status arm_fir_interpolate_init_f32(
emilmont 1:fdd22bb7aa52 3740 arm_fir_interpolate_instance_f32 * S,
emilmont 1:fdd22bb7aa52 3741 uint8_t L,
emilmont 1:fdd22bb7aa52 3742 uint16_t numTaps,
emilmont 1:fdd22bb7aa52 3743 float32_t * pCoeffs,
emilmont 1:fdd22bb7aa52 3744 float32_t * pState,
emilmont 1:fdd22bb7aa52 3745 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 3746
emilmont 1:fdd22bb7aa52 3747 /**
emilmont 1:fdd22bb7aa52 3748 * @brief Instance structure for the high precision Q31 Biquad cascade filter.
emilmont 1:fdd22bb7aa52 3749 */
emilmont 1:fdd22bb7aa52 3750
emilmont 1:fdd22bb7aa52 3751 typedef struct
emilmont 1:fdd22bb7aa52 3752 {
emilmont 1:fdd22bb7aa52 3753 uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */
emilmont 1:fdd22bb7aa52 3754 q63_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */
emilmont 1:fdd22bb7aa52 3755 q31_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */
emilmont 1:fdd22bb7aa52 3756 uint8_t postShift; /**< additional shift, in bits, applied to each output sample. */
emilmont 1:fdd22bb7aa52 3757
emilmont 1:fdd22bb7aa52 3758 } arm_biquad_cas_df1_32x64_ins_q31;
emilmont 1:fdd22bb7aa52 3759
emilmont 1:fdd22bb7aa52 3760
emilmont 1:fdd22bb7aa52 3761 /**
emilmont 1:fdd22bb7aa52 3762 * @param[in] *S points to an instance of the high precision Q31 Biquad cascade filter structure.
emilmont 1:fdd22bb7aa52 3763 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 3764 * @param[out] *pDst points to the block of output data
emilmont 1:fdd22bb7aa52 3765 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 3766 * @return none.
emilmont 1:fdd22bb7aa52 3767 */
emilmont 1:fdd22bb7aa52 3768
emilmont 1:fdd22bb7aa52 3769 void arm_biquad_cas_df1_32x64_q31(
emilmont 1:fdd22bb7aa52 3770 const arm_biquad_cas_df1_32x64_ins_q31 * S,
emilmont 1:fdd22bb7aa52 3771 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 3772 q31_t * pDst,
emilmont 1:fdd22bb7aa52 3773 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 3774
emilmont 1:fdd22bb7aa52 3775
emilmont 1:fdd22bb7aa52 3776 /**
emilmont 1:fdd22bb7aa52 3777 * @param[in,out] *S points to an instance of the high precision Q31 Biquad cascade filter structure.
emilmont 1:fdd22bb7aa52 3778 * @param[in] numStages number of 2nd order stages in the filter.
emilmont 1:fdd22bb7aa52 3779 * @param[in] *pCoeffs points to the filter coefficients.
emilmont 1:fdd22bb7aa52 3780 * @param[in] *pState points to the state buffer.
emilmont 1:fdd22bb7aa52 3781 * @param[in] postShift shift to be applied to the output. Varies according to the coefficients format
emilmont 1:fdd22bb7aa52 3782 * @return none
emilmont 1:fdd22bb7aa52 3783 */
emilmont 1:fdd22bb7aa52 3784
emilmont 1:fdd22bb7aa52 3785 void arm_biquad_cas_df1_32x64_init_q31(
emilmont 1:fdd22bb7aa52 3786 arm_biquad_cas_df1_32x64_ins_q31 * S,
emilmont 1:fdd22bb7aa52 3787 uint8_t numStages,
emilmont 1:fdd22bb7aa52 3788 q31_t * pCoeffs,
emilmont 1:fdd22bb7aa52 3789 q63_t * pState,
emilmont 1:fdd22bb7aa52 3790 uint8_t postShift);
emilmont 1:fdd22bb7aa52 3791
emilmont 1:fdd22bb7aa52 3792
emilmont 1:fdd22bb7aa52 3793
emilmont 1:fdd22bb7aa52 3794 /**
emilmont 1:fdd22bb7aa52 3795 * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter.
emilmont 1:fdd22bb7aa52 3796 */
emilmont 1:fdd22bb7aa52 3797
emilmont 1:fdd22bb7aa52 3798 typedef struct
emilmont 1:fdd22bb7aa52 3799 {
emilmont 1:fdd22bb7aa52 3800 uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */
emilmont 1:fdd22bb7aa52 3801 float32_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */
emilmont 1:fdd22bb7aa52 3802 float32_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */
emilmont 1:fdd22bb7aa52 3803 } arm_biquad_cascade_df2T_instance_f32;
emilmont 1:fdd22bb7aa52 3804
emilmont 1:fdd22bb7aa52 3805
emilmont 1:fdd22bb7aa52 3806 /**
emilmont 1:fdd22bb7aa52 3807 * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter.
emilmont 1:fdd22bb7aa52 3808 * @param[in] *S points to an instance of the filter data structure.
emilmont 1:fdd22bb7aa52 3809 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 3810 * @param[out] *pDst points to the block of output data
emilmont 1:fdd22bb7aa52 3811 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 3812 * @return none.
emilmont 1:fdd22bb7aa52 3813 */
emilmont 1:fdd22bb7aa52 3814
emilmont 1:fdd22bb7aa52 3815 void arm_biquad_cascade_df2T_f32(
emilmont 1:fdd22bb7aa52 3816 const arm_biquad_cascade_df2T_instance_f32 * S,
emilmont 1:fdd22bb7aa52 3817 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 3818 float32_t * pDst,
emilmont 1:fdd22bb7aa52 3819 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 3820
emilmont 1:fdd22bb7aa52 3821
emilmont 1:fdd22bb7aa52 3822 /**
emilmont 1:fdd22bb7aa52 3823 * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter.
emilmont 1:fdd22bb7aa52 3824 * @param[in,out] *S points to an instance of the filter data structure.
emilmont 1:fdd22bb7aa52 3825 * @param[in] numStages number of 2nd order stages in the filter.
emilmont 1:fdd22bb7aa52 3826 * @param[in] *pCoeffs points to the filter coefficients.
emilmont 1:fdd22bb7aa52 3827 * @param[in] *pState points to the state buffer.
emilmont 1:fdd22bb7aa52 3828 * @return none
emilmont 1:fdd22bb7aa52 3829 */
emilmont 1:fdd22bb7aa52 3830
emilmont 1:fdd22bb7aa52 3831 void arm_biquad_cascade_df2T_init_f32(
emilmont 1:fdd22bb7aa52 3832 arm_biquad_cascade_df2T_instance_f32 * S,
emilmont 1:fdd22bb7aa52 3833 uint8_t numStages,
emilmont 1:fdd22bb7aa52 3834 float32_t * pCoeffs,
emilmont 1:fdd22bb7aa52 3835 float32_t * pState);
emilmont 1:fdd22bb7aa52 3836
emilmont 1:fdd22bb7aa52 3837
emilmont 1:fdd22bb7aa52 3838
emilmont 1:fdd22bb7aa52 3839 /**
emilmont 1:fdd22bb7aa52 3840 * @brief Instance structure for the Q15 FIR lattice filter.
emilmont 1:fdd22bb7aa52 3841 */
emilmont 1:fdd22bb7aa52 3842
emilmont 1:fdd22bb7aa52 3843 typedef struct
emilmont 1:fdd22bb7aa52 3844 {
emilmont 1:fdd22bb7aa52 3845 uint16_t numStages; /**< number of filter stages. */
emilmont 1:fdd22bb7aa52 3846 q15_t *pState; /**< points to the state variable array. The array is of length numStages. */
emilmont 1:fdd22bb7aa52 3847 q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */
emilmont 1:fdd22bb7aa52 3848 } arm_fir_lattice_instance_q15;
emilmont 1:fdd22bb7aa52 3849
emilmont 1:fdd22bb7aa52 3850 /**
emilmont 1:fdd22bb7aa52 3851 * @brief Instance structure for the Q31 FIR lattice filter.
emilmont 1:fdd22bb7aa52 3852 */
emilmont 1:fdd22bb7aa52 3853
emilmont 1:fdd22bb7aa52 3854 typedef struct
emilmont 1:fdd22bb7aa52 3855 {
emilmont 1:fdd22bb7aa52 3856 uint16_t numStages; /**< number of filter stages. */
emilmont 1:fdd22bb7aa52 3857 q31_t *pState; /**< points to the state variable array. The array is of length numStages. */
emilmont 1:fdd22bb7aa52 3858 q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */
emilmont 1:fdd22bb7aa52 3859 } arm_fir_lattice_instance_q31;
emilmont 1:fdd22bb7aa52 3860
emilmont 1:fdd22bb7aa52 3861 /**
emilmont 1:fdd22bb7aa52 3862 * @brief Instance structure for the floating-point FIR lattice filter.
emilmont 1:fdd22bb7aa52 3863 */
emilmont 1:fdd22bb7aa52 3864
emilmont 1:fdd22bb7aa52 3865 typedef struct
emilmont 1:fdd22bb7aa52 3866 {
emilmont 1:fdd22bb7aa52 3867 uint16_t numStages; /**< number of filter stages. */
emilmont 1:fdd22bb7aa52 3868 float32_t *pState; /**< points to the state variable array. The array is of length numStages. */
emilmont 1:fdd22bb7aa52 3869 float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */
emilmont 1:fdd22bb7aa52 3870 } arm_fir_lattice_instance_f32;
emilmont 1:fdd22bb7aa52 3871
emilmont 1:fdd22bb7aa52 3872 /**
emilmont 1:fdd22bb7aa52 3873 * @brief Initialization function for the Q15 FIR lattice filter.
emilmont 1:fdd22bb7aa52 3874 * @param[in] *S points to an instance of the Q15 FIR lattice structure.
emilmont 1:fdd22bb7aa52 3875 * @param[in] numStages number of filter stages.
mbed_official 3:7a284390b0ce 3876 * @param[in] *pCoeffs points to the coefficient buffer. The array is of length numStages.
mbed_official 3:7a284390b0ce 3877 * @param[in] *pState points to the state buffer. The array is of length numStages.
emilmont 1:fdd22bb7aa52 3878 * @return none.
emilmont 1:fdd22bb7aa52 3879 */
emilmont 1:fdd22bb7aa52 3880
emilmont 1:fdd22bb7aa52 3881 void arm_fir_lattice_init_q15(
emilmont 1:fdd22bb7aa52 3882 arm_fir_lattice_instance_q15 * S,
emilmont 1:fdd22bb7aa52 3883 uint16_t numStages,
emilmont 1:fdd22bb7aa52 3884 q15_t * pCoeffs,
emilmont 1:fdd22bb7aa52 3885 q15_t * pState);
emilmont 1:fdd22bb7aa52 3886
emilmont 1:fdd22bb7aa52 3887
emilmont 1:fdd22bb7aa52 3888 /**
emilmont 1:fdd22bb7aa52 3889 * @brief Processing function for the Q15 FIR lattice filter.
emilmont 1:fdd22bb7aa52 3890 * @param[in] *S points to an instance of the Q15 FIR lattice structure.
emilmont 1:fdd22bb7aa52 3891 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 3892 * @param[out] *pDst points to the block of output data.
emilmont 1:fdd22bb7aa52 3893 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 3894 * @return none.
emilmont 1:fdd22bb7aa52 3895 */
emilmont 1:fdd22bb7aa52 3896 void arm_fir_lattice_q15(
emilmont 1:fdd22bb7aa52 3897 const arm_fir_lattice_instance_q15 * S,
emilmont 1:fdd22bb7aa52 3898 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 3899 q15_t * pDst,
emilmont 1:fdd22bb7aa52 3900 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 3901
emilmont 1:fdd22bb7aa52 3902 /**
emilmont 1:fdd22bb7aa52 3903 * @brief Initialization function for the Q31 FIR lattice filter.
emilmont 1:fdd22bb7aa52 3904 * @param[in] *S points to an instance of the Q31 FIR lattice structure.
emilmont 1:fdd22bb7aa52 3905 * @param[in] numStages number of filter stages.
emilmont 1:fdd22bb7aa52 3906 * @param[in] *pCoeffs points to the coefficient buffer. The array is of length numStages.
emilmont 1:fdd22bb7aa52 3907 * @param[in] *pState points to the state buffer. The array is of length numStages.
emilmont 1:fdd22bb7aa52 3908 * @return none.
emilmont 1:fdd22bb7aa52 3909 */
emilmont 1:fdd22bb7aa52 3910
emilmont 1:fdd22bb7aa52 3911 void arm_fir_lattice_init_q31(
emilmont 1:fdd22bb7aa52 3912 arm_fir_lattice_instance_q31 * S,
emilmont 1:fdd22bb7aa52 3913 uint16_t numStages,
emilmont 1:fdd22bb7aa52 3914 q31_t * pCoeffs,
emilmont 1:fdd22bb7aa52 3915 q31_t * pState);
emilmont 1:fdd22bb7aa52 3916
emilmont 1:fdd22bb7aa52 3917
emilmont 1:fdd22bb7aa52 3918 /**
emilmont 1:fdd22bb7aa52 3919 * @brief Processing function for the Q31 FIR lattice filter.
emilmont 1:fdd22bb7aa52 3920 * @param[in] *S points to an instance of the Q31 FIR lattice structure.
emilmont 1:fdd22bb7aa52 3921 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 3922 * @param[out] *pDst points to the block of output data
emilmont 1:fdd22bb7aa52 3923 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 3924 * @return none.
emilmont 1:fdd22bb7aa52 3925 */
emilmont 1:fdd22bb7aa52 3926
emilmont 1:fdd22bb7aa52 3927 void arm_fir_lattice_q31(
emilmont 1:fdd22bb7aa52 3928 const arm_fir_lattice_instance_q31 * S,
emilmont 1:fdd22bb7aa52 3929 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 3930 q31_t * pDst,
emilmont 1:fdd22bb7aa52 3931 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 3932
emilmont 1:fdd22bb7aa52 3933 /**
emilmont 1:fdd22bb7aa52 3934 * @brief Initialization function for the floating-point FIR lattice filter.
emilmont 1:fdd22bb7aa52 3935 * @param[in] *S points to an instance of the floating-point FIR lattice structure.
emilmont 1:fdd22bb7aa52 3936 * @param[in] numStages number of filter stages.
emilmont 1:fdd22bb7aa52 3937 * @param[in] *pCoeffs points to the coefficient buffer. The array is of length numStages.
emilmont 1:fdd22bb7aa52 3938 * @param[in] *pState points to the state buffer. The array is of length numStages.
emilmont 1:fdd22bb7aa52 3939 * @return none.
emilmont 1:fdd22bb7aa52 3940 */
emilmont 1:fdd22bb7aa52 3941
emilmont 1:fdd22bb7aa52 3942 void arm_fir_lattice_init_f32(
emilmont 1:fdd22bb7aa52 3943 arm_fir_lattice_instance_f32 * S,
emilmont 1:fdd22bb7aa52 3944 uint16_t numStages,
emilmont 1:fdd22bb7aa52 3945 float32_t * pCoeffs,
emilmont 1:fdd22bb7aa52 3946 float32_t * pState);
emilmont 1:fdd22bb7aa52 3947
emilmont 1:fdd22bb7aa52 3948 /**
emilmont 1:fdd22bb7aa52 3949 * @brief Processing function for the floating-point FIR lattice filter.
emilmont 1:fdd22bb7aa52 3950 * @param[in] *S points to an instance of the floating-point FIR lattice structure.
emilmont 1:fdd22bb7aa52 3951 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 3952 * @param[out] *pDst points to the block of output data
emilmont 1:fdd22bb7aa52 3953 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 3954 * @return none.
emilmont 1:fdd22bb7aa52 3955 */
emilmont 1:fdd22bb7aa52 3956
emilmont 1:fdd22bb7aa52 3957 void arm_fir_lattice_f32(
emilmont 1:fdd22bb7aa52 3958 const arm_fir_lattice_instance_f32 * S,
emilmont 1:fdd22bb7aa52 3959 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 3960 float32_t * pDst,
emilmont 1:fdd22bb7aa52 3961 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 3962
emilmont 1:fdd22bb7aa52 3963 /**
emilmont 1:fdd22bb7aa52 3964 * @brief Instance structure for the Q15 IIR lattice filter.
emilmont 1:fdd22bb7aa52 3965 */
emilmont 1:fdd22bb7aa52 3966 typedef struct
emilmont 1:fdd22bb7aa52 3967 {
emilmont 1:fdd22bb7aa52 3968 uint16_t numStages; /**< number of stages in the filter. */
emilmont 1:fdd22bb7aa52 3969 q15_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */
emilmont 1:fdd22bb7aa52 3970 q15_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */
emilmont 1:fdd22bb7aa52 3971 q15_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */
emilmont 1:fdd22bb7aa52 3972 } arm_iir_lattice_instance_q15;
emilmont 1:fdd22bb7aa52 3973
emilmont 1:fdd22bb7aa52 3974 /**
emilmont 1:fdd22bb7aa52 3975 * @brief Instance structure for the Q31 IIR lattice filter.
emilmont 1:fdd22bb7aa52 3976 */
emilmont 1:fdd22bb7aa52 3977 typedef struct
emilmont 1:fdd22bb7aa52 3978 {
emilmont 1:fdd22bb7aa52 3979 uint16_t numStages; /**< number of stages in the filter. */
emilmont 1:fdd22bb7aa52 3980 q31_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */
emilmont 1:fdd22bb7aa52 3981 q31_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */
emilmont 1:fdd22bb7aa52 3982 q31_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */
emilmont 1:fdd22bb7aa52 3983 } arm_iir_lattice_instance_q31;
emilmont 1:fdd22bb7aa52 3984
emilmont 1:fdd22bb7aa52 3985 /**
emilmont 1:fdd22bb7aa52 3986 * @brief Instance structure for the floating-point IIR lattice filter.
emilmont 1:fdd22bb7aa52 3987 */
emilmont 1:fdd22bb7aa52 3988 typedef struct
emilmont 1:fdd22bb7aa52 3989 {
emilmont 1:fdd22bb7aa52 3990 uint16_t numStages; /**< number of stages in the filter. */
emilmont 1:fdd22bb7aa52 3991 float32_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */
emilmont 1:fdd22bb7aa52 3992 float32_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */
emilmont 1:fdd22bb7aa52 3993 float32_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */
emilmont 1:fdd22bb7aa52 3994 } arm_iir_lattice_instance_f32;
emilmont 1:fdd22bb7aa52 3995
emilmont 1:fdd22bb7aa52 3996 /**
emilmont 1:fdd22bb7aa52 3997 * @brief Processing function for the floating-point IIR lattice filter.
emilmont 1:fdd22bb7aa52 3998 * @param[in] *S points to an instance of the floating-point IIR lattice structure.
emilmont 1:fdd22bb7aa52 3999 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 4000 * @param[out] *pDst points to the block of output data.
emilmont 1:fdd22bb7aa52 4001 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 4002 * @return none.
emilmont 1:fdd22bb7aa52 4003 */
emilmont 1:fdd22bb7aa52 4004
emilmont 1:fdd22bb7aa52 4005 void arm_iir_lattice_f32(
emilmont 1:fdd22bb7aa52 4006 const arm_iir_lattice_instance_f32 * S,
emilmont 1:fdd22bb7aa52 4007 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 4008 float32_t * pDst,
emilmont 1:fdd22bb7aa52 4009 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 4010
emilmont 1:fdd22bb7aa52 4011 /**
emilmont 1:fdd22bb7aa52 4012 * @brief Initialization function for the floating-point IIR lattice filter.
emilmont 1:fdd22bb7aa52 4013 * @param[in] *S points to an instance of the floating-point IIR lattice structure.
emilmont 1:fdd22bb7aa52 4014 * @param[in] numStages number of stages in the filter.
emilmont 1:fdd22bb7aa52 4015 * @param[in] *pkCoeffs points to the reflection coefficient buffer. The array is of length numStages.
emilmont 1:fdd22bb7aa52 4016 * @param[in] *pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1.
emilmont 1:fdd22bb7aa52 4017 * @param[in] *pState points to the state buffer. The array is of length numStages+blockSize-1.
emilmont 1:fdd22bb7aa52 4018 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 4019 * @return none.
emilmont 1:fdd22bb7aa52 4020 */
emilmont 1:fdd22bb7aa52 4021
emilmont 1:fdd22bb7aa52 4022 void arm_iir_lattice_init_f32(
emilmont 1:fdd22bb7aa52 4023 arm_iir_lattice_instance_f32 * S,
emilmont 1:fdd22bb7aa52 4024 uint16_t numStages,
emilmont 1:fdd22bb7aa52 4025 float32_t * pkCoeffs,
emilmont 1:fdd22bb7aa52 4026 float32_t * pvCoeffs,
emilmont 1:fdd22bb7aa52 4027 float32_t * pState,
emilmont 1:fdd22bb7aa52 4028 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 4029
emilmont 1:fdd22bb7aa52 4030
emilmont 1:fdd22bb7aa52 4031 /**
emilmont 1:fdd22bb7aa52 4032 * @brief Processing function for the Q31 IIR lattice filter.
emilmont 1:fdd22bb7aa52 4033 * @param[in] *S points to an instance of the Q31 IIR lattice structure.
emilmont 1:fdd22bb7aa52 4034 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 4035 * @param[out] *pDst points to the block of output data.
emilmont 1:fdd22bb7aa52 4036 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 4037 * @return none.
emilmont 1:fdd22bb7aa52 4038 */
emilmont 1:fdd22bb7aa52 4039
emilmont 1:fdd22bb7aa52 4040 void arm_iir_lattice_q31(
emilmont 1:fdd22bb7aa52 4041 const arm_iir_lattice_instance_q31 * S,
emilmont 1:fdd22bb7aa52 4042 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 4043 q31_t * pDst,
emilmont 1:fdd22bb7aa52 4044 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 4045
emilmont 1:fdd22bb7aa52 4046
emilmont 1:fdd22bb7aa52 4047 /**
emilmont 1:fdd22bb7aa52 4048 * @brief Initialization function for the Q31 IIR lattice filter.
emilmont 1:fdd22bb7aa52 4049 * @param[in] *S points to an instance of the Q31 IIR lattice structure.
emilmont 1:fdd22bb7aa52 4050 * @param[in] numStages number of stages in the filter.
emilmont 1:fdd22bb7aa52 4051 * @param[in] *pkCoeffs points to the reflection coefficient buffer. The array is of length numStages.
emilmont 1:fdd22bb7aa52 4052 * @param[in] *pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1.
emilmont 1:fdd22bb7aa52 4053 * @param[in] *pState points to the state buffer. The array is of length numStages+blockSize.
emilmont 1:fdd22bb7aa52 4054 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 4055 * @return none.
emilmont 1:fdd22bb7aa52 4056 */
emilmont 1:fdd22bb7aa52 4057
emilmont 1:fdd22bb7aa52 4058 void arm_iir_lattice_init_q31(
emilmont 1:fdd22bb7aa52 4059 arm_iir_lattice_instance_q31 * S,
emilmont 1:fdd22bb7aa52 4060 uint16_t numStages,
emilmont 1:fdd22bb7aa52 4061 q31_t * pkCoeffs,
emilmont 1:fdd22bb7aa52 4062 q31_t * pvCoeffs,
emilmont 1:fdd22bb7aa52 4063 q31_t * pState,
emilmont 1:fdd22bb7aa52 4064 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 4065
emilmont 1:fdd22bb7aa52 4066
emilmont 1:fdd22bb7aa52 4067 /**
emilmont 1:fdd22bb7aa52 4068 * @brief Processing function for the Q15 IIR lattice filter.
emilmont 1:fdd22bb7aa52 4069 * @param[in] *S points to an instance of the Q15 IIR lattice structure.
emilmont 1:fdd22bb7aa52 4070 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 4071 * @param[out] *pDst points to the block of output data.
emilmont 1:fdd22bb7aa52 4072 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 4073 * @return none.
emilmont 1:fdd22bb7aa52 4074 */
emilmont 1:fdd22bb7aa52 4075
emilmont 1:fdd22bb7aa52 4076 void arm_iir_lattice_q15(
emilmont 1:fdd22bb7aa52 4077 const arm_iir_lattice_instance_q15 * S,
emilmont 1:fdd22bb7aa52 4078 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 4079 q15_t * pDst,
emilmont 1:fdd22bb7aa52 4080 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 4081
emilmont 1:fdd22bb7aa52 4082
emilmont 1:fdd22bb7aa52 4083 /**
emilmont 1:fdd22bb7aa52 4084 * @brief Initialization function for the Q15 IIR lattice filter.
emilmont 1:fdd22bb7aa52 4085 * @param[in] *S points to an instance of the fixed-point Q15 IIR lattice structure.
emilmont 1:fdd22bb7aa52 4086 * @param[in] numStages number of stages in the filter.
emilmont 1:fdd22bb7aa52 4087 * @param[in] *pkCoeffs points to reflection coefficient buffer. The array is of length numStages.
emilmont 1:fdd22bb7aa52 4088 * @param[in] *pvCoeffs points to ladder coefficient buffer. The array is of length numStages+1.
emilmont 1:fdd22bb7aa52 4089 * @param[in] *pState points to state buffer. The array is of length numStages+blockSize.
emilmont 1:fdd22bb7aa52 4090 * @param[in] blockSize number of samples to process per call.
emilmont 1:fdd22bb7aa52 4091 * @return none.
emilmont 1:fdd22bb7aa52 4092 */
emilmont 1:fdd22bb7aa52 4093
emilmont 1:fdd22bb7aa52 4094 void arm_iir_lattice_init_q15(
emilmont 1:fdd22bb7aa52 4095 arm_iir_lattice_instance_q15 * S,
emilmont 1:fdd22bb7aa52 4096 uint16_t numStages,
emilmont 1:fdd22bb7aa52 4097 q15_t * pkCoeffs,
emilmont 1:fdd22bb7aa52 4098 q15_t * pvCoeffs,
emilmont 1:fdd22bb7aa52 4099 q15_t * pState,
emilmont 1:fdd22bb7aa52 4100 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 4101
emilmont 1:fdd22bb7aa52 4102 /**
emilmont 1:fdd22bb7aa52 4103 * @brief Instance structure for the floating-point LMS filter.
emilmont 1:fdd22bb7aa52 4104 */
emilmont 1:fdd22bb7aa52 4105
emilmont 1:fdd22bb7aa52 4106 typedef struct
emilmont 1:fdd22bb7aa52 4107 {
emilmont 1:fdd22bb7aa52 4108 uint16_t numTaps; /**< number of coefficients in the filter. */
emilmont 1:fdd22bb7aa52 4109 float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */
emilmont 1:fdd22bb7aa52 4110 float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */
emilmont 1:fdd22bb7aa52 4111 float32_t mu; /**< step size that controls filter coefficient updates. */
emilmont 1:fdd22bb7aa52 4112 } arm_lms_instance_f32;
emilmont 1:fdd22bb7aa52 4113
emilmont 1:fdd22bb7aa52 4114 /**
emilmont 1:fdd22bb7aa52 4115 * @brief Processing function for floating-point LMS filter.
emilmont 1:fdd22bb7aa52 4116 * @param[in] *S points to an instance of the floating-point LMS filter structure.
emilmont 1:fdd22bb7aa52 4117 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 4118 * @param[in] *pRef points to the block of reference data.
emilmont 1:fdd22bb7aa52 4119 * @param[out] *pOut points to the block of output data.
emilmont 1:fdd22bb7aa52 4120 * @param[out] *pErr points to the block of error data.
emilmont 1:fdd22bb7aa52 4121 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 4122 * @return none.
emilmont 1:fdd22bb7aa52 4123 */
emilmont 1:fdd22bb7aa52 4124
emilmont 1:fdd22bb7aa52 4125 void arm_lms_f32(
emilmont 1:fdd22bb7aa52 4126 const arm_lms_instance_f32 * S,
emilmont 1:fdd22bb7aa52 4127 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 4128 float32_t * pRef,
emilmont 1:fdd22bb7aa52 4129 float32_t * pOut,
emilmont 1:fdd22bb7aa52 4130 float32_t * pErr,
emilmont 1:fdd22bb7aa52 4131 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 4132
emilmont 1:fdd22bb7aa52 4133 /**
emilmont 1:fdd22bb7aa52 4134 * @brief Initialization function for floating-point LMS filter.
emilmont 1:fdd22bb7aa52 4135 * @param[in] *S points to an instance of the floating-point LMS filter structure.
emilmont 1:fdd22bb7aa52 4136 * @param[in] numTaps number of filter coefficients.
emilmont 1:fdd22bb7aa52 4137 * @param[in] *pCoeffs points to the coefficient buffer.
emilmont 1:fdd22bb7aa52 4138 * @param[in] *pState points to state buffer.
emilmont 1:fdd22bb7aa52 4139 * @param[in] mu step size that controls filter coefficient updates.
emilmont 1:fdd22bb7aa52 4140 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 4141 * @return none.
emilmont 1:fdd22bb7aa52 4142 */
emilmont 1:fdd22bb7aa52 4143
emilmont 1:fdd22bb7aa52 4144 void arm_lms_init_f32(
emilmont 1:fdd22bb7aa52 4145 arm_lms_instance_f32 * S,
emilmont 1:fdd22bb7aa52 4146 uint16_t numTaps,
emilmont 1:fdd22bb7aa52 4147 float32_t * pCoeffs,
emilmont 1:fdd22bb7aa52 4148 float32_t * pState,
emilmont 1:fdd22bb7aa52 4149 float32_t mu,
emilmont 1:fdd22bb7aa52 4150 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 4151
emilmont 1:fdd22bb7aa52 4152 /**
emilmont 1:fdd22bb7aa52 4153 * @brief Instance structure for the Q15 LMS filter.
emilmont 1:fdd22bb7aa52 4154 */
emilmont 1:fdd22bb7aa52 4155
emilmont 1:fdd22bb7aa52 4156 typedef struct
emilmont 1:fdd22bb7aa52 4157 {
emilmont 1:fdd22bb7aa52 4158 uint16_t numTaps; /**< number of coefficients in the filter. */
emilmont 1:fdd22bb7aa52 4159 q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */
emilmont 1:fdd22bb7aa52 4160 q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */
emilmont 1:fdd22bb7aa52 4161 q15_t mu; /**< step size that controls filter coefficient updates. */
emilmont 1:fdd22bb7aa52 4162 uint32_t postShift; /**< bit shift applied to coefficients. */
emilmont 1:fdd22bb7aa52 4163 } arm_lms_instance_q15;
emilmont 1:fdd22bb7aa52 4164
emilmont 1:fdd22bb7aa52 4165
emilmont 1:fdd22bb7aa52 4166 /**
emilmont 1:fdd22bb7aa52 4167 * @brief Initialization function for the Q15 LMS filter.
emilmont 1:fdd22bb7aa52 4168 * @param[in] *S points to an instance of the Q15 LMS filter structure.
emilmont 1:fdd22bb7aa52 4169 * @param[in] numTaps number of filter coefficients.
emilmont 1:fdd22bb7aa52 4170 * @param[in] *pCoeffs points to the coefficient buffer.
emilmont 1:fdd22bb7aa52 4171 * @param[in] *pState points to the state buffer.
emilmont 1:fdd22bb7aa52 4172 * @param[in] mu step size that controls filter coefficient updates.
emilmont 1:fdd22bb7aa52 4173 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 4174 * @param[in] postShift bit shift applied to coefficients.
emilmont 1:fdd22bb7aa52 4175 * @return none.
emilmont 1:fdd22bb7aa52 4176 */
emilmont 1:fdd22bb7aa52 4177
emilmont 1:fdd22bb7aa52 4178 void arm_lms_init_q15(
emilmont 1:fdd22bb7aa52 4179 arm_lms_instance_q15 * S,
emilmont 1:fdd22bb7aa52 4180 uint16_t numTaps,
emilmont 1:fdd22bb7aa52 4181 q15_t * pCoeffs,
emilmont 1:fdd22bb7aa52 4182 q15_t * pState,
emilmont 1:fdd22bb7aa52 4183 q15_t mu,
emilmont 1:fdd22bb7aa52 4184 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 4185 uint32_t postShift);
emilmont 1:fdd22bb7aa52 4186
emilmont 1:fdd22bb7aa52 4187 /**
emilmont 1:fdd22bb7aa52 4188 * @brief Processing function for Q15 LMS filter.
emilmont 1:fdd22bb7aa52 4189 * @param[in] *S points to an instance of the Q15 LMS filter structure.
emilmont 1:fdd22bb7aa52 4190 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 4191 * @param[in] *pRef points to the block of reference data.
emilmont 1:fdd22bb7aa52 4192 * @param[out] *pOut points to the block of output data.
emilmont 1:fdd22bb7aa52 4193 * @param[out] *pErr points to the block of error data.
emilmont 1:fdd22bb7aa52 4194 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 4195 * @return none.
emilmont 1:fdd22bb7aa52 4196 */
emilmont 1:fdd22bb7aa52 4197
emilmont 1:fdd22bb7aa52 4198 void arm_lms_q15(
emilmont 1:fdd22bb7aa52 4199 const arm_lms_instance_q15 * S,
emilmont 1:fdd22bb7aa52 4200 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 4201 q15_t * pRef,
emilmont 1:fdd22bb7aa52 4202 q15_t * pOut,
emilmont 1:fdd22bb7aa52 4203 q15_t * pErr,
emilmont 1:fdd22bb7aa52 4204 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 4205
emilmont 1:fdd22bb7aa52 4206
emilmont 1:fdd22bb7aa52 4207 /**
emilmont 1:fdd22bb7aa52 4208 * @brief Instance structure for the Q31 LMS filter.
emilmont 1:fdd22bb7aa52 4209 */
emilmont 1:fdd22bb7aa52 4210
emilmont 1:fdd22bb7aa52 4211 typedef struct
emilmont 1:fdd22bb7aa52 4212 {
emilmont 1:fdd22bb7aa52 4213 uint16_t numTaps; /**< number of coefficients in the filter. */
emilmont 1:fdd22bb7aa52 4214 q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */
emilmont 1:fdd22bb7aa52 4215 q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */
emilmont 1:fdd22bb7aa52 4216 q31_t mu; /**< step size that controls filter coefficient updates. */
emilmont 1:fdd22bb7aa52 4217 uint32_t postShift; /**< bit shift applied to coefficients. */
emilmont 1:fdd22bb7aa52 4218
emilmont 1:fdd22bb7aa52 4219 } arm_lms_instance_q31;
emilmont 1:fdd22bb7aa52 4220
emilmont 1:fdd22bb7aa52 4221 /**
emilmont 1:fdd22bb7aa52 4222 * @brief Processing function for Q31 LMS filter.
emilmont 1:fdd22bb7aa52 4223 * @param[in] *S points to an instance of the Q15 LMS filter structure.
emilmont 1:fdd22bb7aa52 4224 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 4225 * @param[in] *pRef points to the block of reference data.
emilmont 1:fdd22bb7aa52 4226 * @param[out] *pOut points to the block of output data.
emilmont 1:fdd22bb7aa52 4227 * @param[out] *pErr points to the block of error data.
emilmont 1:fdd22bb7aa52 4228 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 4229 * @return none.
emilmont 1:fdd22bb7aa52 4230 */
emilmont 1:fdd22bb7aa52 4231
emilmont 1:fdd22bb7aa52 4232 void arm_lms_q31(
emilmont 1:fdd22bb7aa52 4233 const arm_lms_instance_q31 * S,
emilmont 1:fdd22bb7aa52 4234 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 4235 q31_t * pRef,
emilmont 1:fdd22bb7aa52 4236 q31_t * pOut,
emilmont 1:fdd22bb7aa52 4237 q31_t * pErr,
emilmont 1:fdd22bb7aa52 4238 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 4239
emilmont 1:fdd22bb7aa52 4240 /**
emilmont 1:fdd22bb7aa52 4241 * @brief Initialization function for Q31 LMS filter.
emilmont 1:fdd22bb7aa52 4242 * @param[in] *S points to an instance of the Q31 LMS filter structure.
emilmont 1:fdd22bb7aa52 4243 * @param[in] numTaps number of filter coefficients.
emilmont 1:fdd22bb7aa52 4244 * @param[in] *pCoeffs points to coefficient buffer.
emilmont 1:fdd22bb7aa52 4245 * @param[in] *pState points to state buffer.
emilmont 1:fdd22bb7aa52 4246 * @param[in] mu step size that controls filter coefficient updates.
emilmont 1:fdd22bb7aa52 4247 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 4248 * @param[in] postShift bit shift applied to coefficients.
emilmont 1:fdd22bb7aa52 4249 * @return none.
emilmont 1:fdd22bb7aa52 4250 */
emilmont 1:fdd22bb7aa52 4251
emilmont 1:fdd22bb7aa52 4252 void arm_lms_init_q31(
emilmont 1:fdd22bb7aa52 4253 arm_lms_instance_q31 * S,
emilmont 1:fdd22bb7aa52 4254 uint16_t numTaps,
emilmont 1:fdd22bb7aa52 4255 q31_t * pCoeffs,
emilmont 1:fdd22bb7aa52 4256 q31_t * pState,
emilmont 1:fdd22bb7aa52 4257 q31_t mu,
emilmont 1:fdd22bb7aa52 4258 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 4259 uint32_t postShift);
emilmont 1:fdd22bb7aa52 4260
emilmont 1:fdd22bb7aa52 4261 /**
emilmont 1:fdd22bb7aa52 4262 * @brief Instance structure for the floating-point normalized LMS filter.
emilmont 1:fdd22bb7aa52 4263 */
emilmont 1:fdd22bb7aa52 4264
emilmont 1:fdd22bb7aa52 4265 typedef struct
emilmont 1:fdd22bb7aa52 4266 {
emilmont 1:fdd22bb7aa52 4267 uint16_t numTaps; /**< number of coefficients in the filter. */
emilmont 1:fdd22bb7aa52 4268 float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */
emilmont 1:fdd22bb7aa52 4269 float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */
emilmont 1:fdd22bb7aa52 4270 float32_t mu; /**< step size that control filter coefficient updates. */
emilmont 1:fdd22bb7aa52 4271 float32_t energy; /**< saves previous frame energy. */
emilmont 1:fdd22bb7aa52 4272 float32_t x0; /**< saves previous input sample. */
emilmont 1:fdd22bb7aa52 4273 } arm_lms_norm_instance_f32;
emilmont 1:fdd22bb7aa52 4274
emilmont 1:fdd22bb7aa52 4275 /**
emilmont 1:fdd22bb7aa52 4276 * @brief Processing function for floating-point normalized LMS filter.
emilmont 1:fdd22bb7aa52 4277 * @param[in] *S points to an instance of the floating-point normalized LMS filter structure.
emilmont 1:fdd22bb7aa52 4278 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 4279 * @param[in] *pRef points to the block of reference data.
emilmont 1:fdd22bb7aa52 4280 * @param[out] *pOut points to the block of output data.
emilmont 1:fdd22bb7aa52 4281 * @param[out] *pErr points to the block of error data.
emilmont 1:fdd22bb7aa52 4282 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 4283 * @return none.
emilmont 1:fdd22bb7aa52 4284 */
emilmont 1:fdd22bb7aa52 4285
emilmont 1:fdd22bb7aa52 4286 void arm_lms_norm_f32(
emilmont 1:fdd22bb7aa52 4287 arm_lms_norm_instance_f32 * S,
emilmont 1:fdd22bb7aa52 4288 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 4289 float32_t * pRef,
emilmont 1:fdd22bb7aa52 4290 float32_t * pOut,
emilmont 1:fdd22bb7aa52 4291 float32_t * pErr,
emilmont 1:fdd22bb7aa52 4292 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 4293
emilmont 1:fdd22bb7aa52 4294 /**
emilmont 1:fdd22bb7aa52 4295 * @brief Initialization function for floating-point normalized LMS filter.
emilmont 1:fdd22bb7aa52 4296 * @param[in] *S points to an instance of the floating-point LMS filter structure.
emilmont 1:fdd22bb7aa52 4297 * @param[in] numTaps number of filter coefficients.
emilmont 1:fdd22bb7aa52 4298 * @param[in] *pCoeffs points to coefficient buffer.
emilmont 1:fdd22bb7aa52 4299 * @param[in] *pState points to state buffer.
emilmont 1:fdd22bb7aa52 4300 * @param[in] mu step size that controls filter coefficient updates.
emilmont 1:fdd22bb7aa52 4301 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 4302 * @return none.
emilmont 1:fdd22bb7aa52 4303 */
emilmont 1:fdd22bb7aa52 4304
emilmont 1:fdd22bb7aa52 4305 void arm_lms_norm_init_f32(
emilmont 1:fdd22bb7aa52 4306 arm_lms_norm_instance_f32 * S,
emilmont 1:fdd22bb7aa52 4307 uint16_t numTaps,
emilmont 1:fdd22bb7aa52 4308 float32_t * pCoeffs,
emilmont 1:fdd22bb7aa52 4309 float32_t * pState,
emilmont 1:fdd22bb7aa52 4310 float32_t mu,
emilmont 1:fdd22bb7aa52 4311 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 4312
emilmont 1:fdd22bb7aa52 4313
emilmont 1:fdd22bb7aa52 4314 /**
emilmont 1:fdd22bb7aa52 4315 * @brief Instance structure for the Q31 normalized LMS filter.
emilmont 1:fdd22bb7aa52 4316 */
emilmont 1:fdd22bb7aa52 4317 typedef struct
emilmont 1:fdd22bb7aa52 4318 {
emilmont 1:fdd22bb7aa52 4319 uint16_t numTaps; /**< number of coefficients in the filter. */
emilmont 1:fdd22bb7aa52 4320 q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */
emilmont 1:fdd22bb7aa52 4321 q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */
emilmont 1:fdd22bb7aa52 4322 q31_t mu; /**< step size that controls filter coefficient updates. */
emilmont 1:fdd22bb7aa52 4323 uint8_t postShift; /**< bit shift applied to coefficients. */
emilmont 1:fdd22bb7aa52 4324 q31_t *recipTable; /**< points to the reciprocal initial value table. */
emilmont 1:fdd22bb7aa52 4325 q31_t energy; /**< saves previous frame energy. */
emilmont 1:fdd22bb7aa52 4326 q31_t x0; /**< saves previous input sample. */
emilmont 1:fdd22bb7aa52 4327 } arm_lms_norm_instance_q31;
emilmont 1:fdd22bb7aa52 4328
emilmont 1:fdd22bb7aa52 4329 /**
emilmont 1:fdd22bb7aa52 4330 * @brief Processing function for Q31 normalized LMS filter.
emilmont 1:fdd22bb7aa52 4331 * @param[in] *S points to an instance of the Q31 normalized LMS filter structure.
emilmont 1:fdd22bb7aa52 4332 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 4333 * @param[in] *pRef points to the block of reference data.
emilmont 1:fdd22bb7aa52 4334 * @param[out] *pOut points to the block of output data.
emilmont 1:fdd22bb7aa52 4335 * @param[out] *pErr points to the block of error data.
emilmont 1:fdd22bb7aa52 4336 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 4337 * @return none.
emilmont 1:fdd22bb7aa52 4338 */
emilmont 1:fdd22bb7aa52 4339
emilmont 1:fdd22bb7aa52 4340 void arm_lms_norm_q31(
emilmont 1:fdd22bb7aa52 4341 arm_lms_norm_instance_q31 * S,
emilmont 1:fdd22bb7aa52 4342 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 4343 q31_t * pRef,
emilmont 1:fdd22bb7aa52 4344 q31_t * pOut,
emilmont 1:fdd22bb7aa52 4345 q31_t * pErr,
emilmont 1:fdd22bb7aa52 4346 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 4347
emilmont 1:fdd22bb7aa52 4348 /**
emilmont 1:fdd22bb7aa52 4349 * @brief Initialization function for Q31 normalized LMS filter.
emilmont 1:fdd22bb7aa52 4350 * @param[in] *S points to an instance of the Q31 normalized LMS filter structure.
emilmont 1:fdd22bb7aa52 4351 * @param[in] numTaps number of filter coefficients.
emilmont 1:fdd22bb7aa52 4352 * @param[in] *pCoeffs points to coefficient buffer.
emilmont 1:fdd22bb7aa52 4353 * @param[in] *pState points to state buffer.
emilmont 1:fdd22bb7aa52 4354 * @param[in] mu step size that controls filter coefficient updates.
emilmont 1:fdd22bb7aa52 4355 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 4356 * @param[in] postShift bit shift applied to coefficients.
emilmont 1:fdd22bb7aa52 4357 * @return none.
emilmont 1:fdd22bb7aa52 4358 */
emilmont 1:fdd22bb7aa52 4359
emilmont 1:fdd22bb7aa52 4360 void arm_lms_norm_init_q31(
emilmont 1:fdd22bb7aa52 4361 arm_lms_norm_instance_q31 * S,
emilmont 1:fdd22bb7aa52 4362 uint16_t numTaps,
emilmont 1:fdd22bb7aa52 4363 q31_t * pCoeffs,
emilmont 1:fdd22bb7aa52 4364 q31_t * pState,
emilmont 1:fdd22bb7aa52 4365 q31_t mu,
emilmont 1:fdd22bb7aa52 4366 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 4367 uint8_t postShift);
emilmont 1:fdd22bb7aa52 4368
emilmont 1:fdd22bb7aa52 4369 /**
emilmont 1:fdd22bb7aa52 4370 * @brief Instance structure for the Q15 normalized LMS filter.
emilmont 1:fdd22bb7aa52 4371 */
emilmont 1:fdd22bb7aa52 4372
emilmont 1:fdd22bb7aa52 4373 typedef struct
emilmont 1:fdd22bb7aa52 4374 {
emilmont 1:fdd22bb7aa52 4375 uint16_t numTaps; /**< Number of coefficients in the filter. */
emilmont 1:fdd22bb7aa52 4376 q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */
emilmont 1:fdd22bb7aa52 4377 q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */
emilmont 1:fdd22bb7aa52 4378 q15_t mu; /**< step size that controls filter coefficient updates. */
emilmont 1:fdd22bb7aa52 4379 uint8_t postShift; /**< bit shift applied to coefficients. */
emilmont 1:fdd22bb7aa52 4380 q15_t *recipTable; /**< Points to the reciprocal initial value table. */
emilmont 1:fdd22bb7aa52 4381 q15_t energy; /**< saves previous frame energy. */
emilmont 1:fdd22bb7aa52 4382 q15_t x0; /**< saves previous input sample. */
emilmont 1:fdd22bb7aa52 4383 } arm_lms_norm_instance_q15;
emilmont 1:fdd22bb7aa52 4384
emilmont 1:fdd22bb7aa52 4385 /**
emilmont 1:fdd22bb7aa52 4386 * @brief Processing function for Q15 normalized LMS filter.
emilmont 1:fdd22bb7aa52 4387 * @param[in] *S points to an instance of the Q15 normalized LMS filter structure.
emilmont 1:fdd22bb7aa52 4388 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 4389 * @param[in] *pRef points to the block of reference data.
emilmont 1:fdd22bb7aa52 4390 * @param[out] *pOut points to the block of output data.
emilmont 1:fdd22bb7aa52 4391 * @param[out] *pErr points to the block of error data.
emilmont 1:fdd22bb7aa52 4392 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 4393 * @return none.
emilmont 1:fdd22bb7aa52 4394 */
emilmont 1:fdd22bb7aa52 4395
emilmont 1:fdd22bb7aa52 4396 void arm_lms_norm_q15(
emilmont 1:fdd22bb7aa52 4397 arm_lms_norm_instance_q15 * S,
emilmont 1:fdd22bb7aa52 4398 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 4399 q15_t * pRef,
emilmont 1:fdd22bb7aa52 4400 q15_t * pOut,
emilmont 1:fdd22bb7aa52 4401 q15_t * pErr,
emilmont 1:fdd22bb7aa52 4402 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 4403
emilmont 1:fdd22bb7aa52 4404
emilmont 1:fdd22bb7aa52 4405 /**
emilmont 1:fdd22bb7aa52 4406 * @brief Initialization function for Q15 normalized LMS filter.
emilmont 1:fdd22bb7aa52 4407 * @param[in] *S points to an instance of the Q15 normalized LMS filter structure.
emilmont 1:fdd22bb7aa52 4408 * @param[in] numTaps number of filter coefficients.
emilmont 1:fdd22bb7aa52 4409 * @param[in] *pCoeffs points to coefficient buffer.
emilmont 1:fdd22bb7aa52 4410 * @param[in] *pState points to state buffer.
emilmont 1:fdd22bb7aa52 4411 * @param[in] mu step size that controls filter coefficient updates.
emilmont 1:fdd22bb7aa52 4412 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 4413 * @param[in] postShift bit shift applied to coefficients.
emilmont 1:fdd22bb7aa52 4414 * @return none.
emilmont 1:fdd22bb7aa52 4415 */
emilmont 1:fdd22bb7aa52 4416
emilmont 1:fdd22bb7aa52 4417 void arm_lms_norm_init_q15(
emilmont 1:fdd22bb7aa52 4418 arm_lms_norm_instance_q15 * S,
emilmont 1:fdd22bb7aa52 4419 uint16_t numTaps,
emilmont 1:fdd22bb7aa52 4420 q15_t * pCoeffs,
emilmont 1:fdd22bb7aa52 4421 q15_t * pState,
emilmont 1:fdd22bb7aa52 4422 q15_t mu,
emilmont 1:fdd22bb7aa52 4423 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 4424 uint8_t postShift);
emilmont 1:fdd22bb7aa52 4425
emilmont 1:fdd22bb7aa52 4426 /**
emilmont 1:fdd22bb7aa52 4427 * @brief Correlation of floating-point sequences.
emilmont 1:fdd22bb7aa52 4428 * @param[in] *pSrcA points to the first input sequence.
emilmont 1:fdd22bb7aa52 4429 * @param[in] srcALen length of the first input sequence.
emilmont 1:fdd22bb7aa52 4430 * @param[in] *pSrcB points to the second input sequence.
emilmont 1:fdd22bb7aa52 4431 * @param[in] srcBLen length of the second input sequence.
emilmont 1:fdd22bb7aa52 4432 * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1.
emilmont 1:fdd22bb7aa52 4433 * @return none.
emilmont 1:fdd22bb7aa52 4434 */
emilmont 1:fdd22bb7aa52 4435
emilmont 1:fdd22bb7aa52 4436 void arm_correlate_f32(
emilmont 1:fdd22bb7aa52 4437 float32_t * pSrcA,
emilmont 1:fdd22bb7aa52 4438 uint32_t srcALen,
emilmont 1:fdd22bb7aa52 4439 float32_t * pSrcB,
emilmont 1:fdd22bb7aa52 4440 uint32_t srcBLen,
emilmont 1:fdd22bb7aa52 4441 float32_t * pDst);
emilmont 1:fdd22bb7aa52 4442
emilmont 1:fdd22bb7aa52 4443
mbed_official 3:7a284390b0ce 4444 /**
mbed_official 3:7a284390b0ce 4445 * @brief Correlation of Q15 sequences
mbed_official 3:7a284390b0ce 4446 * @param[in] *pSrcA points to the first input sequence.
mbed_official 3:7a284390b0ce 4447 * @param[in] srcALen length of the first input sequence.
mbed_official 3:7a284390b0ce 4448 * @param[in] *pSrcB points to the second input sequence.
mbed_official 3:7a284390b0ce 4449 * @param[in] srcBLen length of the second input sequence.
mbed_official 3:7a284390b0ce 4450 * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1.
mbed_official 3:7a284390b0ce 4451 * @param[in] *pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
mbed_official 3:7a284390b0ce 4452 * @return none.
emilmont 1:fdd22bb7aa52 4453 */
emilmont 1:fdd22bb7aa52 4454 void arm_correlate_opt_q15(
emilmont 1:fdd22bb7aa52 4455 q15_t * pSrcA,
emilmont 1:fdd22bb7aa52 4456 uint32_t srcALen,
emilmont 1:fdd22bb7aa52 4457 q15_t * pSrcB,
emilmont 1:fdd22bb7aa52 4458 uint32_t srcBLen,
emilmont 1:fdd22bb7aa52 4459 q15_t * pDst,
emilmont 1:fdd22bb7aa52 4460 q15_t * pScratch);
emilmont 1:fdd22bb7aa52 4461
emilmont 1:fdd22bb7aa52 4462
emilmont 1:fdd22bb7aa52 4463 /**
emilmont 1:fdd22bb7aa52 4464 * @brief Correlation of Q15 sequences.
emilmont 1:fdd22bb7aa52 4465 * @param[in] *pSrcA points to the first input sequence.
emilmont 1:fdd22bb7aa52 4466 * @param[in] srcALen length of the first input sequence.
emilmont 1:fdd22bb7aa52 4467 * @param[in] *pSrcB points to the second input sequence.
emilmont 1:fdd22bb7aa52 4468 * @param[in] srcBLen length of the second input sequence.
emilmont 1:fdd22bb7aa52 4469 * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1.
emilmont 1:fdd22bb7aa52 4470 * @return none.
emilmont 1:fdd22bb7aa52 4471 */
emilmont 1:fdd22bb7aa52 4472
emilmont 1:fdd22bb7aa52 4473 void arm_correlate_q15(
emilmont 1:fdd22bb7aa52 4474 q15_t * pSrcA,
emilmont 1:fdd22bb7aa52 4475 uint32_t srcALen,
emilmont 1:fdd22bb7aa52 4476 q15_t * pSrcB,
emilmont 1:fdd22bb7aa52 4477 uint32_t srcBLen,
emilmont 1:fdd22bb7aa52 4478 q15_t * pDst);
emilmont 1:fdd22bb7aa52 4479
emilmont 1:fdd22bb7aa52 4480 /**
emilmont 1:fdd22bb7aa52 4481 * @brief Correlation of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4.
emilmont 1:fdd22bb7aa52 4482 * @param[in] *pSrcA points to the first input sequence.
emilmont 1:fdd22bb7aa52 4483 * @param[in] srcALen length of the first input sequence.
emilmont 1:fdd22bb7aa52 4484 * @param[in] *pSrcB points to the second input sequence.
emilmont 1:fdd22bb7aa52 4485 * @param[in] srcBLen length of the second input sequence.
emilmont 1:fdd22bb7aa52 4486 * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1.
emilmont 1:fdd22bb7aa52 4487 * @return none.
emilmont 1:fdd22bb7aa52 4488 */
emilmont 1:fdd22bb7aa52 4489
emilmont 1:fdd22bb7aa52 4490 void arm_correlate_fast_q15(
emilmont 2:da51fb522205 4491 q15_t * pSrcA,
emilmont 2:da51fb522205 4492 uint32_t srcALen,
emilmont 2:da51fb522205 4493 q15_t * pSrcB,
emilmont 2:da51fb522205 4494 uint32_t srcBLen,
emilmont 2:da51fb522205 4495 q15_t * pDst);
emilmont 1:fdd22bb7aa52 4496
emilmont 1:fdd22bb7aa52 4497
emilmont 1:fdd22bb7aa52 4498
emilmont 1:fdd22bb7aa52 4499 /**
emilmont 1:fdd22bb7aa52 4500 * @brief Correlation of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4.
emilmont 1:fdd22bb7aa52 4501 * @param[in] *pSrcA points to the first input sequence.
emilmont 1:fdd22bb7aa52 4502 * @param[in] srcALen length of the first input sequence.
emilmont 1:fdd22bb7aa52 4503 * @param[in] *pSrcB points to the second input sequence.
emilmont 1:fdd22bb7aa52 4504 * @param[in] srcBLen length of the second input sequence.
emilmont 1:fdd22bb7aa52 4505 * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1.
mbed_official 3:7a284390b0ce 4506 * @param[in] *pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
emilmont 1:fdd22bb7aa52 4507 * @return none.
emilmont 1:fdd22bb7aa52 4508 */
emilmont 1:fdd22bb7aa52 4509
emilmont 1:fdd22bb7aa52 4510 void arm_correlate_fast_opt_q15(
emilmont 1:fdd22bb7aa52 4511 q15_t * pSrcA,
emilmont 1:fdd22bb7aa52 4512 uint32_t srcALen,
emilmont 1:fdd22bb7aa52 4513 q15_t * pSrcB,
emilmont 1:fdd22bb7aa52 4514 uint32_t srcBLen,
emilmont 1:fdd22bb7aa52 4515 q15_t * pDst,
emilmont 1:fdd22bb7aa52 4516 q15_t * pScratch);
emilmont 1:fdd22bb7aa52 4517
emilmont 1:fdd22bb7aa52 4518 /**
emilmont 1:fdd22bb7aa52 4519 * @brief Correlation of Q31 sequences.
emilmont 1:fdd22bb7aa52 4520 * @param[in] *pSrcA points to the first input sequence.
emilmont 1:fdd22bb7aa52 4521 * @param[in] srcALen length of the first input sequence.
emilmont 1:fdd22bb7aa52 4522 * @param[in] *pSrcB points to the second input sequence.
emilmont 1:fdd22bb7aa52 4523 * @param[in] srcBLen length of the second input sequence.
emilmont 1:fdd22bb7aa52 4524 * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1.
emilmont 1:fdd22bb7aa52 4525 * @return none.
emilmont 1:fdd22bb7aa52 4526 */
emilmont 1:fdd22bb7aa52 4527
emilmont 1:fdd22bb7aa52 4528 void arm_correlate_q31(
emilmont 1:fdd22bb7aa52 4529 q31_t * pSrcA,
emilmont 1:fdd22bb7aa52 4530 uint32_t srcALen,
emilmont 1:fdd22bb7aa52 4531 q31_t * pSrcB,
emilmont 1:fdd22bb7aa52 4532 uint32_t srcBLen,
emilmont 1:fdd22bb7aa52 4533 q31_t * pDst);
emilmont 1:fdd22bb7aa52 4534
emilmont 1:fdd22bb7aa52 4535 /**
emilmont 1:fdd22bb7aa52 4536 * @brief Correlation of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4
emilmont 1:fdd22bb7aa52 4537 * @param[in] *pSrcA points to the first input sequence.
emilmont 1:fdd22bb7aa52 4538 * @param[in] srcALen length of the first input sequence.
emilmont 1:fdd22bb7aa52 4539 * @param[in] *pSrcB points to the second input sequence.
emilmont 1:fdd22bb7aa52 4540 * @param[in] srcBLen length of the second input sequence.
emilmont 1:fdd22bb7aa52 4541 * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1.
emilmont 1:fdd22bb7aa52 4542 * @return none.
emilmont 1:fdd22bb7aa52 4543 */
emilmont 1:fdd22bb7aa52 4544
emilmont 1:fdd22bb7aa52 4545 void arm_correlate_fast_q31(
emilmont 1:fdd22bb7aa52 4546 q31_t * pSrcA,
emilmont 1:fdd22bb7aa52 4547 uint32_t srcALen,
emilmont 1:fdd22bb7aa52 4548 q31_t * pSrcB,
emilmont 1:fdd22bb7aa52 4549 uint32_t srcBLen,
emilmont 1:fdd22bb7aa52 4550 q31_t * pDst);
emilmont 1:fdd22bb7aa52 4551
emilmont 1:fdd22bb7aa52 4552
emilmont 1:fdd22bb7aa52 4553
mbed_official 3:7a284390b0ce 4554 /**
mbed_official 3:7a284390b0ce 4555 * @brief Correlation of Q7 sequences.
mbed_official 3:7a284390b0ce 4556 * @param[in] *pSrcA points to the first input sequence.
mbed_official 3:7a284390b0ce 4557 * @param[in] srcALen length of the first input sequence.
mbed_official 3:7a284390b0ce 4558 * @param[in] *pSrcB points to the second input sequence.
mbed_official 3:7a284390b0ce 4559 * @param[in] srcBLen length of the second input sequence.
mbed_official 3:7a284390b0ce 4560 * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1.
mbed_official 3:7a284390b0ce 4561 * @param[in] *pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
mbed_official 3:7a284390b0ce 4562 * @param[in] *pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen).
mbed_official 3:7a284390b0ce 4563 * @return none.
emilmont 1:fdd22bb7aa52 4564 */
emilmont 1:fdd22bb7aa52 4565
emilmont 1:fdd22bb7aa52 4566 void arm_correlate_opt_q7(
emilmont 1:fdd22bb7aa52 4567 q7_t * pSrcA,
emilmont 1:fdd22bb7aa52 4568 uint32_t srcALen,
emilmont 1:fdd22bb7aa52 4569 q7_t * pSrcB,
emilmont 1:fdd22bb7aa52 4570 uint32_t srcBLen,
emilmont 1:fdd22bb7aa52 4571 q7_t * pDst,
emilmont 1:fdd22bb7aa52 4572 q15_t * pScratch1,
emilmont 1:fdd22bb7aa52 4573 q15_t * pScratch2);
emilmont 1:fdd22bb7aa52 4574
emilmont 1:fdd22bb7aa52 4575
emilmont 1:fdd22bb7aa52 4576 /**
emilmont 1:fdd22bb7aa52 4577 * @brief Correlation of Q7 sequences.
emilmont 1:fdd22bb7aa52 4578 * @param[in] *pSrcA points to the first input sequence.
emilmont 1:fdd22bb7aa52 4579 * @param[in] srcALen length of the first input sequence.
emilmont 1:fdd22bb7aa52 4580 * @param[in] *pSrcB points to the second input sequence.
emilmont 1:fdd22bb7aa52 4581 * @param[in] srcBLen length of the second input sequence.
emilmont 1:fdd22bb7aa52 4582 * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1.
emilmont 1:fdd22bb7aa52 4583 * @return none.
emilmont 1:fdd22bb7aa52 4584 */
emilmont 1:fdd22bb7aa52 4585
emilmont 1:fdd22bb7aa52 4586 void arm_correlate_q7(
emilmont 1:fdd22bb7aa52 4587 q7_t * pSrcA,
emilmont 1:fdd22bb7aa52 4588 uint32_t srcALen,
emilmont 1:fdd22bb7aa52 4589 q7_t * pSrcB,
emilmont 1:fdd22bb7aa52 4590 uint32_t srcBLen,
emilmont 1:fdd22bb7aa52 4591 q7_t * pDst);
emilmont 1:fdd22bb7aa52 4592
emilmont 1:fdd22bb7aa52 4593
emilmont 1:fdd22bb7aa52 4594 /**
emilmont 1:fdd22bb7aa52 4595 * @brief Instance structure for the floating-point sparse FIR filter.
emilmont 1:fdd22bb7aa52 4596 */
emilmont 1:fdd22bb7aa52 4597 typedef struct
emilmont 1:fdd22bb7aa52 4598 {
emilmont 1:fdd22bb7aa52 4599 uint16_t numTaps; /**< number of coefficients in the filter. */
emilmont 1:fdd22bb7aa52 4600 uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */
emilmont 1:fdd22bb7aa52 4601 float32_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */
emilmont 1:fdd22bb7aa52 4602 float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/
emilmont 1:fdd22bb7aa52 4603 uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */
emilmont 1:fdd22bb7aa52 4604 int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */
emilmont 1:fdd22bb7aa52 4605 } arm_fir_sparse_instance_f32;
emilmont 1:fdd22bb7aa52 4606
emilmont 1:fdd22bb7aa52 4607 /**
emilmont 1:fdd22bb7aa52 4608 * @brief Instance structure for the Q31 sparse FIR filter.
emilmont 1:fdd22bb7aa52 4609 */
emilmont 1:fdd22bb7aa52 4610
emilmont 1:fdd22bb7aa52 4611 typedef struct
emilmont 1:fdd22bb7aa52 4612 {
emilmont 1:fdd22bb7aa52 4613 uint16_t numTaps; /**< number of coefficients in the filter. */
emilmont 1:fdd22bb7aa52 4614 uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */
emilmont 1:fdd22bb7aa52 4615 q31_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */
emilmont 1:fdd22bb7aa52 4616 q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/
emilmont 1:fdd22bb7aa52 4617 uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */
emilmont 1:fdd22bb7aa52 4618 int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */
emilmont 1:fdd22bb7aa52 4619 } arm_fir_sparse_instance_q31;
emilmont 1:fdd22bb7aa52 4620
emilmont 1:fdd22bb7aa52 4621 /**
emilmont 1:fdd22bb7aa52 4622 * @brief Instance structure for the Q15 sparse FIR filter.
emilmont 1:fdd22bb7aa52 4623 */
emilmont 1:fdd22bb7aa52 4624
emilmont 1:fdd22bb7aa52 4625 typedef struct
emilmont 1:fdd22bb7aa52 4626 {
emilmont 1:fdd22bb7aa52 4627 uint16_t numTaps; /**< number of coefficients in the filter. */
emilmont 1:fdd22bb7aa52 4628 uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */
emilmont 1:fdd22bb7aa52 4629 q15_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */
emilmont 1:fdd22bb7aa52 4630 q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/
emilmont 1:fdd22bb7aa52 4631 uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */
emilmont 1:fdd22bb7aa52 4632 int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */
emilmont 1:fdd22bb7aa52 4633 } arm_fir_sparse_instance_q15;
emilmont 1:fdd22bb7aa52 4634
emilmont 1:fdd22bb7aa52 4635 /**
emilmont 1:fdd22bb7aa52 4636 * @brief Instance structure for the Q7 sparse FIR filter.
emilmont 1:fdd22bb7aa52 4637 */
emilmont 1:fdd22bb7aa52 4638
emilmont 1:fdd22bb7aa52 4639 typedef struct
emilmont 1:fdd22bb7aa52 4640 {
emilmont 1:fdd22bb7aa52 4641 uint16_t numTaps; /**< number of coefficients in the filter. */
emilmont 1:fdd22bb7aa52 4642 uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */
emilmont 1:fdd22bb7aa52 4643 q7_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */
emilmont 1:fdd22bb7aa52 4644 q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/
emilmont 1:fdd22bb7aa52 4645 uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */
emilmont 1:fdd22bb7aa52 4646 int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */
emilmont 1:fdd22bb7aa52 4647 } arm_fir_sparse_instance_q7;
emilmont 1:fdd22bb7aa52 4648
emilmont 1:fdd22bb7aa52 4649 /**
emilmont 1:fdd22bb7aa52 4650 * @brief Processing function for the floating-point sparse FIR filter.
emilmont 1:fdd22bb7aa52 4651 * @param[in] *S points to an instance of the floating-point sparse FIR structure.
emilmont 1:fdd22bb7aa52 4652 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 4653 * @param[out] *pDst points to the block of output data
emilmont 1:fdd22bb7aa52 4654 * @param[in] *pScratchIn points to a temporary buffer of size blockSize.
emilmont 1:fdd22bb7aa52 4655 * @param[in] blockSize number of input samples to process per call.
emilmont 1:fdd22bb7aa52 4656 * @return none.
emilmont 1:fdd22bb7aa52 4657 */
emilmont 1:fdd22bb7aa52 4658
emilmont 1:fdd22bb7aa52 4659 void arm_fir_sparse_f32(
emilmont 1:fdd22bb7aa52 4660 arm_fir_sparse_instance_f32 * S,
emilmont 1:fdd22bb7aa52 4661 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 4662 float32_t * pDst,
emilmont 1:fdd22bb7aa52 4663 float32_t * pScratchIn,
emilmont 1:fdd22bb7aa52 4664 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 4665
emilmont 1:fdd22bb7aa52 4666 /**
emilmont 1:fdd22bb7aa52 4667 * @brief Initialization function for the floating-point sparse FIR filter.
emilmont 1:fdd22bb7aa52 4668 * @param[in,out] *S points to an instance of the floating-point sparse FIR structure.
emilmont 1:fdd22bb7aa52 4669 * @param[in] numTaps number of nonzero coefficients in the filter.
emilmont 1:fdd22bb7aa52 4670 * @param[in] *pCoeffs points to the array of filter coefficients.
emilmont 1:fdd22bb7aa52 4671 * @param[in] *pState points to the state buffer.
emilmont 1:fdd22bb7aa52 4672 * @param[in] *pTapDelay points to the array of offset times.
emilmont 1:fdd22bb7aa52 4673 * @param[in] maxDelay maximum offset time supported.
emilmont 1:fdd22bb7aa52 4674 * @param[in] blockSize number of samples that will be processed per block.
emilmont 1:fdd22bb7aa52 4675 * @return none
emilmont 1:fdd22bb7aa52 4676 */
emilmont 1:fdd22bb7aa52 4677
emilmont 1:fdd22bb7aa52 4678 void arm_fir_sparse_init_f32(
emilmont 1:fdd22bb7aa52 4679 arm_fir_sparse_instance_f32 * S,
emilmont 1:fdd22bb7aa52 4680 uint16_t numTaps,
emilmont 1:fdd22bb7aa52 4681 float32_t * pCoeffs,
emilmont 1:fdd22bb7aa52 4682 float32_t * pState,
emilmont 1:fdd22bb7aa52 4683 int32_t * pTapDelay,
emilmont 1:fdd22bb7aa52 4684 uint16_t maxDelay,
emilmont 1:fdd22bb7aa52 4685 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 4686
emilmont 1:fdd22bb7aa52 4687 /**
emilmont 1:fdd22bb7aa52 4688 * @brief Processing function for the Q31 sparse FIR filter.
emilmont 1:fdd22bb7aa52 4689 * @param[in] *S points to an instance of the Q31 sparse FIR structure.
emilmont 1:fdd22bb7aa52 4690 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 4691 * @param[out] *pDst points to the block of output data
emilmont 1:fdd22bb7aa52 4692 * @param[in] *pScratchIn points to a temporary buffer of size blockSize.
emilmont 1:fdd22bb7aa52 4693 * @param[in] blockSize number of input samples to process per call.
emilmont 1:fdd22bb7aa52 4694 * @return none.
emilmont 1:fdd22bb7aa52 4695 */
emilmont 1:fdd22bb7aa52 4696
emilmont 1:fdd22bb7aa52 4697 void arm_fir_sparse_q31(
emilmont 1:fdd22bb7aa52 4698 arm_fir_sparse_instance_q31 * S,
emilmont 1:fdd22bb7aa52 4699 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 4700 q31_t * pDst,
emilmont 1:fdd22bb7aa52 4701 q31_t * pScratchIn,
emilmont 1:fdd22bb7aa52 4702 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 4703
emilmont 1:fdd22bb7aa52 4704 /**
emilmont 1:fdd22bb7aa52 4705 * @brief Initialization function for the Q31 sparse FIR filter.
emilmont 1:fdd22bb7aa52 4706 * @param[in,out] *S points to an instance of the Q31 sparse FIR structure.
emilmont 1:fdd22bb7aa52 4707 * @param[in] numTaps number of nonzero coefficients in the filter.
emilmont 1:fdd22bb7aa52 4708 * @param[in] *pCoeffs points to the array of filter coefficients.
emilmont 1:fdd22bb7aa52 4709 * @param[in] *pState points to the state buffer.
emilmont 1:fdd22bb7aa52 4710 * @param[in] *pTapDelay points to the array of offset times.
emilmont 1:fdd22bb7aa52 4711 * @param[in] maxDelay maximum offset time supported.
emilmont 1:fdd22bb7aa52 4712 * @param[in] blockSize number of samples that will be processed per block.
emilmont 1:fdd22bb7aa52 4713 * @return none
emilmont 1:fdd22bb7aa52 4714 */
emilmont 1:fdd22bb7aa52 4715
emilmont 1:fdd22bb7aa52 4716 void arm_fir_sparse_init_q31(
emilmont 1:fdd22bb7aa52 4717 arm_fir_sparse_instance_q31 * S,
emilmont 1:fdd22bb7aa52 4718 uint16_t numTaps,
emilmont 1:fdd22bb7aa52 4719 q31_t * pCoeffs,
emilmont 1:fdd22bb7aa52 4720 q31_t * pState,
emilmont 1:fdd22bb7aa52 4721 int32_t * pTapDelay,
emilmont 1:fdd22bb7aa52 4722 uint16_t maxDelay,
emilmont 1:fdd22bb7aa52 4723 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 4724
emilmont 1:fdd22bb7aa52 4725 /**
emilmont 1:fdd22bb7aa52 4726 * @brief Processing function for the Q15 sparse FIR filter.
emilmont 1:fdd22bb7aa52 4727 * @param[in] *S points to an instance of the Q15 sparse FIR structure.
emilmont 1:fdd22bb7aa52 4728 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 4729 * @param[out] *pDst points to the block of output data
emilmont 1:fdd22bb7aa52 4730 * @param[in] *pScratchIn points to a temporary buffer of size blockSize.
emilmont 1:fdd22bb7aa52 4731 * @param[in] *pScratchOut points to a temporary buffer of size blockSize.
emilmont 1:fdd22bb7aa52 4732 * @param[in] blockSize number of input samples to process per call.
emilmont 1:fdd22bb7aa52 4733 * @return none.
emilmont 1:fdd22bb7aa52 4734 */
emilmont 1:fdd22bb7aa52 4735
emilmont 1:fdd22bb7aa52 4736 void arm_fir_sparse_q15(
emilmont 1:fdd22bb7aa52 4737 arm_fir_sparse_instance_q15 * S,
emilmont 1:fdd22bb7aa52 4738 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 4739 q15_t * pDst,
emilmont 1:fdd22bb7aa52 4740 q15_t * pScratchIn,
emilmont 1:fdd22bb7aa52 4741 q31_t * pScratchOut,
emilmont 1:fdd22bb7aa52 4742 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 4743
emilmont 1:fdd22bb7aa52 4744
emilmont 1:fdd22bb7aa52 4745 /**
emilmont 1:fdd22bb7aa52 4746 * @brief Initialization function for the Q15 sparse FIR filter.
emilmont 1:fdd22bb7aa52 4747 * @param[in,out] *S points to an instance of the Q15 sparse FIR structure.
emilmont 1:fdd22bb7aa52 4748 * @param[in] numTaps number of nonzero coefficients in the filter.
emilmont 1:fdd22bb7aa52 4749 * @param[in] *pCoeffs points to the array of filter coefficients.
emilmont 1:fdd22bb7aa52 4750 * @param[in] *pState points to the state buffer.
emilmont 1:fdd22bb7aa52 4751 * @param[in] *pTapDelay points to the array of offset times.
emilmont 1:fdd22bb7aa52 4752 * @param[in] maxDelay maximum offset time supported.
emilmont 1:fdd22bb7aa52 4753 * @param[in] blockSize number of samples that will be processed per block.
emilmont 1:fdd22bb7aa52 4754 * @return none
emilmont 1:fdd22bb7aa52 4755 */
emilmont 1:fdd22bb7aa52 4756
emilmont 1:fdd22bb7aa52 4757 void arm_fir_sparse_init_q15(
emilmont 1:fdd22bb7aa52 4758 arm_fir_sparse_instance_q15 * S,
emilmont 1:fdd22bb7aa52 4759 uint16_t numTaps,
emilmont 1:fdd22bb7aa52 4760 q15_t * pCoeffs,
emilmont 1:fdd22bb7aa52 4761 q15_t * pState,
emilmont 1:fdd22bb7aa52 4762 int32_t * pTapDelay,
emilmont 1:fdd22bb7aa52 4763 uint16_t maxDelay,
emilmont 1:fdd22bb7aa52 4764 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 4765
emilmont 1:fdd22bb7aa52 4766 /**
emilmont 1:fdd22bb7aa52 4767 * @brief Processing function for the Q7 sparse FIR filter.
emilmont 1:fdd22bb7aa52 4768 * @param[in] *S points to an instance of the Q7 sparse FIR structure.
emilmont 1:fdd22bb7aa52 4769 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 4770 * @param[out] *pDst points to the block of output data
emilmont 1:fdd22bb7aa52 4771 * @param[in] *pScratchIn points to a temporary buffer of size blockSize.
emilmont 1:fdd22bb7aa52 4772 * @param[in] *pScratchOut points to a temporary buffer of size blockSize.
emilmont 1:fdd22bb7aa52 4773 * @param[in] blockSize number of input samples to process per call.
emilmont 1:fdd22bb7aa52 4774 * @return none.
emilmont 1:fdd22bb7aa52 4775 */
emilmont 1:fdd22bb7aa52 4776
emilmont 1:fdd22bb7aa52 4777 void arm_fir_sparse_q7(
emilmont 1:fdd22bb7aa52 4778 arm_fir_sparse_instance_q7 * S,
emilmont 1:fdd22bb7aa52 4779 q7_t * pSrc,
emilmont 1:fdd22bb7aa52 4780 q7_t * pDst,
emilmont 1:fdd22bb7aa52 4781 q7_t * pScratchIn,
emilmont 1:fdd22bb7aa52 4782 q31_t * pScratchOut,
emilmont 1:fdd22bb7aa52 4783 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 4784
emilmont 1:fdd22bb7aa52 4785 /**
emilmont 1:fdd22bb7aa52 4786 * @brief Initialization function for the Q7 sparse FIR filter.
emilmont 1:fdd22bb7aa52 4787 * @param[in,out] *S points to an instance of the Q7 sparse FIR structure.
emilmont 1:fdd22bb7aa52 4788 * @param[in] numTaps number of nonzero coefficients in the filter.
emilmont 1:fdd22bb7aa52 4789 * @param[in] *pCoeffs points to the array of filter coefficients.
emilmont 1:fdd22bb7aa52 4790 * @param[in] *pState points to the state buffer.
emilmont 1:fdd22bb7aa52 4791 * @param[in] *pTapDelay points to the array of offset times.
emilmont 1:fdd22bb7aa52 4792 * @param[in] maxDelay maximum offset time supported.
emilmont 1:fdd22bb7aa52 4793 * @param[in] blockSize number of samples that will be processed per block.
emilmont 1:fdd22bb7aa52 4794 * @return none
emilmont 1:fdd22bb7aa52 4795 */
emilmont 1:fdd22bb7aa52 4796
emilmont 1:fdd22bb7aa52 4797 void arm_fir_sparse_init_q7(
emilmont 1:fdd22bb7aa52 4798 arm_fir_sparse_instance_q7 * S,
emilmont 1:fdd22bb7aa52 4799 uint16_t numTaps,
emilmont 1:fdd22bb7aa52 4800 q7_t * pCoeffs,
emilmont 1:fdd22bb7aa52 4801 q7_t * pState,
emilmont 1:fdd22bb7aa52 4802 int32_t * pTapDelay,
emilmont 1:fdd22bb7aa52 4803 uint16_t maxDelay,
emilmont 1:fdd22bb7aa52 4804 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 4805
emilmont 1:fdd22bb7aa52 4806
emilmont 1:fdd22bb7aa52 4807 /*
emilmont 1:fdd22bb7aa52 4808 * @brief Floating-point sin_cos function.
mbed_official 3:7a284390b0ce 4809 * @param[in] theta input value in degrees
mbed_official 3:7a284390b0ce 4810 * @param[out] *pSinVal points to the processed sine output.
mbed_official 3:7a284390b0ce 4811 * @param[out] *pCosVal points to the processed cos output.
emilmont 1:fdd22bb7aa52 4812 * @return none.
emilmont 1:fdd22bb7aa52 4813 */
emilmont 1:fdd22bb7aa52 4814
emilmont 1:fdd22bb7aa52 4815 void arm_sin_cos_f32(
emilmont 1:fdd22bb7aa52 4816 float32_t theta,
emilmont 1:fdd22bb7aa52 4817 float32_t * pSinVal,
emilmont 1:fdd22bb7aa52 4818 float32_t * pCcosVal);
emilmont 1:fdd22bb7aa52 4819
emilmont 1:fdd22bb7aa52 4820 /*
emilmont 1:fdd22bb7aa52 4821 * @brief Q31 sin_cos function.
mbed_official 3:7a284390b0ce 4822 * @param[in] theta scaled input value in degrees
mbed_official 3:7a284390b0ce 4823 * @param[out] *pSinVal points to the processed sine output.
mbed_official 3:7a284390b0ce 4824 * @param[out] *pCosVal points to the processed cosine output.
emilmont 1:fdd22bb7aa52 4825 * @return none.
emilmont 1:fdd22bb7aa52 4826 */
emilmont 1:fdd22bb7aa52 4827
emilmont 1:fdd22bb7aa52 4828 void arm_sin_cos_q31(
emilmont 1:fdd22bb7aa52 4829 q31_t theta,
emilmont 1:fdd22bb7aa52 4830 q31_t * pSinVal,
emilmont 1:fdd22bb7aa52 4831 q31_t * pCosVal);
emilmont 1:fdd22bb7aa52 4832
emilmont 1:fdd22bb7aa52 4833
emilmont 1:fdd22bb7aa52 4834 /**
emilmont 1:fdd22bb7aa52 4835 * @brief Floating-point complex conjugate.
emilmont 1:fdd22bb7aa52 4836 * @param[in] *pSrc points to the input vector
emilmont 1:fdd22bb7aa52 4837 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 4838 * @param[in] numSamples number of complex samples in each vector
emilmont 1:fdd22bb7aa52 4839 * @return none.
emilmont 1:fdd22bb7aa52 4840 */
emilmont 1:fdd22bb7aa52 4841
emilmont 1:fdd22bb7aa52 4842 void arm_cmplx_conj_f32(
emilmont 1:fdd22bb7aa52 4843 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 4844 float32_t * pDst,
emilmont 1:fdd22bb7aa52 4845 uint32_t numSamples);
emilmont 1:fdd22bb7aa52 4846
emilmont 1:fdd22bb7aa52 4847 /**
emilmont 1:fdd22bb7aa52 4848 * @brief Q31 complex conjugate.
emilmont 1:fdd22bb7aa52 4849 * @param[in] *pSrc points to the input vector
emilmont 1:fdd22bb7aa52 4850 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 4851 * @param[in] numSamples number of complex samples in each vector
emilmont 1:fdd22bb7aa52 4852 * @return none.
emilmont 1:fdd22bb7aa52 4853 */
emilmont 1:fdd22bb7aa52 4854
emilmont 1:fdd22bb7aa52 4855 void arm_cmplx_conj_q31(
emilmont 1:fdd22bb7aa52 4856 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 4857 q31_t * pDst,
emilmont 1:fdd22bb7aa52 4858 uint32_t numSamples);
emilmont 1:fdd22bb7aa52 4859
emilmont 1:fdd22bb7aa52 4860 /**
emilmont 1:fdd22bb7aa52 4861 * @brief Q15 complex conjugate.
emilmont 1:fdd22bb7aa52 4862 * @param[in] *pSrc points to the input vector
emilmont 1:fdd22bb7aa52 4863 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 4864 * @param[in] numSamples number of complex samples in each vector
emilmont 1:fdd22bb7aa52 4865 * @return none.
emilmont 1:fdd22bb7aa52 4866 */
emilmont 1:fdd22bb7aa52 4867
emilmont 1:fdd22bb7aa52 4868 void arm_cmplx_conj_q15(
emilmont 1:fdd22bb7aa52 4869 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 4870 q15_t * pDst,
emilmont 1:fdd22bb7aa52 4871 uint32_t numSamples);
emilmont 1:fdd22bb7aa52 4872
emilmont 1:fdd22bb7aa52 4873
emilmont 1:fdd22bb7aa52 4874
emilmont 1:fdd22bb7aa52 4875 /**
emilmont 1:fdd22bb7aa52 4876 * @brief Floating-point complex magnitude squared
emilmont 1:fdd22bb7aa52 4877 * @param[in] *pSrc points to the complex input vector
emilmont 1:fdd22bb7aa52 4878 * @param[out] *pDst points to the real output vector
emilmont 1:fdd22bb7aa52 4879 * @param[in] numSamples number of complex samples in the input vector
emilmont 1:fdd22bb7aa52 4880 * @return none.
emilmont 1:fdd22bb7aa52 4881 */
emilmont 1:fdd22bb7aa52 4882
emilmont 1:fdd22bb7aa52 4883 void arm_cmplx_mag_squared_f32(
emilmont 1:fdd22bb7aa52 4884 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 4885 float32_t * pDst,
emilmont 1:fdd22bb7aa52 4886 uint32_t numSamples);
emilmont 1:fdd22bb7aa52 4887
emilmont 1:fdd22bb7aa52 4888 /**
emilmont 1:fdd22bb7aa52 4889 * @brief Q31 complex magnitude squared
emilmont 1:fdd22bb7aa52 4890 * @param[in] *pSrc points to the complex input vector
emilmont 1:fdd22bb7aa52 4891 * @param[out] *pDst points to the real output vector
emilmont 1:fdd22bb7aa52 4892 * @param[in] numSamples number of complex samples in the input vector
emilmont 1:fdd22bb7aa52 4893 * @return none.
emilmont 1:fdd22bb7aa52 4894 */
emilmont 1:fdd22bb7aa52 4895
emilmont 1:fdd22bb7aa52 4896 void arm_cmplx_mag_squared_q31(
emilmont 1:fdd22bb7aa52 4897 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 4898 q31_t * pDst,
emilmont 1:fdd22bb7aa52 4899 uint32_t numSamples);
emilmont 1:fdd22bb7aa52 4900
emilmont 1:fdd22bb7aa52 4901 /**
emilmont 1:fdd22bb7aa52 4902 * @brief Q15 complex magnitude squared
emilmont 1:fdd22bb7aa52 4903 * @param[in] *pSrc points to the complex input vector
emilmont 1:fdd22bb7aa52 4904 * @param[out] *pDst points to the real output vector
emilmont 1:fdd22bb7aa52 4905 * @param[in] numSamples number of complex samples in the input vector
emilmont 1:fdd22bb7aa52 4906 * @return none.
emilmont 1:fdd22bb7aa52 4907 */
emilmont 1:fdd22bb7aa52 4908
emilmont 1:fdd22bb7aa52 4909 void arm_cmplx_mag_squared_q15(
emilmont 1:fdd22bb7aa52 4910 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 4911 q15_t * pDst,
emilmont 1:fdd22bb7aa52 4912 uint32_t numSamples);
emilmont 1:fdd22bb7aa52 4913
emilmont 1:fdd22bb7aa52 4914
emilmont 1:fdd22bb7aa52 4915 /**
emilmont 1:fdd22bb7aa52 4916 * @ingroup groupController
emilmont 1:fdd22bb7aa52 4917 */
emilmont 1:fdd22bb7aa52 4918
emilmont 1:fdd22bb7aa52 4919 /**
emilmont 1:fdd22bb7aa52 4920 * @defgroup PID PID Motor Control
emilmont 1:fdd22bb7aa52 4921 *
mbed_official 3:7a284390b0ce 4922 * A Proportional Integral Derivative (PID) controller is a generic feedback control
emilmont 1:fdd22bb7aa52 4923 * loop mechanism widely used in industrial control systems.
emilmont 1:fdd22bb7aa52 4924 * A PID controller is the most commonly used type of feedback controller.
emilmont 1:fdd22bb7aa52 4925 *
emilmont 1:fdd22bb7aa52 4926 * This set of functions implements (PID) controllers
emilmont 1:fdd22bb7aa52 4927 * for Q15, Q31, and floating-point data types. The functions operate on a single sample
emilmont 1:fdd22bb7aa52 4928 * of data and each call to the function returns a single processed value.
emilmont 1:fdd22bb7aa52 4929 * <code>S</code> points to an instance of the PID control data structure. <code>in</code>
emilmont 1:fdd22bb7aa52 4930 * is the input sample value. The functions return the output value.
emilmont 1:fdd22bb7aa52 4931 *
emilmont 1:fdd22bb7aa52 4932 * \par Algorithm:
emilmont 1:fdd22bb7aa52 4933 * <pre>
emilmont 1:fdd22bb7aa52 4934 * y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2]
emilmont 1:fdd22bb7aa52 4935 * A0 = Kp + Ki + Kd
emilmont 1:fdd22bb7aa52 4936 * A1 = (-Kp ) - (2 * Kd )
emilmont 1:fdd22bb7aa52 4937 * A2 = Kd </pre>
emilmont 1:fdd22bb7aa52 4938 *
emilmont 1:fdd22bb7aa52 4939 * \par
emilmont 1:fdd22bb7aa52 4940 * where \c Kp is proportional constant, \c Ki is Integral constant and \c Kd is Derivative constant
mbed_official 3:7a284390b0ce 4941 *
mbed_official 3:7a284390b0ce 4942 * \par
mbed_official 3:7a284390b0ce 4943 * \image html PID.gif "Proportional Integral Derivative Controller"
emilmont 1:fdd22bb7aa52 4944 *
emilmont 1:fdd22bb7aa52 4945 * \par
emilmont 1:fdd22bb7aa52 4946 * The PID controller calculates an "error" value as the difference between
emilmont 1:fdd22bb7aa52 4947 * the measured output and the reference input.
mbed_official 3:7a284390b0ce 4948 * The controller attempts to minimize the error by adjusting the process control inputs.
mbed_official 3:7a284390b0ce 4949 * The proportional value determines the reaction to the current error,
mbed_official 3:7a284390b0ce 4950 * the integral value determines the reaction based on the sum of recent errors,
emilmont 1:fdd22bb7aa52 4951 * and the derivative value determines the reaction based on the rate at which the error has been changing.
emilmont 1:fdd22bb7aa52 4952 *
mbed_official 3:7a284390b0ce 4953 * \par Instance Structure
mbed_official 3:7a284390b0ce 4954 * The Gains A0, A1, A2 and state variables for a PID controller are stored together in an instance data structure.
mbed_official 3:7a284390b0ce 4955 * A separate instance structure must be defined for each PID Controller.
mbed_official 3:7a284390b0ce 4956 * There are separate instance structure declarations for each of the 3 supported data types.
mbed_official 3:7a284390b0ce 4957 *
mbed_official 3:7a284390b0ce 4958 * \par Reset Functions
mbed_official 3:7a284390b0ce 4959 * There is also an associated reset function for each data type which clears the state array.
emilmont 1:fdd22bb7aa52 4960 *
mbed_official 3:7a284390b0ce 4961 * \par Initialization Functions
mbed_official 3:7a284390b0ce 4962 * There is also an associated initialization function for each data type.
mbed_official 3:7a284390b0ce 4963 * The initialization function performs the following operations:
emilmont 1:fdd22bb7aa52 4964 * - Initializes the Gains A0, A1, A2 from Kp,Ki, Kd gains.
mbed_official 3:7a284390b0ce 4965 * - Zeros out the values in the state buffer.
mbed_official 3:7a284390b0ce 4966 *
mbed_official 3:7a284390b0ce 4967 * \par
mbed_official 3:7a284390b0ce 4968 * Instance structure cannot be placed into a const data section and it is recommended to use the initialization function.
emilmont 1:fdd22bb7aa52 4969 *
mbed_official 3:7a284390b0ce 4970 * \par Fixed-Point Behavior
mbed_official 3:7a284390b0ce 4971 * Care must be taken when using the fixed-point versions of the PID Controller functions.
mbed_official 3:7a284390b0ce 4972 * In particular, the overflow and saturation behavior of the accumulator used in each function must be considered.
mbed_official 3:7a284390b0ce 4973 * Refer to the function specific documentation below for usage guidelines.
emilmont 1:fdd22bb7aa52 4974 */
emilmont 1:fdd22bb7aa52 4975
emilmont 1:fdd22bb7aa52 4976 /**
emilmont 1:fdd22bb7aa52 4977 * @addtogroup PID
emilmont 1:fdd22bb7aa52 4978 * @{
emilmont 1:fdd22bb7aa52 4979 */
emilmont 1:fdd22bb7aa52 4980
emilmont 1:fdd22bb7aa52 4981 /**
emilmont 1:fdd22bb7aa52 4982 * @brief Process function for the floating-point PID Control.
emilmont 1:fdd22bb7aa52 4983 * @param[in,out] *S is an instance of the floating-point PID Control structure
emilmont 1:fdd22bb7aa52 4984 * @param[in] in input sample to process
emilmont 1:fdd22bb7aa52 4985 * @return out processed output sample.
emilmont 1:fdd22bb7aa52 4986 */
emilmont 1:fdd22bb7aa52 4987
emilmont 1:fdd22bb7aa52 4988
mbed_official 3:7a284390b0ce 4989 static __INLINE float32_t arm_pid_f32(
emilmont 1:fdd22bb7aa52 4990 arm_pid_instance_f32 * S,
emilmont 1:fdd22bb7aa52 4991 float32_t in)
emilmont 1:fdd22bb7aa52 4992 {
emilmont 1:fdd22bb7aa52 4993 float32_t out;
emilmont 1:fdd22bb7aa52 4994
emilmont 1:fdd22bb7aa52 4995 /* y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2] */
emilmont 1:fdd22bb7aa52 4996 out = (S->A0 * in) +
emilmont 1:fdd22bb7aa52 4997 (S->A1 * S->state[0]) + (S->A2 * S->state[1]) + (S->state[2]);
emilmont 1:fdd22bb7aa52 4998
emilmont 1:fdd22bb7aa52 4999 /* Update state */
emilmont 1:fdd22bb7aa52 5000 S->state[1] = S->state[0];
emilmont 1:fdd22bb7aa52 5001 S->state[0] = in;
emilmont 1:fdd22bb7aa52 5002 S->state[2] = out;
emilmont 1:fdd22bb7aa52 5003
emilmont 1:fdd22bb7aa52 5004 /* return to application */
emilmont 1:fdd22bb7aa52 5005 return (out);
emilmont 1:fdd22bb7aa52 5006
emilmont 1:fdd22bb7aa52 5007 }
emilmont 1:fdd22bb7aa52 5008
emilmont 1:fdd22bb7aa52 5009 /**
emilmont 1:fdd22bb7aa52 5010 * @brief Process function for the Q31 PID Control.
emilmont 1:fdd22bb7aa52 5011 * @param[in,out] *S points to an instance of the Q31 PID Control structure
emilmont 1:fdd22bb7aa52 5012 * @param[in] in input sample to process
emilmont 1:fdd22bb7aa52 5013 * @return out processed output sample.
emilmont 1:fdd22bb7aa52 5014 *
mbed_official 3:7a284390b0ce 5015 * <b>Scaling and Overflow Behavior:</b>
mbed_official 3:7a284390b0ce 5016 * \par
mbed_official 3:7a284390b0ce 5017 * The function is implemented using an internal 64-bit accumulator.
mbed_official 3:7a284390b0ce 5018 * The accumulator has a 2.62 format and maintains full precision of the intermediate multiplication results but provides only a single guard bit.
mbed_official 3:7a284390b0ce 5019 * Thus, if the accumulator result overflows it wraps around rather than clip.
mbed_official 3:7a284390b0ce 5020 * In order to avoid overflows completely the input signal must be scaled down by 2 bits as there are four additions.
mbed_official 3:7a284390b0ce 5021 * After all multiply-accumulates are performed, the 2.62 accumulator is truncated to 1.32 format and then saturated to 1.31 format.
mbed_official 3:7a284390b0ce 5022 */
mbed_official 3:7a284390b0ce 5023
mbed_official 3:7a284390b0ce 5024 static __INLINE q31_t arm_pid_q31(
emilmont 1:fdd22bb7aa52 5025 arm_pid_instance_q31 * S,
emilmont 1:fdd22bb7aa52 5026 q31_t in)
emilmont 1:fdd22bb7aa52 5027 {
emilmont 1:fdd22bb7aa52 5028 q63_t acc;
emilmont 1:fdd22bb7aa52 5029 q31_t out;
emilmont 1:fdd22bb7aa52 5030
emilmont 1:fdd22bb7aa52 5031 /* acc = A0 * x[n] */
emilmont 1:fdd22bb7aa52 5032 acc = (q63_t) S->A0 * in;
emilmont 1:fdd22bb7aa52 5033
emilmont 1:fdd22bb7aa52 5034 /* acc += A1 * x[n-1] */
emilmont 1:fdd22bb7aa52 5035 acc += (q63_t) S->A1 * S->state[0];
emilmont 1:fdd22bb7aa52 5036
emilmont 1:fdd22bb7aa52 5037 /* acc += A2 * x[n-2] */
emilmont 1:fdd22bb7aa52 5038 acc += (q63_t) S->A2 * S->state[1];
emilmont 1:fdd22bb7aa52 5039
emilmont 1:fdd22bb7aa52 5040 /* convert output to 1.31 format to add y[n-1] */
emilmont 1:fdd22bb7aa52 5041 out = (q31_t) (acc >> 31u);
emilmont 1:fdd22bb7aa52 5042
emilmont 1:fdd22bb7aa52 5043 /* out += y[n-1] */
emilmont 1:fdd22bb7aa52 5044 out += S->state[2];
emilmont 1:fdd22bb7aa52 5045
emilmont 1:fdd22bb7aa52 5046 /* Update state */
emilmont 1:fdd22bb7aa52 5047 S->state[1] = S->state[0];
emilmont 1:fdd22bb7aa52 5048 S->state[0] = in;
emilmont 1:fdd22bb7aa52 5049 S->state[2] = out;
emilmont 1:fdd22bb7aa52 5050
emilmont 1:fdd22bb7aa52 5051 /* return to application */
emilmont 1:fdd22bb7aa52 5052 return (out);
emilmont 1:fdd22bb7aa52 5053
emilmont 1:fdd22bb7aa52 5054 }
emilmont 1:fdd22bb7aa52 5055
emilmont 1:fdd22bb7aa52 5056 /**
emilmont 1:fdd22bb7aa52 5057 * @brief Process function for the Q15 PID Control.
emilmont 1:fdd22bb7aa52 5058 * @param[in,out] *S points to an instance of the Q15 PID Control structure
emilmont 1:fdd22bb7aa52 5059 * @param[in] in input sample to process
emilmont 1:fdd22bb7aa52 5060 * @return out processed output sample.
emilmont 1:fdd22bb7aa52 5061 *
mbed_official 3:7a284390b0ce 5062 * <b>Scaling and Overflow Behavior:</b>
mbed_official 3:7a284390b0ce 5063 * \par
mbed_official 3:7a284390b0ce 5064 * The function is implemented using a 64-bit internal accumulator.
mbed_official 3:7a284390b0ce 5065 * Both Gains and state variables are represented in 1.15 format and multiplications yield a 2.30 result.
mbed_official 3:7a284390b0ce 5066 * The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format.
mbed_official 3:7a284390b0ce 5067 * There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved.
mbed_official 3:7a284390b0ce 5068 * After all additions have been performed, the accumulator is truncated to 34.15 format by discarding low 15 bits.
emilmont 1:fdd22bb7aa52 5069 * Lastly, the accumulator is saturated to yield a result in 1.15 format.
emilmont 1:fdd22bb7aa52 5070 */
emilmont 1:fdd22bb7aa52 5071
mbed_official 3:7a284390b0ce 5072 static __INLINE q15_t arm_pid_q15(
emilmont 1:fdd22bb7aa52 5073 arm_pid_instance_q15 * S,
emilmont 1:fdd22bb7aa52 5074 q15_t in)
emilmont 1:fdd22bb7aa52 5075 {
emilmont 1:fdd22bb7aa52 5076 q63_t acc;
emilmont 1:fdd22bb7aa52 5077 q15_t out;
emilmont 1:fdd22bb7aa52 5078
mbed_official 3:7a284390b0ce 5079 #ifndef ARM_MATH_CM0_FAMILY
mbed_official 3:7a284390b0ce 5080 __SIMD32_TYPE *vstate;
mbed_official 3:7a284390b0ce 5081
emilmont 1:fdd22bb7aa52 5082 /* Implementation of PID controller */
emilmont 1:fdd22bb7aa52 5083
emilmont 1:fdd22bb7aa52 5084 /* acc = A0 * x[n] */
emilmont 1:fdd22bb7aa52 5085 acc = (q31_t) __SMUAD(S->A0, in);
emilmont 1:fdd22bb7aa52 5086
mbed_official 3:7a284390b0ce 5087 /* acc += A1 * x[n-1] + A2 * x[n-2] */
mbed_official 3:7a284390b0ce 5088 vstate = __SIMD32_CONST(S->state);
mbed_official 3:7a284390b0ce 5089 acc = __SMLALD(S->A1, (q31_t) *vstate, acc);
mbed_official 3:7a284390b0ce 5090
mbed_official 3:7a284390b0ce 5091 #else
mbed_official 3:7a284390b0ce 5092 /* acc = A0 * x[n] */
mbed_official 3:7a284390b0ce 5093 acc = ((q31_t) S->A0) * in;
emilmont 1:fdd22bb7aa52 5094
emilmont 1:fdd22bb7aa52 5095 /* acc += A1 * x[n-1] + A2 * x[n-2] */
emilmont 1:fdd22bb7aa52 5096 acc += (q31_t) S->A1 * S->state[0];
emilmont 1:fdd22bb7aa52 5097 acc += (q31_t) S->A2 * S->state[1];
emilmont 1:fdd22bb7aa52 5098
emilmont 1:fdd22bb7aa52 5099 #endif
emilmont 1:fdd22bb7aa52 5100
emilmont 1:fdd22bb7aa52 5101 /* acc += y[n-1] */
emilmont 1:fdd22bb7aa52 5102 acc += (q31_t) S->state[2] << 15;
emilmont 1:fdd22bb7aa52 5103
emilmont 1:fdd22bb7aa52 5104 /* saturate the output */
emilmont 1:fdd22bb7aa52 5105 out = (q15_t) (__SSAT((acc >> 15), 16));
emilmont 1:fdd22bb7aa52 5106
emilmont 1:fdd22bb7aa52 5107 /* Update state */
emilmont 1:fdd22bb7aa52 5108 S->state[1] = S->state[0];
emilmont 1:fdd22bb7aa52 5109 S->state[0] = in;
emilmont 1:fdd22bb7aa52 5110 S->state[2] = out;
emilmont 1:fdd22bb7aa52 5111
emilmont 1:fdd22bb7aa52 5112 /* return to application */
emilmont 1:fdd22bb7aa52 5113 return (out);
emilmont 1:fdd22bb7aa52 5114
emilmont 1:fdd22bb7aa52 5115 }
emilmont 1:fdd22bb7aa52 5116
emilmont 1:fdd22bb7aa52 5117 /**
emilmont 1:fdd22bb7aa52 5118 * @} end of PID group
emilmont 1:fdd22bb7aa52 5119 */
emilmont 1:fdd22bb7aa52 5120
emilmont 1:fdd22bb7aa52 5121
emilmont 1:fdd22bb7aa52 5122 /**
emilmont 1:fdd22bb7aa52 5123 * @brief Floating-point matrix inverse.
emilmont 1:fdd22bb7aa52 5124 * @param[in] *src points to the instance of the input floating-point matrix structure.
emilmont 1:fdd22bb7aa52 5125 * @param[out] *dst points to the instance of the output floating-point matrix structure.
emilmont 1:fdd22bb7aa52 5126 * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match.
emilmont 1:fdd22bb7aa52 5127 * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR.
emilmont 1:fdd22bb7aa52 5128 */
emilmont 1:fdd22bb7aa52 5129
emilmont 1:fdd22bb7aa52 5130 arm_status arm_mat_inverse_f32(
emilmont 1:fdd22bb7aa52 5131 const arm_matrix_instance_f32 * src,
emilmont 1:fdd22bb7aa52 5132 arm_matrix_instance_f32 * dst);
emilmont 1:fdd22bb7aa52 5133
emilmont 1:fdd22bb7aa52 5134
emilmont 1:fdd22bb7aa52 5135
emilmont 1:fdd22bb7aa52 5136 /**
emilmont 1:fdd22bb7aa52 5137 * @ingroup groupController
emilmont 1:fdd22bb7aa52 5138 */
emilmont 1:fdd22bb7aa52 5139
emilmont 1:fdd22bb7aa52 5140
emilmont 1:fdd22bb7aa52 5141 /**
emilmont 1:fdd22bb7aa52 5142 * @defgroup clarke Vector Clarke Transform
emilmont 1:fdd22bb7aa52 5143 * Forward Clarke transform converts the instantaneous stator phases into a two-coordinate time invariant vector.
emilmont 1:fdd22bb7aa52 5144 * Generally the Clarke transform uses three-phase currents <code>Ia, Ib and Ic</code> to calculate currents
emilmont 1:fdd22bb7aa52 5145 * in the two-phase orthogonal stator axis <code>Ialpha</code> and <code>Ibeta</code>.
emilmont 1:fdd22bb7aa52 5146 * When <code>Ialpha</code> is superposed with <code>Ia</code> as shown in the figure below
emilmont 1:fdd22bb7aa52 5147 * \image html clarke.gif Stator current space vector and its components in (a,b).
emilmont 1:fdd22bb7aa52 5148 * and <code>Ia + Ib + Ic = 0</code>, in this condition <code>Ialpha</code> and <code>Ibeta</code>
emilmont 1:fdd22bb7aa52 5149 * can be calculated using only <code>Ia</code> and <code>Ib</code>.
emilmont 1:fdd22bb7aa52 5150 *
mbed_official 3:7a284390b0ce 5151 * The function operates on a single sample of data and each call to the function returns the processed output.
emilmont 1:fdd22bb7aa52 5152 * The library provides separate functions for Q31 and floating-point data types.
emilmont 1:fdd22bb7aa52 5153 * \par Algorithm
emilmont 1:fdd22bb7aa52 5154 * \image html clarkeFormula.gif
emilmont 1:fdd22bb7aa52 5155 * where <code>Ia</code> and <code>Ib</code> are the instantaneous stator phases and
emilmont 1:fdd22bb7aa52 5156 * <code>pIalpha</code> and <code>pIbeta</code> are the two coordinates of time invariant vector.
emilmont 1:fdd22bb7aa52 5157 * \par Fixed-Point Behavior
emilmont 1:fdd22bb7aa52 5158 * Care must be taken when using the Q31 version of the Clarke transform.
emilmont 1:fdd22bb7aa52 5159 * In particular, the overflow and saturation behavior of the accumulator used must be considered.
emilmont 1:fdd22bb7aa52 5160 * Refer to the function specific documentation below for usage guidelines.
emilmont 1:fdd22bb7aa52 5161 */
emilmont 1:fdd22bb7aa52 5162
emilmont 1:fdd22bb7aa52 5163 /**
emilmont 1:fdd22bb7aa52 5164 * @addtogroup clarke
emilmont 1:fdd22bb7aa52 5165 * @{
emilmont 1:fdd22bb7aa52 5166 */
emilmont 1:fdd22bb7aa52 5167
emilmont 1:fdd22bb7aa52 5168 /**
emilmont 1:fdd22bb7aa52 5169 *
emilmont 1:fdd22bb7aa52 5170 * @brief Floating-point Clarke transform
emilmont 1:fdd22bb7aa52 5171 * @param[in] Ia input three-phase coordinate <code>a</code>
emilmont 1:fdd22bb7aa52 5172 * @param[in] Ib input three-phase coordinate <code>b</code>
emilmont 1:fdd22bb7aa52 5173 * @param[out] *pIalpha points to output two-phase orthogonal vector axis alpha
emilmont 1:fdd22bb7aa52 5174 * @param[out] *pIbeta points to output two-phase orthogonal vector axis beta
emilmont 1:fdd22bb7aa52 5175 * @return none.
emilmont 1:fdd22bb7aa52 5176 */
emilmont 1:fdd22bb7aa52 5177
mbed_official 3:7a284390b0ce 5178 static __INLINE void arm_clarke_f32(
emilmont 1:fdd22bb7aa52 5179 float32_t Ia,
emilmont 1:fdd22bb7aa52 5180 float32_t Ib,
emilmont 1:fdd22bb7aa52 5181 float32_t * pIalpha,
emilmont 1:fdd22bb7aa52 5182 float32_t * pIbeta)
emilmont 1:fdd22bb7aa52 5183 {
emilmont 1:fdd22bb7aa52 5184 /* Calculate pIalpha using the equation, pIalpha = Ia */
emilmont 1:fdd22bb7aa52 5185 *pIalpha = Ia;
emilmont 1:fdd22bb7aa52 5186
emilmont 1:fdd22bb7aa52 5187 /* Calculate pIbeta using the equation, pIbeta = (1/sqrt(3)) * Ia + (2/sqrt(3)) * Ib */
emilmont 1:fdd22bb7aa52 5188 *pIbeta =
emilmont 1:fdd22bb7aa52 5189 ((float32_t) 0.57735026919 * Ia + (float32_t) 1.15470053838 * Ib);
emilmont 1:fdd22bb7aa52 5190
emilmont 1:fdd22bb7aa52 5191 }
emilmont 1:fdd22bb7aa52 5192
emilmont 1:fdd22bb7aa52 5193 /**
emilmont 1:fdd22bb7aa52 5194 * @brief Clarke transform for Q31 version
emilmont 1:fdd22bb7aa52 5195 * @param[in] Ia input three-phase coordinate <code>a</code>
emilmont 1:fdd22bb7aa52 5196 * @param[in] Ib input three-phase coordinate <code>b</code>
emilmont 1:fdd22bb7aa52 5197 * @param[out] *pIalpha points to output two-phase orthogonal vector axis alpha
emilmont 1:fdd22bb7aa52 5198 * @param[out] *pIbeta points to output two-phase orthogonal vector axis beta
emilmont 1:fdd22bb7aa52 5199 * @return none.
emilmont 1:fdd22bb7aa52 5200 *
emilmont 1:fdd22bb7aa52 5201 * <b>Scaling and Overflow Behavior:</b>
emilmont 1:fdd22bb7aa52 5202 * \par
emilmont 1:fdd22bb7aa52 5203 * The function is implemented using an internal 32-bit accumulator.
emilmont 1:fdd22bb7aa52 5204 * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format.
emilmont 1:fdd22bb7aa52 5205 * There is saturation on the addition, hence there is no risk of overflow.
emilmont 1:fdd22bb7aa52 5206 */
emilmont 1:fdd22bb7aa52 5207
mbed_official 3:7a284390b0ce 5208 static __INLINE void arm_clarke_q31(
emilmont 1:fdd22bb7aa52 5209 q31_t Ia,
emilmont 1:fdd22bb7aa52 5210 q31_t Ib,
emilmont 1:fdd22bb7aa52 5211 q31_t * pIalpha,
emilmont 1:fdd22bb7aa52 5212 q31_t * pIbeta)
emilmont 1:fdd22bb7aa52 5213 {
emilmont 1:fdd22bb7aa52 5214 q31_t product1, product2; /* Temporary variables used to store intermediate results */
emilmont 1:fdd22bb7aa52 5215
emilmont 1:fdd22bb7aa52 5216 /* Calculating pIalpha from Ia by equation pIalpha = Ia */
emilmont 1:fdd22bb7aa52 5217 *pIalpha = Ia;
emilmont 1:fdd22bb7aa52 5218
emilmont 1:fdd22bb7aa52 5219 /* Intermediate product is calculated by (1/(sqrt(3)) * Ia) */
emilmont 1:fdd22bb7aa52 5220 product1 = (q31_t) (((q63_t) Ia * 0x24F34E8B) >> 30);
emilmont 1:fdd22bb7aa52 5221
emilmont 1:fdd22bb7aa52 5222 /* Intermediate product is calculated by (2/sqrt(3) * Ib) */
emilmont 1:fdd22bb7aa52 5223 product2 = (q31_t) (((q63_t) Ib * 0x49E69D16) >> 30);
emilmont 1:fdd22bb7aa52 5224
emilmont 1:fdd22bb7aa52 5225 /* pIbeta is calculated by adding the intermediate products */
emilmont 1:fdd22bb7aa52 5226 *pIbeta = __QADD(product1, product2);
emilmont 1:fdd22bb7aa52 5227 }
emilmont 1:fdd22bb7aa52 5228
emilmont 1:fdd22bb7aa52 5229 /**
emilmont 1:fdd22bb7aa52 5230 * @} end of clarke group
emilmont 1:fdd22bb7aa52 5231 */
emilmont 1:fdd22bb7aa52 5232
emilmont 1:fdd22bb7aa52 5233 /**
emilmont 1:fdd22bb7aa52 5234 * @brief Converts the elements of the Q7 vector to Q31 vector.
emilmont 1:fdd22bb7aa52 5235 * @param[in] *pSrc input pointer
emilmont 1:fdd22bb7aa52 5236 * @param[out] *pDst output pointer
emilmont 1:fdd22bb7aa52 5237 * @param[in] blockSize number of samples to process
emilmont 1:fdd22bb7aa52 5238 * @return none.
emilmont 1:fdd22bb7aa52 5239 */
emilmont 1:fdd22bb7aa52 5240 void arm_q7_to_q31(
emilmont 1:fdd22bb7aa52 5241 q7_t * pSrc,
emilmont 1:fdd22bb7aa52 5242 q31_t * pDst,
emilmont 1:fdd22bb7aa52 5243 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 5244
emilmont 1:fdd22bb7aa52 5245
emilmont 1:fdd22bb7aa52 5246
emilmont 1:fdd22bb7aa52 5247
emilmont 1:fdd22bb7aa52 5248 /**
emilmont 1:fdd22bb7aa52 5249 * @ingroup groupController
emilmont 1:fdd22bb7aa52 5250 */
emilmont 1:fdd22bb7aa52 5251
emilmont 1:fdd22bb7aa52 5252 /**
emilmont 1:fdd22bb7aa52 5253 * @defgroup inv_clarke Vector Inverse Clarke Transform
emilmont 1:fdd22bb7aa52 5254 * Inverse Clarke transform converts the two-coordinate time invariant vector into instantaneous stator phases.
mbed_official 3:7a284390b0ce 5255 *
mbed_official 3:7a284390b0ce 5256 * The function operates on a single sample of data and each call to the function returns the processed output.
emilmont 1:fdd22bb7aa52 5257 * The library provides separate functions for Q31 and floating-point data types.
emilmont 1:fdd22bb7aa52 5258 * \par Algorithm
emilmont 1:fdd22bb7aa52 5259 * \image html clarkeInvFormula.gif
emilmont 1:fdd22bb7aa52 5260 * where <code>pIa</code> and <code>pIb</code> are the instantaneous stator phases and
emilmont 1:fdd22bb7aa52 5261 * <code>Ialpha</code> and <code>Ibeta</code> are the two coordinates of time invariant vector.
emilmont 1:fdd22bb7aa52 5262 * \par Fixed-Point Behavior
emilmont 1:fdd22bb7aa52 5263 * Care must be taken when using the Q31 version of the Clarke transform.
emilmont 1:fdd22bb7aa52 5264 * In particular, the overflow and saturation behavior of the accumulator used must be considered.
emilmont 1:fdd22bb7aa52 5265 * Refer to the function specific documentation below for usage guidelines.
emilmont 1:fdd22bb7aa52 5266 */
emilmont 1:fdd22bb7aa52 5267
emilmont 1:fdd22bb7aa52 5268 /**
emilmont 1:fdd22bb7aa52 5269 * @addtogroup inv_clarke
emilmont 1:fdd22bb7aa52 5270 * @{
emilmont 1:fdd22bb7aa52 5271 */
emilmont 1:fdd22bb7aa52 5272
emilmont 1:fdd22bb7aa52 5273 /**
emilmont 1:fdd22bb7aa52 5274 * @brief Floating-point Inverse Clarke transform
emilmont 1:fdd22bb7aa52 5275 * @param[in] Ialpha input two-phase orthogonal vector axis alpha
emilmont 1:fdd22bb7aa52 5276 * @param[in] Ibeta input two-phase orthogonal vector axis beta
emilmont 1:fdd22bb7aa52 5277 * @param[out] *pIa points to output three-phase coordinate <code>a</code>
emilmont 1:fdd22bb7aa52 5278 * @param[out] *pIb points to output three-phase coordinate <code>b</code>
emilmont 1:fdd22bb7aa52 5279 * @return none.
emilmont 1:fdd22bb7aa52 5280 */
emilmont 1:fdd22bb7aa52 5281
emilmont 1:fdd22bb7aa52 5282
mbed_official 3:7a284390b0ce 5283 static __INLINE void arm_inv_clarke_f32(
emilmont 1:fdd22bb7aa52 5284 float32_t Ialpha,
emilmont 1:fdd22bb7aa52 5285 float32_t Ibeta,
emilmont 1:fdd22bb7aa52 5286 float32_t * pIa,
emilmont 1:fdd22bb7aa52 5287 float32_t * pIb)
emilmont 1:fdd22bb7aa52 5288 {
emilmont 1:fdd22bb7aa52 5289 /* Calculating pIa from Ialpha by equation pIa = Ialpha */
emilmont 1:fdd22bb7aa52 5290 *pIa = Ialpha;
emilmont 1:fdd22bb7aa52 5291
emilmont 1:fdd22bb7aa52 5292 /* Calculating pIb from Ialpha and Ibeta by equation pIb = -(1/2) * Ialpha + (sqrt(3)/2) * Ibeta */
emilmont 1:fdd22bb7aa52 5293 *pIb = -0.5 * Ialpha + (float32_t) 0.8660254039 *Ibeta;
emilmont 1:fdd22bb7aa52 5294
emilmont 1:fdd22bb7aa52 5295 }
emilmont 1:fdd22bb7aa52 5296
emilmont 1:fdd22bb7aa52 5297 /**
mbed_official 3:7a284390b0ce 5298 * @brief Inverse Clarke transform for Q31 version
emilmont 1:fdd22bb7aa52 5299 * @param[in] Ialpha input two-phase orthogonal vector axis alpha
emilmont 1:fdd22bb7aa52 5300 * @param[in] Ibeta input two-phase orthogonal vector axis beta
emilmont 1:fdd22bb7aa52 5301 * @param[out] *pIa points to output three-phase coordinate <code>a</code>
emilmont 1:fdd22bb7aa52 5302 * @param[out] *pIb points to output three-phase coordinate <code>b</code>
emilmont 1:fdd22bb7aa52 5303 * @return none.
emilmont 1:fdd22bb7aa52 5304 *
emilmont 1:fdd22bb7aa52 5305 * <b>Scaling and Overflow Behavior:</b>
emilmont 1:fdd22bb7aa52 5306 * \par
emilmont 1:fdd22bb7aa52 5307 * The function is implemented using an internal 32-bit accumulator.
emilmont 1:fdd22bb7aa52 5308 * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format.
emilmont 1:fdd22bb7aa52 5309 * There is saturation on the subtraction, hence there is no risk of overflow.
emilmont 1:fdd22bb7aa52 5310 */
emilmont 1:fdd22bb7aa52 5311
mbed_official 3:7a284390b0ce 5312 static __INLINE void arm_inv_clarke_q31(
emilmont 1:fdd22bb7aa52 5313 q31_t Ialpha,
emilmont 1:fdd22bb7aa52 5314 q31_t Ibeta,
emilmont 1:fdd22bb7aa52 5315 q31_t * pIa,
emilmont 1:fdd22bb7aa52 5316 q31_t * pIb)
emilmont 1:fdd22bb7aa52 5317 {
emilmont 1:fdd22bb7aa52 5318 q31_t product1, product2; /* Temporary variables used to store intermediate results */
emilmont 1:fdd22bb7aa52 5319
emilmont 1:fdd22bb7aa52 5320 /* Calculating pIa from Ialpha by equation pIa = Ialpha */
emilmont 1:fdd22bb7aa52 5321 *pIa = Ialpha;
emilmont 1:fdd22bb7aa52 5322
emilmont 1:fdd22bb7aa52 5323 /* Intermediate product is calculated by (1/(2*sqrt(3)) * Ia) */
emilmont 1:fdd22bb7aa52 5324 product1 = (q31_t) (((q63_t) (Ialpha) * (0x40000000)) >> 31);
emilmont 1:fdd22bb7aa52 5325
emilmont 1:fdd22bb7aa52 5326 /* Intermediate product is calculated by (1/sqrt(3) * pIb) */
emilmont 1:fdd22bb7aa52 5327 product2 = (q31_t) (((q63_t) (Ibeta) * (0x6ED9EBA1)) >> 31);
emilmont 1:fdd22bb7aa52 5328
emilmont 1:fdd22bb7aa52 5329 /* pIb is calculated by subtracting the products */
emilmont 1:fdd22bb7aa52 5330 *pIb = __QSUB(product2, product1);
emilmont 1:fdd22bb7aa52 5331
emilmont 1:fdd22bb7aa52 5332 }
emilmont 1:fdd22bb7aa52 5333
emilmont 1:fdd22bb7aa52 5334 /**
emilmont 1:fdd22bb7aa52 5335 * @} end of inv_clarke group
emilmont 1:fdd22bb7aa52 5336 */
emilmont 1:fdd22bb7aa52 5337
emilmont 1:fdd22bb7aa52 5338 /**
emilmont 1:fdd22bb7aa52 5339 * @brief Converts the elements of the Q7 vector to Q15 vector.
emilmont 1:fdd22bb7aa52 5340 * @param[in] *pSrc input pointer
emilmont 1:fdd22bb7aa52 5341 * @param[out] *pDst output pointer
emilmont 1:fdd22bb7aa52 5342 * @param[in] blockSize number of samples to process
emilmont 1:fdd22bb7aa52 5343 * @return none.
emilmont 1:fdd22bb7aa52 5344 */
emilmont 1:fdd22bb7aa52 5345 void arm_q7_to_q15(
emilmont 1:fdd22bb7aa52 5346 q7_t * pSrc,
emilmont 1:fdd22bb7aa52 5347 q15_t * pDst,
emilmont 1:fdd22bb7aa52 5348 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 5349
emilmont 1:fdd22bb7aa52 5350
emilmont 1:fdd22bb7aa52 5351
emilmont 1:fdd22bb7aa52 5352 /**
emilmont 1:fdd22bb7aa52 5353 * @ingroup groupController
emilmont 1:fdd22bb7aa52 5354 */
emilmont 1:fdd22bb7aa52 5355
emilmont 1:fdd22bb7aa52 5356 /**
emilmont 1:fdd22bb7aa52 5357 * @defgroup park Vector Park Transform
emilmont 1:fdd22bb7aa52 5358 *
emilmont 1:fdd22bb7aa52 5359 * Forward Park transform converts the input two-coordinate vector to flux and torque components.
mbed_official 3:7a284390b0ce 5360 * The Park transform can be used to realize the transformation of the <code>Ialpha</code> and the <code>Ibeta</code> currents
mbed_official 3:7a284390b0ce 5361 * from the stationary to the moving reference frame and control the spatial relationship between
emilmont 1:fdd22bb7aa52 5362 * the stator vector current and rotor flux vector.
mbed_official 3:7a284390b0ce 5363 * If we consider the d axis aligned with the rotor flux, the diagram below shows the
emilmont 1:fdd22bb7aa52 5364 * current vector and the relationship from the two reference frames:
emilmont 1:fdd22bb7aa52 5365 * \image html park.gif "Stator current space vector and its component in (a,b) and in the d,q rotating reference frame"
emilmont 1:fdd22bb7aa52 5366 *
mbed_official 3:7a284390b0ce 5367 * The function operates on a single sample of data and each call to the function returns the processed output.
emilmont 1:fdd22bb7aa52 5368 * The library provides separate functions for Q31 and floating-point data types.
emilmont 1:fdd22bb7aa52 5369 * \par Algorithm
emilmont 1:fdd22bb7aa52 5370 * \image html parkFormula.gif
mbed_official 3:7a284390b0ce 5371 * where <code>Ialpha</code> and <code>Ibeta</code> are the stator vector components,
mbed_official 3:7a284390b0ce 5372 * <code>pId</code> and <code>pIq</code> are rotor vector components and <code>cosVal</code> and <code>sinVal</code> are the
emilmont 1:fdd22bb7aa52 5373 * cosine and sine values of theta (rotor flux position).
emilmont 1:fdd22bb7aa52 5374 * \par Fixed-Point Behavior
emilmont 1:fdd22bb7aa52 5375 * Care must be taken when using the Q31 version of the Park transform.
emilmont 1:fdd22bb7aa52 5376 * In particular, the overflow and saturation behavior of the accumulator used must be considered.
emilmont 1:fdd22bb7aa52 5377 * Refer to the function specific documentation below for usage guidelines.
emilmont 1:fdd22bb7aa52 5378 */
emilmont 1:fdd22bb7aa52 5379
emilmont 1:fdd22bb7aa52 5380 /**
emilmont 1:fdd22bb7aa52 5381 * @addtogroup park
emilmont 1:fdd22bb7aa52 5382 * @{
emilmont 1:fdd22bb7aa52 5383 */
emilmont 1:fdd22bb7aa52 5384
emilmont 1:fdd22bb7aa52 5385 /**
emilmont 1:fdd22bb7aa52 5386 * @brief Floating-point Park transform
emilmont 1:fdd22bb7aa52 5387 * @param[in] Ialpha input two-phase vector coordinate alpha
emilmont 1:fdd22bb7aa52 5388 * @param[in] Ibeta input two-phase vector coordinate beta
emilmont 2:da51fb522205 5389 * @param[out] *pId points to output rotor reference frame d
emilmont 2:da51fb522205 5390 * @param[out] *pIq points to output rotor reference frame q
emilmont 1:fdd22bb7aa52 5391 * @param[in] sinVal sine value of rotation angle theta
emilmont 1:fdd22bb7aa52 5392 * @param[in] cosVal cosine value of rotation angle theta
emilmont 1:fdd22bb7aa52 5393 * @return none.
emilmont 1:fdd22bb7aa52 5394 *
emilmont 1:fdd22bb7aa52 5395 * The function implements the forward Park transform.
emilmont 1:fdd22bb7aa52 5396 *
emilmont 1:fdd22bb7aa52 5397 */
emilmont 1:fdd22bb7aa52 5398
mbed_official 3:7a284390b0ce 5399 static __INLINE void arm_park_f32(
emilmont 1:fdd22bb7aa52 5400 float32_t Ialpha,
emilmont 1:fdd22bb7aa52 5401 float32_t Ibeta,
emilmont 1:fdd22bb7aa52 5402 float32_t * pId,
emilmont 1:fdd22bb7aa52 5403 float32_t * pIq,
emilmont 1:fdd22bb7aa52 5404 float32_t sinVal,
emilmont 1:fdd22bb7aa52 5405 float32_t cosVal)
emilmont 1:fdd22bb7aa52 5406 {
emilmont 1:fdd22bb7aa52 5407 /* Calculate pId using the equation, pId = Ialpha * cosVal + Ibeta * sinVal */
emilmont 1:fdd22bb7aa52 5408 *pId = Ialpha * cosVal + Ibeta * sinVal;
emilmont 1:fdd22bb7aa52 5409
emilmont 1:fdd22bb7aa52 5410 /* Calculate pIq using the equation, pIq = - Ialpha * sinVal + Ibeta * cosVal */
emilmont 1:fdd22bb7aa52 5411 *pIq = -Ialpha * sinVal + Ibeta * cosVal;
emilmont 1:fdd22bb7aa52 5412
emilmont 1:fdd22bb7aa52 5413 }
emilmont 1:fdd22bb7aa52 5414
emilmont 1:fdd22bb7aa52 5415 /**
mbed_official 3:7a284390b0ce 5416 * @brief Park transform for Q31 version
emilmont 1:fdd22bb7aa52 5417 * @param[in] Ialpha input two-phase vector coordinate alpha
emilmont 1:fdd22bb7aa52 5418 * @param[in] Ibeta input two-phase vector coordinate beta
emilmont 1:fdd22bb7aa52 5419 * @param[out] *pId points to output rotor reference frame d
emilmont 1:fdd22bb7aa52 5420 * @param[out] *pIq points to output rotor reference frame q
emilmont 1:fdd22bb7aa52 5421 * @param[in] sinVal sine value of rotation angle theta
emilmont 1:fdd22bb7aa52 5422 * @param[in] cosVal cosine value of rotation angle theta
emilmont 1:fdd22bb7aa52 5423 * @return none.
emilmont 1:fdd22bb7aa52 5424 *
emilmont 1:fdd22bb7aa52 5425 * <b>Scaling and Overflow Behavior:</b>
emilmont 1:fdd22bb7aa52 5426 * \par
emilmont 1:fdd22bb7aa52 5427 * The function is implemented using an internal 32-bit accumulator.
emilmont 1:fdd22bb7aa52 5428 * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format.
emilmont 1:fdd22bb7aa52 5429 * There is saturation on the addition and subtraction, hence there is no risk of overflow.
emilmont 1:fdd22bb7aa52 5430 */
emilmont 1:fdd22bb7aa52 5431
emilmont 1:fdd22bb7aa52 5432
mbed_official 3:7a284390b0ce 5433 static __INLINE void arm_park_q31(
emilmont 1:fdd22bb7aa52 5434 q31_t Ialpha,
emilmont 1:fdd22bb7aa52 5435 q31_t Ibeta,
emilmont 1:fdd22bb7aa52 5436 q31_t * pId,
emilmont 1:fdd22bb7aa52 5437 q31_t * pIq,
emilmont 1:fdd22bb7aa52 5438 q31_t sinVal,
emilmont 1:fdd22bb7aa52 5439 q31_t cosVal)
emilmont 1:fdd22bb7aa52 5440 {
emilmont 1:fdd22bb7aa52 5441 q31_t product1, product2; /* Temporary variables used to store intermediate results */
emilmont 1:fdd22bb7aa52 5442 q31_t product3, product4; /* Temporary variables used to store intermediate results */
emilmont 1:fdd22bb7aa52 5443
emilmont 1:fdd22bb7aa52 5444 /* Intermediate product is calculated by (Ialpha * cosVal) */
emilmont 1:fdd22bb7aa52 5445 product1 = (q31_t) (((q63_t) (Ialpha) * (cosVal)) >> 31);
emilmont 1:fdd22bb7aa52 5446
emilmont 1:fdd22bb7aa52 5447 /* Intermediate product is calculated by (Ibeta * sinVal) */
emilmont 1:fdd22bb7aa52 5448 product2 = (q31_t) (((q63_t) (Ibeta) * (sinVal)) >> 31);
emilmont 1:fdd22bb7aa52 5449
emilmont 1:fdd22bb7aa52 5450
emilmont 1:fdd22bb7aa52 5451 /* Intermediate product is calculated by (Ialpha * sinVal) */
emilmont 1:fdd22bb7aa52 5452 product3 = (q31_t) (((q63_t) (Ialpha) * (sinVal)) >> 31);
emilmont 1:fdd22bb7aa52 5453
emilmont 1:fdd22bb7aa52 5454 /* Intermediate product is calculated by (Ibeta * cosVal) */
emilmont 1:fdd22bb7aa52 5455 product4 = (q31_t) (((q63_t) (Ibeta) * (cosVal)) >> 31);
emilmont 1:fdd22bb7aa52 5456
emilmont 1:fdd22bb7aa52 5457 /* Calculate pId by adding the two intermediate products 1 and 2 */
emilmont 1:fdd22bb7aa52 5458 *pId = __QADD(product1, product2);
emilmont 1:fdd22bb7aa52 5459
emilmont 1:fdd22bb7aa52 5460 /* Calculate pIq by subtracting the two intermediate products 3 from 4 */
emilmont 1:fdd22bb7aa52 5461 *pIq = __QSUB(product4, product3);
emilmont 1:fdd22bb7aa52 5462 }
emilmont 1:fdd22bb7aa52 5463
emilmont 1:fdd22bb7aa52 5464 /**
emilmont 1:fdd22bb7aa52 5465 * @} end of park group
emilmont 1:fdd22bb7aa52 5466 */
emilmont 1:fdd22bb7aa52 5467
emilmont 1:fdd22bb7aa52 5468 /**
emilmont 1:fdd22bb7aa52 5469 * @brief Converts the elements of the Q7 vector to floating-point vector.
emilmont 1:fdd22bb7aa52 5470 * @param[in] *pSrc is input pointer
emilmont 1:fdd22bb7aa52 5471 * @param[out] *pDst is output pointer
emilmont 1:fdd22bb7aa52 5472 * @param[in] blockSize is the number of samples to process
emilmont 1:fdd22bb7aa52 5473 * @return none.
emilmont 1:fdd22bb7aa52 5474 */
emilmont 1:fdd22bb7aa52 5475 void arm_q7_to_float(
emilmont 1:fdd22bb7aa52 5476 q7_t * pSrc,
emilmont 1:fdd22bb7aa52 5477 float32_t * pDst,
emilmont 1:fdd22bb7aa52 5478 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 5479
emilmont 1:fdd22bb7aa52 5480
emilmont 1:fdd22bb7aa52 5481 /**
emilmont 1:fdd22bb7aa52 5482 * @ingroup groupController
emilmont 1:fdd22bb7aa52 5483 */
emilmont 1:fdd22bb7aa52 5484
emilmont 1:fdd22bb7aa52 5485 /**
emilmont 1:fdd22bb7aa52 5486 * @defgroup inv_park Vector Inverse Park transform
emilmont 1:fdd22bb7aa52 5487 * Inverse Park transform converts the input flux and torque components to two-coordinate vector.
emilmont 1:fdd22bb7aa52 5488 *
mbed_official 3:7a284390b0ce 5489 * The function operates on a single sample of data and each call to the function returns the processed output.
emilmont 1:fdd22bb7aa52 5490 * The library provides separate functions for Q31 and floating-point data types.
emilmont 1:fdd22bb7aa52 5491 * \par Algorithm
emilmont 1:fdd22bb7aa52 5492 * \image html parkInvFormula.gif
mbed_official 3:7a284390b0ce 5493 * where <code>pIalpha</code> and <code>pIbeta</code> are the stator vector components,
mbed_official 3:7a284390b0ce 5494 * <code>Id</code> and <code>Iq</code> are rotor vector components and <code>cosVal</code> and <code>sinVal</code> are the
emilmont 1:fdd22bb7aa52 5495 * cosine and sine values of theta (rotor flux position).
emilmont 1:fdd22bb7aa52 5496 * \par Fixed-Point Behavior
emilmont 1:fdd22bb7aa52 5497 * Care must be taken when using the Q31 version of the Park transform.
emilmont 1:fdd22bb7aa52 5498 * In particular, the overflow and saturation behavior of the accumulator used must be considered.
emilmont 1:fdd22bb7aa52 5499 * Refer to the function specific documentation below for usage guidelines.
emilmont 1:fdd22bb7aa52 5500 */
emilmont 1:fdd22bb7aa52 5501
emilmont 1:fdd22bb7aa52 5502 /**
emilmont 1:fdd22bb7aa52 5503 * @addtogroup inv_park
emilmont 1:fdd22bb7aa52 5504 * @{
emilmont 1:fdd22bb7aa52 5505 */
emilmont 1:fdd22bb7aa52 5506
emilmont 1:fdd22bb7aa52 5507 /**
emilmont 1:fdd22bb7aa52 5508 * @brief Floating-point Inverse Park transform
emilmont 1:fdd22bb7aa52 5509 * @param[in] Id input coordinate of rotor reference frame d
emilmont 1:fdd22bb7aa52 5510 * @param[in] Iq input coordinate of rotor reference frame q
emilmont 1:fdd22bb7aa52 5511 * @param[out] *pIalpha points to output two-phase orthogonal vector axis alpha
emilmont 1:fdd22bb7aa52 5512 * @param[out] *pIbeta points to output two-phase orthogonal vector axis beta
emilmont 1:fdd22bb7aa52 5513 * @param[in] sinVal sine value of rotation angle theta
emilmont 1:fdd22bb7aa52 5514 * @param[in] cosVal cosine value of rotation angle theta
emilmont 1:fdd22bb7aa52 5515 * @return none.
emilmont 1:fdd22bb7aa52 5516 */
emilmont 1:fdd22bb7aa52 5517
mbed_official 3:7a284390b0ce 5518 static __INLINE void arm_inv_park_f32(
emilmont 1:fdd22bb7aa52 5519 float32_t Id,
emilmont 1:fdd22bb7aa52 5520 float32_t Iq,
emilmont 1:fdd22bb7aa52 5521 float32_t * pIalpha,
emilmont 1:fdd22bb7aa52 5522 float32_t * pIbeta,
emilmont 1:fdd22bb7aa52 5523 float32_t sinVal,
emilmont 1:fdd22bb7aa52 5524 float32_t cosVal)
emilmont 1:fdd22bb7aa52 5525 {
emilmont 1:fdd22bb7aa52 5526 /* Calculate pIalpha using the equation, pIalpha = Id * cosVal - Iq * sinVal */
emilmont 1:fdd22bb7aa52 5527 *pIalpha = Id * cosVal - Iq * sinVal;
emilmont 1:fdd22bb7aa52 5528
emilmont 1:fdd22bb7aa52 5529 /* Calculate pIbeta using the equation, pIbeta = Id * sinVal + Iq * cosVal */
emilmont 1:fdd22bb7aa52 5530 *pIbeta = Id * sinVal + Iq * cosVal;
emilmont 1:fdd22bb7aa52 5531
emilmont 1:fdd22bb7aa52 5532 }
emilmont 1:fdd22bb7aa52 5533
emilmont 1:fdd22bb7aa52 5534
emilmont 1:fdd22bb7aa52 5535 /**
mbed_official 3:7a284390b0ce 5536 * @brief Inverse Park transform for Q31 version
emilmont 1:fdd22bb7aa52 5537 * @param[in] Id input coordinate of rotor reference frame d
emilmont 1:fdd22bb7aa52 5538 * @param[in] Iq input coordinate of rotor reference frame q
emilmont 1:fdd22bb7aa52 5539 * @param[out] *pIalpha points to output two-phase orthogonal vector axis alpha
emilmont 1:fdd22bb7aa52 5540 * @param[out] *pIbeta points to output two-phase orthogonal vector axis beta
emilmont 1:fdd22bb7aa52 5541 * @param[in] sinVal sine value of rotation angle theta
emilmont 1:fdd22bb7aa52 5542 * @param[in] cosVal cosine value of rotation angle theta
emilmont 1:fdd22bb7aa52 5543 * @return none.
emilmont 1:fdd22bb7aa52 5544 *
emilmont 1:fdd22bb7aa52 5545 * <b>Scaling and Overflow Behavior:</b>
emilmont 1:fdd22bb7aa52 5546 * \par
emilmont 1:fdd22bb7aa52 5547 * The function is implemented using an internal 32-bit accumulator.
emilmont 1:fdd22bb7aa52 5548 * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format.
emilmont 1:fdd22bb7aa52 5549 * There is saturation on the addition, hence there is no risk of overflow.
emilmont 1:fdd22bb7aa52 5550 */
emilmont 1:fdd22bb7aa52 5551
emilmont 1:fdd22bb7aa52 5552
mbed_official 3:7a284390b0ce 5553 static __INLINE void arm_inv_park_q31(
emilmont 1:fdd22bb7aa52 5554 q31_t Id,
emilmont 1:fdd22bb7aa52 5555 q31_t Iq,
emilmont 1:fdd22bb7aa52 5556 q31_t * pIalpha,
emilmont 1:fdd22bb7aa52 5557 q31_t * pIbeta,
emilmont 1:fdd22bb7aa52 5558 q31_t sinVal,
emilmont 1:fdd22bb7aa52 5559 q31_t cosVal)
emilmont 1:fdd22bb7aa52 5560 {
emilmont 1:fdd22bb7aa52 5561 q31_t product1, product2; /* Temporary variables used to store intermediate results */
emilmont 1:fdd22bb7aa52 5562 q31_t product3, product4; /* Temporary variables used to store intermediate results */
emilmont 1:fdd22bb7aa52 5563
emilmont 1:fdd22bb7aa52 5564 /* Intermediate product is calculated by (Id * cosVal) */
emilmont 1:fdd22bb7aa52 5565 product1 = (q31_t) (((q63_t) (Id) * (cosVal)) >> 31);
emilmont 1:fdd22bb7aa52 5566
emilmont 1:fdd22bb7aa52 5567 /* Intermediate product is calculated by (Iq * sinVal) */
emilmont 1:fdd22bb7aa52 5568 product2 = (q31_t) (((q63_t) (Iq) * (sinVal)) >> 31);
emilmont 1:fdd22bb7aa52 5569
emilmont 1:fdd22bb7aa52 5570
emilmont 1:fdd22bb7aa52 5571 /* Intermediate product is calculated by (Id * sinVal) */
emilmont 1:fdd22bb7aa52 5572 product3 = (q31_t) (((q63_t) (Id) * (sinVal)) >> 31);
emilmont 1:fdd22bb7aa52 5573
emilmont 1:fdd22bb7aa52 5574 /* Intermediate product is calculated by (Iq * cosVal) */
emilmont 1:fdd22bb7aa52 5575 product4 = (q31_t) (((q63_t) (Iq) * (cosVal)) >> 31);
emilmont 1:fdd22bb7aa52 5576
emilmont 1:fdd22bb7aa52 5577 /* Calculate pIalpha by using the two intermediate products 1 and 2 */
emilmont 1:fdd22bb7aa52 5578 *pIalpha = __QSUB(product1, product2);
emilmont 1:fdd22bb7aa52 5579
emilmont 1:fdd22bb7aa52 5580 /* Calculate pIbeta by using the two intermediate products 3 and 4 */
emilmont 1:fdd22bb7aa52 5581 *pIbeta = __QADD(product4, product3);
emilmont 1:fdd22bb7aa52 5582
emilmont 1:fdd22bb7aa52 5583 }
emilmont 1:fdd22bb7aa52 5584
emilmont 1:fdd22bb7aa52 5585 /**
emilmont 1:fdd22bb7aa52 5586 * @} end of Inverse park group
emilmont 1:fdd22bb7aa52 5587 */
emilmont 1:fdd22bb7aa52 5588
emilmont 1:fdd22bb7aa52 5589
emilmont 1:fdd22bb7aa52 5590 /**
emilmont 1:fdd22bb7aa52 5591 * @brief Converts the elements of the Q31 vector to floating-point vector.
emilmont 1:fdd22bb7aa52 5592 * @param[in] *pSrc is input pointer
emilmont 1:fdd22bb7aa52 5593 * @param[out] *pDst is output pointer
emilmont 1:fdd22bb7aa52 5594 * @param[in] blockSize is the number of samples to process
emilmont 1:fdd22bb7aa52 5595 * @return none.
emilmont 1:fdd22bb7aa52 5596 */
emilmont 1:fdd22bb7aa52 5597 void arm_q31_to_float(
emilmont 1:fdd22bb7aa52 5598 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 5599 float32_t * pDst,
emilmont 1:fdd22bb7aa52 5600 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 5601
emilmont 1:fdd22bb7aa52 5602 /**
emilmont 1:fdd22bb7aa52 5603 * @ingroup groupInterpolation
emilmont 1:fdd22bb7aa52 5604 */
emilmont 1:fdd22bb7aa52 5605
emilmont 1:fdd22bb7aa52 5606 /**
emilmont 1:fdd22bb7aa52 5607 * @defgroup LinearInterpolate Linear Interpolation
emilmont 1:fdd22bb7aa52 5608 *
emilmont 1:fdd22bb7aa52 5609 * Linear interpolation is a method of curve fitting using linear polynomials.
emilmont 1:fdd22bb7aa52 5610 * Linear interpolation works by effectively drawing a straight line between two neighboring samples and returning the appropriate point along that line
emilmont 1:fdd22bb7aa52 5611 *
mbed_official 3:7a284390b0ce 5612 * \par
emilmont 1:fdd22bb7aa52 5613 * \image html LinearInterp.gif "Linear interpolation"
emilmont 1:fdd22bb7aa52 5614 *
emilmont 1:fdd22bb7aa52 5615 * \par
emilmont 1:fdd22bb7aa52 5616 * A Linear Interpolate function calculates an output value(y), for the input(x)
emilmont 1:fdd22bb7aa52 5617 * using linear interpolation of the input values x0, x1( nearest input values) and the output values y0 and y1(nearest output values)
emilmont 1:fdd22bb7aa52 5618 *
emilmont 1:fdd22bb7aa52 5619 * \par Algorithm:
emilmont 1:fdd22bb7aa52 5620 * <pre>
emilmont 1:fdd22bb7aa52 5621 * y = y0 + (x - x0) * ((y1 - y0)/(x1-x0))
emilmont 1:fdd22bb7aa52 5622 * where x0, x1 are nearest values of input x
emilmont 1:fdd22bb7aa52 5623 * y0, y1 are nearest values to output y
emilmont 1:fdd22bb7aa52 5624 * </pre>
emilmont 1:fdd22bb7aa52 5625 *
emilmont 1:fdd22bb7aa52 5626 * \par
emilmont 1:fdd22bb7aa52 5627 * This set of functions implements Linear interpolation process
emilmont 1:fdd22bb7aa52 5628 * for Q7, Q15, Q31, and floating-point data types. The functions operate on a single
emilmont 1:fdd22bb7aa52 5629 * sample of data and each call to the function returns a single processed value.
emilmont 1:fdd22bb7aa52 5630 * <code>S</code> points to an instance of the Linear Interpolate function data structure.
emilmont 1:fdd22bb7aa52 5631 * <code>x</code> is the input sample value. The functions returns the output value.
mbed_official 3:7a284390b0ce 5632 *
emilmont 1:fdd22bb7aa52 5633 * \par
mbed_official 3:7a284390b0ce 5634 * if x is outside of the table boundary, Linear interpolation returns first value of the table
mbed_official 3:7a284390b0ce 5635 * if x is below input range and returns last value of table if x is above range.
emilmont 1:fdd22bb7aa52 5636 */
emilmont 1:fdd22bb7aa52 5637
emilmont 1:fdd22bb7aa52 5638 /**
emilmont 1:fdd22bb7aa52 5639 * @addtogroup LinearInterpolate
emilmont 1:fdd22bb7aa52 5640 * @{
emilmont 1:fdd22bb7aa52 5641 */
emilmont 1:fdd22bb7aa52 5642
emilmont 1:fdd22bb7aa52 5643 /**
emilmont 1:fdd22bb7aa52 5644 * @brief Process function for the floating-point Linear Interpolation Function.
emilmont 1:fdd22bb7aa52 5645 * @param[in,out] *S is an instance of the floating-point Linear Interpolation structure
emilmont 1:fdd22bb7aa52 5646 * @param[in] x input sample to process
emilmont 1:fdd22bb7aa52 5647 * @return y processed output sample.
emilmont 1:fdd22bb7aa52 5648 *
emilmont 1:fdd22bb7aa52 5649 */
emilmont 1:fdd22bb7aa52 5650
mbed_official 3:7a284390b0ce 5651 static __INLINE float32_t arm_linear_interp_f32(
emilmont 1:fdd22bb7aa52 5652 arm_linear_interp_instance_f32 * S,
emilmont 1:fdd22bb7aa52 5653 float32_t x)
emilmont 1:fdd22bb7aa52 5654 {
emilmont 1:fdd22bb7aa52 5655
emilmont 1:fdd22bb7aa52 5656 float32_t y;
emilmont 1:fdd22bb7aa52 5657 float32_t x0, x1; /* Nearest input values */
emilmont 1:fdd22bb7aa52 5658 float32_t y0, y1; /* Nearest output values */
emilmont 1:fdd22bb7aa52 5659 float32_t xSpacing = S->xSpacing; /* spacing between input values */
emilmont 1:fdd22bb7aa52 5660 int32_t i; /* Index variable */
emilmont 1:fdd22bb7aa52 5661 float32_t *pYData = S->pYData; /* pointer to output table */
emilmont 1:fdd22bb7aa52 5662
emilmont 1:fdd22bb7aa52 5663 /* Calculation of index */
mbed_official 3:7a284390b0ce 5664 i = (int32_t) ((x - S->x1) / xSpacing);
emilmont 1:fdd22bb7aa52 5665
emilmont 1:fdd22bb7aa52 5666 if(i < 0)
emilmont 1:fdd22bb7aa52 5667 {
emilmont 1:fdd22bb7aa52 5668 /* Iniatilize output for below specified range as least output value of table */
emilmont 1:fdd22bb7aa52 5669 y = pYData[0];
emilmont 1:fdd22bb7aa52 5670 }
mbed_official 3:7a284390b0ce 5671 else if((uint32_t)i >= S->nValues)
emilmont 1:fdd22bb7aa52 5672 {
emilmont 1:fdd22bb7aa52 5673 /* Iniatilize output for above specified range as last output value of table */
emilmont 1:fdd22bb7aa52 5674 y = pYData[S->nValues - 1];
emilmont 1:fdd22bb7aa52 5675 }
emilmont 1:fdd22bb7aa52 5676 else
emilmont 1:fdd22bb7aa52 5677 {
emilmont 1:fdd22bb7aa52 5678 /* Calculation of nearest input values */
emilmont 1:fdd22bb7aa52 5679 x0 = S->x1 + i * xSpacing;
emilmont 1:fdd22bb7aa52 5680 x1 = S->x1 + (i + 1) * xSpacing;
emilmont 1:fdd22bb7aa52 5681
emilmont 1:fdd22bb7aa52 5682 /* Read of nearest output values */
emilmont 1:fdd22bb7aa52 5683 y0 = pYData[i];
emilmont 1:fdd22bb7aa52 5684 y1 = pYData[i + 1];
emilmont 1:fdd22bb7aa52 5685
emilmont 1:fdd22bb7aa52 5686 /* Calculation of output */
emilmont 1:fdd22bb7aa52 5687 y = y0 + (x - x0) * ((y1 - y0) / (x1 - x0));
emilmont 1:fdd22bb7aa52 5688
emilmont 1:fdd22bb7aa52 5689 }
emilmont 1:fdd22bb7aa52 5690
emilmont 1:fdd22bb7aa52 5691 /* returns output value */
emilmont 1:fdd22bb7aa52 5692 return (y);
emilmont 1:fdd22bb7aa52 5693 }
emilmont 1:fdd22bb7aa52 5694
emilmont 1:fdd22bb7aa52 5695 /**
emilmont 1:fdd22bb7aa52 5696 *
emilmont 1:fdd22bb7aa52 5697 * @brief Process function for the Q31 Linear Interpolation Function.
emilmont 1:fdd22bb7aa52 5698 * @param[in] *pYData pointer to Q31 Linear Interpolation table
emilmont 1:fdd22bb7aa52 5699 * @param[in] x input sample to process
emilmont 1:fdd22bb7aa52 5700 * @param[in] nValues number of table values
emilmont 1:fdd22bb7aa52 5701 * @return y processed output sample.
emilmont 1:fdd22bb7aa52 5702 *
emilmont 1:fdd22bb7aa52 5703 * \par
emilmont 1:fdd22bb7aa52 5704 * Input sample <code>x</code> is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part.
emilmont 1:fdd22bb7aa52 5705 * This function can support maximum of table size 2^12.
emilmont 1:fdd22bb7aa52 5706 *
emilmont 1:fdd22bb7aa52 5707 */
emilmont 1:fdd22bb7aa52 5708
emilmont 1:fdd22bb7aa52 5709
mbed_official 3:7a284390b0ce 5710 static __INLINE q31_t arm_linear_interp_q31(
emilmont 1:fdd22bb7aa52 5711 q31_t * pYData,
emilmont 1:fdd22bb7aa52 5712 q31_t x,
emilmont 1:fdd22bb7aa52 5713 uint32_t nValues)
emilmont 1:fdd22bb7aa52 5714 {
emilmont 1:fdd22bb7aa52 5715 q31_t y; /* output */
emilmont 1:fdd22bb7aa52 5716 q31_t y0, y1; /* Nearest output values */
emilmont 1:fdd22bb7aa52 5717 q31_t fract; /* fractional part */
emilmont 1:fdd22bb7aa52 5718 int32_t index; /* Index to read nearest output values */
emilmont 1:fdd22bb7aa52 5719
emilmont 1:fdd22bb7aa52 5720 /* Input is in 12.20 format */
emilmont 1:fdd22bb7aa52 5721 /* 12 bits for the table index */
emilmont 1:fdd22bb7aa52 5722 /* Index value calculation */
emilmont 1:fdd22bb7aa52 5723 index = ((x & 0xFFF00000) >> 20);
emilmont 1:fdd22bb7aa52 5724
mbed_official 3:7a284390b0ce 5725 if(index >= (int32_t)(nValues - 1))
emilmont 1:fdd22bb7aa52 5726 {
emilmont 1:fdd22bb7aa52 5727 return (pYData[nValues - 1]);
emilmont 1:fdd22bb7aa52 5728 }
emilmont 1:fdd22bb7aa52 5729 else if(index < 0)
emilmont 1:fdd22bb7aa52 5730 {
emilmont 1:fdd22bb7aa52 5731 return (pYData[0]);
emilmont 1:fdd22bb7aa52 5732 }
emilmont 1:fdd22bb7aa52 5733 else
emilmont 1:fdd22bb7aa52 5734 {
emilmont 1:fdd22bb7aa52 5735
emilmont 1:fdd22bb7aa52 5736 /* 20 bits for the fractional part */
emilmont 1:fdd22bb7aa52 5737 /* shift left by 11 to keep fract in 1.31 format */
emilmont 1:fdd22bb7aa52 5738 fract = (x & 0x000FFFFF) << 11;
emilmont 1:fdd22bb7aa52 5739
emilmont 1:fdd22bb7aa52 5740 /* Read two nearest output values from the index in 1.31(q31) format */
emilmont 1:fdd22bb7aa52 5741 y0 = pYData[index];
emilmont 1:fdd22bb7aa52 5742 y1 = pYData[index + 1u];
emilmont 1:fdd22bb7aa52 5743
emilmont 1:fdd22bb7aa52 5744 /* Calculation of y0 * (1-fract) and y is in 2.30 format */
emilmont 1:fdd22bb7aa52 5745 y = ((q31_t) ((q63_t) y0 * (0x7FFFFFFF - fract) >> 32));
emilmont 1:fdd22bb7aa52 5746
emilmont 1:fdd22bb7aa52 5747 /* Calculation of y0 * (1-fract) + y1 *fract and y is in 2.30 format */
emilmont 1:fdd22bb7aa52 5748 y += ((q31_t) (((q63_t) y1 * fract) >> 32));
emilmont 1:fdd22bb7aa52 5749
emilmont 1:fdd22bb7aa52 5750 /* Convert y to 1.31 format */
emilmont 1:fdd22bb7aa52 5751 return (y << 1u);
emilmont 1:fdd22bb7aa52 5752
emilmont 1:fdd22bb7aa52 5753 }
emilmont 1:fdd22bb7aa52 5754
emilmont 1:fdd22bb7aa52 5755 }
emilmont 1:fdd22bb7aa52 5756
emilmont 1:fdd22bb7aa52 5757 /**
emilmont 1:fdd22bb7aa52 5758 *
emilmont 1:fdd22bb7aa52 5759 * @brief Process function for the Q15 Linear Interpolation Function.
emilmont 1:fdd22bb7aa52 5760 * @param[in] *pYData pointer to Q15 Linear Interpolation table
emilmont 1:fdd22bb7aa52 5761 * @param[in] x input sample to process
emilmont 1:fdd22bb7aa52 5762 * @param[in] nValues number of table values
emilmont 1:fdd22bb7aa52 5763 * @return y processed output sample.
emilmont 1:fdd22bb7aa52 5764 *
emilmont 1:fdd22bb7aa52 5765 * \par
emilmont 1:fdd22bb7aa52 5766 * Input sample <code>x</code> is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part.
mbed_official 3:7a284390b0ce 5767 * This function can support maximum of table size 2^12.
emilmont 1:fdd22bb7aa52 5768 *
emilmont 1:fdd22bb7aa52 5769 */
emilmont 1:fdd22bb7aa52 5770
emilmont 1:fdd22bb7aa52 5771
mbed_official 3:7a284390b0ce 5772 static __INLINE q15_t arm_linear_interp_q15(
emilmont 1:fdd22bb7aa52 5773 q15_t * pYData,
emilmont 1:fdd22bb7aa52 5774 q31_t x,
emilmont 1:fdd22bb7aa52 5775 uint32_t nValues)
emilmont 1:fdd22bb7aa52 5776 {
emilmont 1:fdd22bb7aa52 5777 q63_t y; /* output */
emilmont 1:fdd22bb7aa52 5778 q15_t y0, y1; /* Nearest output values */
emilmont 1:fdd22bb7aa52 5779 q31_t fract; /* fractional part */
emilmont 1:fdd22bb7aa52 5780 int32_t index; /* Index to read nearest output values */
emilmont 1:fdd22bb7aa52 5781
emilmont 1:fdd22bb7aa52 5782 /* Input is in 12.20 format */
emilmont 1:fdd22bb7aa52 5783 /* 12 bits for the table index */
emilmont 1:fdd22bb7aa52 5784 /* Index value calculation */
emilmont 1:fdd22bb7aa52 5785 index = ((x & 0xFFF00000) >> 20u);
emilmont 1:fdd22bb7aa52 5786
mbed_official 3:7a284390b0ce 5787 if(index >= (int32_t)(nValues - 1))
emilmont 1:fdd22bb7aa52 5788 {
emilmont 1:fdd22bb7aa52 5789 return (pYData[nValues - 1]);
emilmont 1:fdd22bb7aa52 5790 }
emilmont 1:fdd22bb7aa52 5791 else if(index < 0)
emilmont 1:fdd22bb7aa52 5792 {
emilmont 1:fdd22bb7aa52 5793 return (pYData[0]);
emilmont 1:fdd22bb7aa52 5794 }
emilmont 1:fdd22bb7aa52 5795 else
emilmont 1:fdd22bb7aa52 5796 {
emilmont 1:fdd22bb7aa52 5797 /* 20 bits for the fractional part */
emilmont 1:fdd22bb7aa52 5798 /* fract is in 12.20 format */
emilmont 1:fdd22bb7aa52 5799 fract = (x & 0x000FFFFF);
emilmont 1:fdd22bb7aa52 5800
emilmont 1:fdd22bb7aa52 5801 /* Read two nearest output values from the index */
emilmont 1:fdd22bb7aa52 5802 y0 = pYData[index];
emilmont 1:fdd22bb7aa52 5803 y1 = pYData[index + 1u];
emilmont 1:fdd22bb7aa52 5804
emilmont 1:fdd22bb7aa52 5805 /* Calculation of y0 * (1-fract) and y is in 13.35 format */
emilmont 1:fdd22bb7aa52 5806 y = ((q63_t) y0 * (0xFFFFF - fract));
emilmont 1:fdd22bb7aa52 5807
emilmont 1:fdd22bb7aa52 5808 /* Calculation of (y0 * (1-fract) + y1 * fract) and y is in 13.35 format */
emilmont 1:fdd22bb7aa52 5809 y += ((q63_t) y1 * (fract));
emilmont 1:fdd22bb7aa52 5810
emilmont 1:fdd22bb7aa52 5811 /* convert y to 1.15 format */
emilmont 1:fdd22bb7aa52 5812 return (y >> 20);
emilmont 1:fdd22bb7aa52 5813 }
emilmont 1:fdd22bb7aa52 5814
emilmont 1:fdd22bb7aa52 5815
emilmont 1:fdd22bb7aa52 5816 }
emilmont 1:fdd22bb7aa52 5817
emilmont 1:fdd22bb7aa52 5818 /**
emilmont 1:fdd22bb7aa52 5819 *
emilmont 1:fdd22bb7aa52 5820 * @brief Process function for the Q7 Linear Interpolation Function.
emilmont 1:fdd22bb7aa52 5821 * @param[in] *pYData pointer to Q7 Linear Interpolation table
emilmont 1:fdd22bb7aa52 5822 * @param[in] x input sample to process
emilmont 1:fdd22bb7aa52 5823 * @param[in] nValues number of table values
emilmont 1:fdd22bb7aa52 5824 * @return y processed output sample.
emilmont 1:fdd22bb7aa52 5825 *
emilmont 1:fdd22bb7aa52 5826 * \par
emilmont 1:fdd22bb7aa52 5827 * Input sample <code>x</code> is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part.
emilmont 1:fdd22bb7aa52 5828 * This function can support maximum of table size 2^12.
emilmont 1:fdd22bb7aa52 5829 */
emilmont 1:fdd22bb7aa52 5830
emilmont 1:fdd22bb7aa52 5831
mbed_official 3:7a284390b0ce 5832 static __INLINE q7_t arm_linear_interp_q7(
emilmont 1:fdd22bb7aa52 5833 q7_t * pYData,
emilmont 1:fdd22bb7aa52 5834 q31_t x,
emilmont 1:fdd22bb7aa52 5835 uint32_t nValues)
emilmont 1:fdd22bb7aa52 5836 {
emilmont 1:fdd22bb7aa52 5837 q31_t y; /* output */
emilmont 1:fdd22bb7aa52 5838 q7_t y0, y1; /* Nearest output values */
emilmont 1:fdd22bb7aa52 5839 q31_t fract; /* fractional part */
mbed_official 3:7a284390b0ce 5840 uint32_t index; /* Index to read nearest output values */
emilmont 1:fdd22bb7aa52 5841
emilmont 1:fdd22bb7aa52 5842 /* Input is in 12.20 format */
emilmont 1:fdd22bb7aa52 5843 /* 12 bits for the table index */
emilmont 1:fdd22bb7aa52 5844 /* Index value calculation */
mbed_official 3:7a284390b0ce 5845 if (x < 0)
mbed_official 3:7a284390b0ce 5846 {
mbed_official 3:7a284390b0ce 5847 return (pYData[0]);
mbed_official 3:7a284390b0ce 5848 }
mbed_official 3:7a284390b0ce 5849 index = (x >> 20) & 0xfff;
emilmont 1:fdd22bb7aa52 5850
emilmont 1:fdd22bb7aa52 5851
emilmont 1:fdd22bb7aa52 5852 if(index >= (nValues - 1))
emilmont 1:fdd22bb7aa52 5853 {
emilmont 1:fdd22bb7aa52 5854 return (pYData[nValues - 1]);
emilmont 1:fdd22bb7aa52 5855 }
emilmont 1:fdd22bb7aa52 5856 else
emilmont 1:fdd22bb7aa52 5857 {
emilmont 1:fdd22bb7aa52 5858
emilmont 1:fdd22bb7aa52 5859 /* 20 bits for the fractional part */
emilmont 1:fdd22bb7aa52 5860 /* fract is in 12.20 format */
emilmont 1:fdd22bb7aa52 5861 fract = (x & 0x000FFFFF);
emilmont 1:fdd22bb7aa52 5862
emilmont 1:fdd22bb7aa52 5863 /* Read two nearest output values from the index and are in 1.7(q7) format */
emilmont 1:fdd22bb7aa52 5864 y0 = pYData[index];
emilmont 1:fdd22bb7aa52 5865 y1 = pYData[index + 1u];
emilmont 1:fdd22bb7aa52 5866
emilmont 1:fdd22bb7aa52 5867 /* Calculation of y0 * (1-fract ) and y is in 13.27(q27) format */
emilmont 1:fdd22bb7aa52 5868 y = ((y0 * (0xFFFFF - fract)));
emilmont 1:fdd22bb7aa52 5869
emilmont 1:fdd22bb7aa52 5870 /* Calculation of y1 * fract + y0 * (1-fract) and y is in 13.27(q27) format */
emilmont 1:fdd22bb7aa52 5871 y += (y1 * fract);
emilmont 1:fdd22bb7aa52 5872
emilmont 1:fdd22bb7aa52 5873 /* convert y to 1.7(q7) format */
emilmont 1:fdd22bb7aa52 5874 return (y >> 20u);
emilmont 1:fdd22bb7aa52 5875
emilmont 1:fdd22bb7aa52 5876 }
emilmont 1:fdd22bb7aa52 5877
emilmont 1:fdd22bb7aa52 5878 }
emilmont 1:fdd22bb7aa52 5879 /**
emilmont 1:fdd22bb7aa52 5880 * @} end of LinearInterpolate group
emilmont 1:fdd22bb7aa52 5881 */
emilmont 1:fdd22bb7aa52 5882
emilmont 1:fdd22bb7aa52 5883 /**
emilmont 1:fdd22bb7aa52 5884 * @brief Fast approximation to the trigonometric sine function for floating-point data.
emilmont 1:fdd22bb7aa52 5885 * @param[in] x input value in radians.
emilmont 1:fdd22bb7aa52 5886 * @return sin(x).
emilmont 1:fdd22bb7aa52 5887 */
emilmont 1:fdd22bb7aa52 5888
emilmont 1:fdd22bb7aa52 5889 float32_t arm_sin_f32(
emilmont 1:fdd22bb7aa52 5890 float32_t x);
emilmont 1:fdd22bb7aa52 5891
emilmont 1:fdd22bb7aa52 5892 /**
emilmont 1:fdd22bb7aa52 5893 * @brief Fast approximation to the trigonometric sine function for Q31 data.
emilmont 1:fdd22bb7aa52 5894 * @param[in] x Scaled input value in radians.
emilmont 1:fdd22bb7aa52 5895 * @return sin(x).
emilmont 1:fdd22bb7aa52 5896 */
emilmont 1:fdd22bb7aa52 5897
emilmont 1:fdd22bb7aa52 5898 q31_t arm_sin_q31(
emilmont 1:fdd22bb7aa52 5899 q31_t x);
emilmont 1:fdd22bb7aa52 5900
emilmont 1:fdd22bb7aa52 5901 /**
emilmont 1:fdd22bb7aa52 5902 * @brief Fast approximation to the trigonometric sine function for Q15 data.
emilmont 1:fdd22bb7aa52 5903 * @param[in] x Scaled input value in radians.
emilmont 1:fdd22bb7aa52 5904 * @return sin(x).
emilmont 1:fdd22bb7aa52 5905 */
emilmont 1:fdd22bb7aa52 5906
emilmont 1:fdd22bb7aa52 5907 q15_t arm_sin_q15(
emilmont 1:fdd22bb7aa52 5908 q15_t x);
emilmont 1:fdd22bb7aa52 5909
emilmont 1:fdd22bb7aa52 5910 /**
emilmont 1:fdd22bb7aa52 5911 * @brief Fast approximation to the trigonometric cosine function for floating-point data.
emilmont 1:fdd22bb7aa52 5912 * @param[in] x input value in radians.
emilmont 1:fdd22bb7aa52 5913 * @return cos(x).
emilmont 1:fdd22bb7aa52 5914 */
emilmont 1:fdd22bb7aa52 5915
emilmont 1:fdd22bb7aa52 5916 float32_t arm_cos_f32(
emilmont 1:fdd22bb7aa52 5917 float32_t x);
emilmont 1:fdd22bb7aa52 5918
emilmont 1:fdd22bb7aa52 5919 /**
emilmont 1:fdd22bb7aa52 5920 * @brief Fast approximation to the trigonometric cosine function for Q31 data.
emilmont 1:fdd22bb7aa52 5921 * @param[in] x Scaled input value in radians.
emilmont 1:fdd22bb7aa52 5922 * @return cos(x).
emilmont 1:fdd22bb7aa52 5923 */
emilmont 1:fdd22bb7aa52 5924
emilmont 1:fdd22bb7aa52 5925 q31_t arm_cos_q31(
emilmont 1:fdd22bb7aa52 5926 q31_t x);
emilmont 1:fdd22bb7aa52 5927
emilmont 1:fdd22bb7aa52 5928 /**
emilmont 1:fdd22bb7aa52 5929 * @brief Fast approximation to the trigonometric cosine function for Q15 data.
emilmont 1:fdd22bb7aa52 5930 * @param[in] x Scaled input value in radians.
emilmont 1:fdd22bb7aa52 5931 * @return cos(x).
emilmont 1:fdd22bb7aa52 5932 */
emilmont 1:fdd22bb7aa52 5933
emilmont 1:fdd22bb7aa52 5934 q15_t arm_cos_q15(
emilmont 1:fdd22bb7aa52 5935 q15_t x);
emilmont 1:fdd22bb7aa52 5936
emilmont 1:fdd22bb7aa52 5937
emilmont 1:fdd22bb7aa52 5938 /**
emilmont 1:fdd22bb7aa52 5939 * @ingroup groupFastMath
emilmont 1:fdd22bb7aa52 5940 */
emilmont 1:fdd22bb7aa52 5941
emilmont 1:fdd22bb7aa52 5942
emilmont 1:fdd22bb7aa52 5943 /**
emilmont 1:fdd22bb7aa52 5944 * @defgroup SQRT Square Root
emilmont 1:fdd22bb7aa52 5945 *
emilmont 1:fdd22bb7aa52 5946 * Computes the square root of a number.
mbed_official 3:7a284390b0ce 5947 * There are separate functions for Q15, Q31, and floating-point data types.
emilmont 1:fdd22bb7aa52 5948 * The square root function is computed using the Newton-Raphson algorithm.
emilmont 1:fdd22bb7aa52 5949 * This is an iterative algorithm of the form:
emilmont 1:fdd22bb7aa52 5950 * <pre>
emilmont 1:fdd22bb7aa52 5951 * x1 = x0 - f(x0)/f'(x0)
emilmont 1:fdd22bb7aa52 5952 * </pre>
emilmont 1:fdd22bb7aa52 5953 * where <code>x1</code> is the current estimate,
mbed_official 3:7a284390b0ce 5954 * <code>x0</code> is the previous estimate, and
emilmont 1:fdd22bb7aa52 5955 * <code>f'(x0)</code> is the derivative of <code>f()</code> evaluated at <code>x0</code>.
emilmont 1:fdd22bb7aa52 5956 * For the square root function, the algorithm reduces to:
emilmont 1:fdd22bb7aa52 5957 * <pre>
emilmont 1:fdd22bb7aa52 5958 * x0 = in/2 [initial guess]
emilmont 1:fdd22bb7aa52 5959 * x1 = 1/2 * ( x0 + in / x0) [each iteration]
emilmont 1:fdd22bb7aa52 5960 * </pre>
emilmont 1:fdd22bb7aa52 5961 */
emilmont 1:fdd22bb7aa52 5962
emilmont 1:fdd22bb7aa52 5963
emilmont 1:fdd22bb7aa52 5964 /**
emilmont 1:fdd22bb7aa52 5965 * @addtogroup SQRT
emilmont 1:fdd22bb7aa52 5966 * @{
emilmont 1:fdd22bb7aa52 5967 */
emilmont 1:fdd22bb7aa52 5968
emilmont 1:fdd22bb7aa52 5969 /**
emilmont 1:fdd22bb7aa52 5970 * @brief Floating-point square root function.
emilmont 1:fdd22bb7aa52 5971 * @param[in] in input value.
emilmont 1:fdd22bb7aa52 5972 * @param[out] *pOut square root of input value.
emilmont 1:fdd22bb7aa52 5973 * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if
emilmont 1:fdd22bb7aa52 5974 * <code>in</code> is negative value and returns zero output for negative values.
emilmont 1:fdd22bb7aa52 5975 */
emilmont 1:fdd22bb7aa52 5976
mbed_official 3:7a284390b0ce 5977 static __INLINE arm_status arm_sqrt_f32(
emilmont 1:fdd22bb7aa52 5978 float32_t in,
emilmont 1:fdd22bb7aa52 5979 float32_t * pOut)
emilmont 1:fdd22bb7aa52 5980 {
emilmont 1:fdd22bb7aa52 5981 if(in > 0)
emilmont 1:fdd22bb7aa52 5982 {
emilmont 1:fdd22bb7aa52 5983
mbed_official 3:7a284390b0ce 5984 // #if __FPU_USED
mbed_official 3:7a284390b0ce 5985 #if (__FPU_USED == 1) && defined ( __CC_ARM )
mbed_official 3:7a284390b0ce 5986 *pOut = __sqrtf(in);
mbed_official 3:7a284390b0ce 5987 #else
1050186 5:a912b042151f 5988 #if defined(__GNUC__)
1050186 5:a912b042151f 5989 *pOut = __builtin_sqrtf(in);
1050186 5:a912b042151f 5990 #else
mbed_official 3:7a284390b0ce 5991 *pOut = sqrtf(in);
mbed_official 3:7a284390b0ce 5992 #endif
1050186 5:a912b042151f 5993 #endif
emilmont 1:fdd22bb7aa52 5994
emilmont 1:fdd22bb7aa52 5995 return (ARM_MATH_SUCCESS);
emilmont 1:fdd22bb7aa52 5996 }
emilmont 1:fdd22bb7aa52 5997 else
emilmont 1:fdd22bb7aa52 5998 {
emilmont 1:fdd22bb7aa52 5999 *pOut = 0.0f;
emilmont 1:fdd22bb7aa52 6000 return (ARM_MATH_ARGUMENT_ERROR);
emilmont 1:fdd22bb7aa52 6001 }
emilmont 1:fdd22bb7aa52 6002
emilmont 1:fdd22bb7aa52 6003 }
emilmont 1:fdd22bb7aa52 6004
emilmont 1:fdd22bb7aa52 6005
emilmont 1:fdd22bb7aa52 6006 /**
emilmont 1:fdd22bb7aa52 6007 * @brief Q31 square root function.
emilmont 1:fdd22bb7aa52 6008 * @param[in] in input value. The range of the input value is [0 +1) or 0x00000000 to 0x7FFFFFFF.
emilmont 1:fdd22bb7aa52 6009 * @param[out] *pOut square root of input value.
emilmont 1:fdd22bb7aa52 6010 * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if
emilmont 1:fdd22bb7aa52 6011 * <code>in</code> is negative value and returns zero output for negative values.
emilmont 1:fdd22bb7aa52 6012 */
emilmont 1:fdd22bb7aa52 6013 arm_status arm_sqrt_q31(
emilmont 1:fdd22bb7aa52 6014 q31_t in,
emilmont 1:fdd22bb7aa52 6015 q31_t * pOut);
emilmont 1:fdd22bb7aa52 6016
emilmont 1:fdd22bb7aa52 6017 /**
emilmont 1:fdd22bb7aa52 6018 * @brief Q15 square root function.
emilmont 1:fdd22bb7aa52 6019 * @param[in] in input value. The range of the input value is [0 +1) or 0x0000 to 0x7FFF.
emilmont 1:fdd22bb7aa52 6020 * @param[out] *pOut square root of input value.
emilmont 1:fdd22bb7aa52 6021 * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if
emilmont 1:fdd22bb7aa52 6022 * <code>in</code> is negative value and returns zero output for negative values.
emilmont 1:fdd22bb7aa52 6023 */
emilmont 1:fdd22bb7aa52 6024 arm_status arm_sqrt_q15(
emilmont 1:fdd22bb7aa52 6025 q15_t in,
emilmont 1:fdd22bb7aa52 6026 q15_t * pOut);
emilmont 1:fdd22bb7aa52 6027
emilmont 1:fdd22bb7aa52 6028 /**
emilmont 1:fdd22bb7aa52 6029 * @} end of SQRT group
emilmont 1:fdd22bb7aa52 6030 */
emilmont 1:fdd22bb7aa52 6031
emilmont 1:fdd22bb7aa52 6032
emilmont 1:fdd22bb7aa52 6033
emilmont 1:fdd22bb7aa52 6034
emilmont 1:fdd22bb7aa52 6035
emilmont 1:fdd22bb7aa52 6036
emilmont 1:fdd22bb7aa52 6037 /**
emilmont 1:fdd22bb7aa52 6038 * @brief floating-point Circular write function.
emilmont 1:fdd22bb7aa52 6039 */
emilmont 1:fdd22bb7aa52 6040
mbed_official 3:7a284390b0ce 6041 static __INLINE void arm_circularWrite_f32(
emilmont 1:fdd22bb7aa52 6042 int32_t * circBuffer,
emilmont 1:fdd22bb7aa52 6043 int32_t L,
emilmont 1:fdd22bb7aa52 6044 uint16_t * writeOffset,
emilmont 1:fdd22bb7aa52 6045 int32_t bufferInc,
emilmont 1:fdd22bb7aa52 6046 const int32_t * src,
emilmont 1:fdd22bb7aa52 6047 int32_t srcInc,
emilmont 1:fdd22bb7aa52 6048 uint32_t blockSize)
emilmont 1:fdd22bb7aa52 6049 {
emilmont 1:fdd22bb7aa52 6050 uint32_t i = 0u;
emilmont 1:fdd22bb7aa52 6051 int32_t wOffset;
emilmont 1:fdd22bb7aa52 6052
emilmont 1:fdd22bb7aa52 6053 /* Copy the value of Index pointer that points
emilmont 1:fdd22bb7aa52 6054 * to the current location where the input samples to be copied */
emilmont 1:fdd22bb7aa52 6055 wOffset = *writeOffset;
emilmont 1:fdd22bb7aa52 6056
emilmont 1:fdd22bb7aa52 6057 /* Loop over the blockSize */
emilmont 1:fdd22bb7aa52 6058 i = blockSize;
emilmont 1:fdd22bb7aa52 6059
emilmont 1:fdd22bb7aa52 6060 while(i > 0u)
emilmont 1:fdd22bb7aa52 6061 {
emilmont 1:fdd22bb7aa52 6062 /* copy the input sample to the circular buffer */
emilmont 1:fdd22bb7aa52 6063 circBuffer[wOffset] = *src;
emilmont 1:fdd22bb7aa52 6064
emilmont 1:fdd22bb7aa52 6065 /* Update the input pointer */
emilmont 1:fdd22bb7aa52 6066 src += srcInc;
emilmont 1:fdd22bb7aa52 6067
emilmont 1:fdd22bb7aa52 6068 /* Circularly update wOffset. Watch out for positive and negative value */
emilmont 1:fdd22bb7aa52 6069 wOffset += bufferInc;
emilmont 1:fdd22bb7aa52 6070 if(wOffset >= L)
emilmont 1:fdd22bb7aa52 6071 wOffset -= L;
emilmont 1:fdd22bb7aa52 6072
emilmont 1:fdd22bb7aa52 6073 /* Decrement the loop counter */
emilmont 1:fdd22bb7aa52 6074 i--;
emilmont 1:fdd22bb7aa52 6075 }
emilmont 1:fdd22bb7aa52 6076
emilmont 1:fdd22bb7aa52 6077 /* Update the index pointer */
emilmont 1:fdd22bb7aa52 6078 *writeOffset = wOffset;
emilmont 1:fdd22bb7aa52 6079 }
emilmont 1:fdd22bb7aa52 6080
emilmont 1:fdd22bb7aa52 6081
emilmont 1:fdd22bb7aa52 6082
emilmont 1:fdd22bb7aa52 6083 /**
emilmont 1:fdd22bb7aa52 6084 * @brief floating-point Circular Read function.
emilmont 1:fdd22bb7aa52 6085 */
mbed_official 3:7a284390b0ce 6086 static __INLINE void arm_circularRead_f32(
emilmont 1:fdd22bb7aa52 6087 int32_t * circBuffer,
emilmont 1:fdd22bb7aa52 6088 int32_t L,
emilmont 1:fdd22bb7aa52 6089 int32_t * readOffset,
emilmont 1:fdd22bb7aa52 6090 int32_t bufferInc,
emilmont 1:fdd22bb7aa52 6091 int32_t * dst,
emilmont 1:fdd22bb7aa52 6092 int32_t * dst_base,
emilmont 1:fdd22bb7aa52 6093 int32_t dst_length,
emilmont 1:fdd22bb7aa52 6094 int32_t dstInc,
emilmont 1:fdd22bb7aa52 6095 uint32_t blockSize)
emilmont 1:fdd22bb7aa52 6096 {
emilmont 1:fdd22bb7aa52 6097 uint32_t i = 0u;
emilmont 1:fdd22bb7aa52 6098 int32_t rOffset, dst_end;
emilmont 1:fdd22bb7aa52 6099
emilmont 1:fdd22bb7aa52 6100 /* Copy the value of Index pointer that points
emilmont 1:fdd22bb7aa52 6101 * to the current location from where the input samples to be read */
emilmont 1:fdd22bb7aa52 6102 rOffset = *readOffset;
emilmont 1:fdd22bb7aa52 6103 dst_end = (int32_t) (dst_base + dst_length);
emilmont 1:fdd22bb7aa52 6104
emilmont 1:fdd22bb7aa52 6105 /* Loop over the blockSize */
emilmont 1:fdd22bb7aa52 6106 i = blockSize;
emilmont 1:fdd22bb7aa52 6107
emilmont 1:fdd22bb7aa52 6108 while(i > 0u)
emilmont 1:fdd22bb7aa52 6109 {
emilmont 1:fdd22bb7aa52 6110 /* copy the sample from the circular buffer to the destination buffer */
emilmont 1:fdd22bb7aa52 6111 *dst = circBuffer[rOffset];
emilmont 1:fdd22bb7aa52 6112
emilmont 1:fdd22bb7aa52 6113 /* Update the input pointer */
emilmont 1:fdd22bb7aa52 6114 dst += dstInc;
emilmont 1:fdd22bb7aa52 6115
emilmont 1:fdd22bb7aa52 6116 if(dst == (int32_t *) dst_end)
emilmont 1:fdd22bb7aa52 6117 {
emilmont 1:fdd22bb7aa52 6118 dst = dst_base;
emilmont 1:fdd22bb7aa52 6119 }
emilmont 1:fdd22bb7aa52 6120
emilmont 1:fdd22bb7aa52 6121 /* Circularly update rOffset. Watch out for positive and negative value */
emilmont 1:fdd22bb7aa52 6122 rOffset += bufferInc;
emilmont 1:fdd22bb7aa52 6123
emilmont 1:fdd22bb7aa52 6124 if(rOffset >= L)
emilmont 1:fdd22bb7aa52 6125 {
emilmont 1:fdd22bb7aa52 6126 rOffset -= L;
emilmont 1:fdd22bb7aa52 6127 }
emilmont 1:fdd22bb7aa52 6128
emilmont 1:fdd22bb7aa52 6129 /* Decrement the loop counter */
emilmont 1:fdd22bb7aa52 6130 i--;
emilmont 1:fdd22bb7aa52 6131 }
emilmont 1:fdd22bb7aa52 6132
emilmont 1:fdd22bb7aa52 6133 /* Update the index pointer */
emilmont 1:fdd22bb7aa52 6134 *readOffset = rOffset;
emilmont 1:fdd22bb7aa52 6135 }
emilmont 1:fdd22bb7aa52 6136
emilmont 1:fdd22bb7aa52 6137 /**
emilmont 1:fdd22bb7aa52 6138 * @brief Q15 Circular write function.
emilmont 1:fdd22bb7aa52 6139 */
emilmont 1:fdd22bb7aa52 6140
mbed_official 3:7a284390b0ce 6141 static __INLINE void arm_circularWrite_q15(
emilmont 1:fdd22bb7aa52 6142 q15_t * circBuffer,
emilmont 1:fdd22bb7aa52 6143 int32_t L,
emilmont 1:fdd22bb7aa52 6144 uint16_t * writeOffset,
emilmont 1:fdd22bb7aa52 6145 int32_t bufferInc,
emilmont 1:fdd22bb7aa52 6146 const q15_t * src,
emilmont 1:fdd22bb7aa52 6147 int32_t srcInc,
emilmont 1:fdd22bb7aa52 6148 uint32_t blockSize)
emilmont 1:fdd22bb7aa52 6149 {
emilmont 1:fdd22bb7aa52 6150 uint32_t i = 0u;
emilmont 1:fdd22bb7aa52 6151 int32_t wOffset;
emilmont 1:fdd22bb7aa52 6152
emilmont 1:fdd22bb7aa52 6153 /* Copy the value of Index pointer that points
emilmont 1:fdd22bb7aa52 6154 * to the current location where the input samples to be copied */
emilmont 1:fdd22bb7aa52 6155 wOffset = *writeOffset;
emilmont 1:fdd22bb7aa52 6156
emilmont 1:fdd22bb7aa52 6157 /* Loop over the blockSize */
emilmont 1:fdd22bb7aa52 6158 i = blockSize;
emilmont 1:fdd22bb7aa52 6159
emilmont 1:fdd22bb7aa52 6160 while(i > 0u)
emilmont 1:fdd22bb7aa52 6161 {
emilmont 1:fdd22bb7aa52 6162 /* copy the input sample to the circular buffer */
emilmont 1:fdd22bb7aa52 6163 circBuffer[wOffset] = *src;
emilmont 1:fdd22bb7aa52 6164
emilmont 1:fdd22bb7aa52 6165 /* Update the input pointer */
emilmont 1:fdd22bb7aa52 6166 src += srcInc;
emilmont 1:fdd22bb7aa52 6167
emilmont 1:fdd22bb7aa52 6168 /* Circularly update wOffset. Watch out for positive and negative value */
emilmont 1:fdd22bb7aa52 6169 wOffset += bufferInc;
emilmont 1:fdd22bb7aa52 6170 if(wOffset >= L)
emilmont 1:fdd22bb7aa52 6171 wOffset -= L;
emilmont 1:fdd22bb7aa52 6172
emilmont 1:fdd22bb7aa52 6173 /* Decrement the loop counter */
emilmont 1:fdd22bb7aa52 6174 i--;
emilmont 1:fdd22bb7aa52 6175 }
emilmont 1:fdd22bb7aa52 6176
emilmont 1:fdd22bb7aa52 6177 /* Update the index pointer */
emilmont 1:fdd22bb7aa52 6178 *writeOffset = wOffset;
emilmont 1:fdd22bb7aa52 6179 }
emilmont 1:fdd22bb7aa52 6180
emilmont 1:fdd22bb7aa52 6181
emilmont 1:fdd22bb7aa52 6182
emilmont 1:fdd22bb7aa52 6183 /**
emilmont 1:fdd22bb7aa52 6184 * @brief Q15 Circular Read function.
emilmont 1:fdd22bb7aa52 6185 */
mbed_official 3:7a284390b0ce 6186 static __INLINE void arm_circularRead_q15(
emilmont 1:fdd22bb7aa52 6187 q15_t * circBuffer,
emilmont 1:fdd22bb7aa52 6188 int32_t L,
emilmont 1:fdd22bb7aa52 6189 int32_t * readOffset,
emilmont 1:fdd22bb7aa52 6190 int32_t bufferInc,
emilmont 1:fdd22bb7aa52 6191 q15_t * dst,
emilmont 1:fdd22bb7aa52 6192 q15_t * dst_base,
emilmont 1:fdd22bb7aa52 6193 int32_t dst_length,
emilmont 1:fdd22bb7aa52 6194 int32_t dstInc,
emilmont 1:fdd22bb7aa52 6195 uint32_t blockSize)
emilmont 1:fdd22bb7aa52 6196 {
emilmont 1:fdd22bb7aa52 6197 uint32_t i = 0;
emilmont 1:fdd22bb7aa52 6198 int32_t rOffset, dst_end;
emilmont 1:fdd22bb7aa52 6199
emilmont 1:fdd22bb7aa52 6200 /* Copy the value of Index pointer that points
emilmont 1:fdd22bb7aa52 6201 * to the current location from where the input samples to be read */
emilmont 1:fdd22bb7aa52 6202 rOffset = *readOffset;
emilmont 1:fdd22bb7aa52 6203
emilmont 1:fdd22bb7aa52 6204 dst_end = (int32_t) (dst_base + dst_length);
emilmont 1:fdd22bb7aa52 6205
emilmont 1:fdd22bb7aa52 6206 /* Loop over the blockSize */
emilmont 1:fdd22bb7aa52 6207 i = blockSize;
emilmont 1:fdd22bb7aa52 6208
emilmont 1:fdd22bb7aa52 6209 while(i > 0u)
emilmont 1:fdd22bb7aa52 6210 {
emilmont 1:fdd22bb7aa52 6211 /* copy the sample from the circular buffer to the destination buffer */
emilmont 1:fdd22bb7aa52 6212 *dst = circBuffer[rOffset];
emilmont 1:fdd22bb7aa52 6213
emilmont 1:fdd22bb7aa52 6214 /* Update the input pointer */
emilmont 1:fdd22bb7aa52 6215 dst += dstInc;
emilmont 1:fdd22bb7aa52 6216
emilmont 1:fdd22bb7aa52 6217 if(dst == (q15_t *) dst_end)
emilmont 1:fdd22bb7aa52 6218 {
emilmont 1:fdd22bb7aa52 6219 dst = dst_base;
emilmont 1:fdd22bb7aa52 6220 }
emilmont 1:fdd22bb7aa52 6221
emilmont 1:fdd22bb7aa52 6222 /* Circularly update wOffset. Watch out for positive and negative value */
emilmont 1:fdd22bb7aa52 6223 rOffset += bufferInc;
emilmont 1:fdd22bb7aa52 6224
emilmont 1:fdd22bb7aa52 6225 if(rOffset >= L)
emilmont 1:fdd22bb7aa52 6226 {
emilmont 1:fdd22bb7aa52 6227 rOffset -= L;
emilmont 1:fdd22bb7aa52 6228 }
emilmont 1:fdd22bb7aa52 6229
emilmont 1:fdd22bb7aa52 6230 /* Decrement the loop counter */
emilmont 1:fdd22bb7aa52 6231 i--;
emilmont 1:fdd22bb7aa52 6232 }
emilmont 1:fdd22bb7aa52 6233
emilmont 1:fdd22bb7aa52 6234 /* Update the index pointer */
emilmont 1:fdd22bb7aa52 6235 *readOffset = rOffset;
emilmont 1:fdd22bb7aa52 6236 }
emilmont 1:fdd22bb7aa52 6237
emilmont 1:fdd22bb7aa52 6238
emilmont 1:fdd22bb7aa52 6239 /**
emilmont 1:fdd22bb7aa52 6240 * @brief Q7 Circular write function.
emilmont 1:fdd22bb7aa52 6241 */
emilmont 1:fdd22bb7aa52 6242
mbed_official 3:7a284390b0ce 6243 static __INLINE void arm_circularWrite_q7(
emilmont 1:fdd22bb7aa52 6244 q7_t * circBuffer,
emilmont 1:fdd22bb7aa52 6245 int32_t L,
emilmont 1:fdd22bb7aa52 6246 uint16_t * writeOffset,
emilmont 1:fdd22bb7aa52 6247 int32_t bufferInc,
emilmont 1:fdd22bb7aa52 6248 const q7_t * src,
emilmont 1:fdd22bb7aa52 6249 int32_t srcInc,
emilmont 1:fdd22bb7aa52 6250 uint32_t blockSize)
emilmont 1:fdd22bb7aa52 6251 {
emilmont 1:fdd22bb7aa52 6252 uint32_t i = 0u;
emilmont 1:fdd22bb7aa52 6253 int32_t wOffset;
emilmont 1:fdd22bb7aa52 6254
emilmont 1:fdd22bb7aa52 6255 /* Copy the value of Index pointer that points
emilmont 1:fdd22bb7aa52 6256 * to the current location where the input samples to be copied */
emilmont 1:fdd22bb7aa52 6257 wOffset = *writeOffset;
emilmont 1:fdd22bb7aa52 6258
emilmont 1:fdd22bb7aa52 6259 /* Loop over the blockSize */
emilmont 1:fdd22bb7aa52 6260 i = blockSize;
emilmont 1:fdd22bb7aa52 6261
emilmont 1:fdd22bb7aa52 6262 while(i > 0u)
emilmont 1:fdd22bb7aa52 6263 {
emilmont 1:fdd22bb7aa52 6264 /* copy the input sample to the circular buffer */
emilmont 1:fdd22bb7aa52 6265 circBuffer[wOffset] = *src;
emilmont 1:fdd22bb7aa52 6266
emilmont 1:fdd22bb7aa52 6267 /* Update the input pointer */
emilmont 1:fdd22bb7aa52 6268 src += srcInc;
emilmont 1:fdd22bb7aa52 6269
emilmont 1:fdd22bb7aa52 6270 /* Circularly update wOffset. Watch out for positive and negative value */
emilmont 1:fdd22bb7aa52 6271 wOffset += bufferInc;
emilmont 1:fdd22bb7aa52 6272 if(wOffset >= L)
emilmont 1:fdd22bb7aa52 6273 wOffset -= L;
emilmont 1:fdd22bb7aa52 6274
emilmont 1:fdd22bb7aa52 6275 /* Decrement the loop counter */
emilmont 1:fdd22bb7aa52 6276 i--;
emilmont 1:fdd22bb7aa52 6277 }
emilmont 1:fdd22bb7aa52 6278
emilmont 1:fdd22bb7aa52 6279 /* Update the index pointer */
emilmont 1:fdd22bb7aa52 6280 *writeOffset = wOffset;
emilmont 1:fdd22bb7aa52 6281 }
emilmont 1:fdd22bb7aa52 6282
emilmont 1:fdd22bb7aa52 6283
emilmont 1:fdd22bb7aa52 6284
emilmont 1:fdd22bb7aa52 6285 /**
emilmont 1:fdd22bb7aa52 6286 * @brief Q7 Circular Read function.
emilmont 1:fdd22bb7aa52 6287 */
mbed_official 3:7a284390b0ce 6288 static __INLINE void arm_circularRead_q7(
emilmont 1:fdd22bb7aa52 6289 q7_t * circBuffer,
emilmont 1:fdd22bb7aa52 6290 int32_t L,
emilmont 1:fdd22bb7aa52 6291 int32_t * readOffset,
emilmont 1:fdd22bb7aa52 6292 int32_t bufferInc,
emilmont 1:fdd22bb7aa52 6293 q7_t * dst,
emilmont 1:fdd22bb7aa52 6294 q7_t * dst_base,
emilmont 1:fdd22bb7aa52 6295 int32_t dst_length,
emilmont 1:fdd22bb7aa52 6296 int32_t dstInc,
emilmont 1:fdd22bb7aa52 6297 uint32_t blockSize)
emilmont 1:fdd22bb7aa52 6298 {
emilmont 1:fdd22bb7aa52 6299 uint32_t i = 0;
emilmont 1:fdd22bb7aa52 6300 int32_t rOffset, dst_end;
emilmont 1:fdd22bb7aa52 6301
emilmont 1:fdd22bb7aa52 6302 /* Copy the value of Index pointer that points
emilmont 1:fdd22bb7aa52 6303 * to the current location from where the input samples to be read */
emilmont 1:fdd22bb7aa52 6304 rOffset = *readOffset;
emilmont 1:fdd22bb7aa52 6305
emilmont 1:fdd22bb7aa52 6306 dst_end = (int32_t) (dst_base + dst_length);
emilmont 1:fdd22bb7aa52 6307
emilmont 1:fdd22bb7aa52 6308 /* Loop over the blockSize */
emilmont 1:fdd22bb7aa52 6309 i = blockSize;
emilmont 1:fdd22bb7aa52 6310
emilmont 1:fdd22bb7aa52 6311 while(i > 0u)
emilmont 1:fdd22bb7aa52 6312 {
emilmont 1:fdd22bb7aa52 6313 /* copy the sample from the circular buffer to the destination buffer */
emilmont 1:fdd22bb7aa52 6314 *dst = circBuffer[rOffset];
emilmont 1:fdd22bb7aa52 6315
emilmont 1:fdd22bb7aa52 6316 /* Update the input pointer */
emilmont 1:fdd22bb7aa52 6317 dst += dstInc;
emilmont 1:fdd22bb7aa52 6318
emilmont 1:fdd22bb7aa52 6319 if(dst == (q7_t *) dst_end)
emilmont 1:fdd22bb7aa52 6320 {
emilmont 1:fdd22bb7aa52 6321 dst = dst_base;
emilmont 1:fdd22bb7aa52 6322 }
emilmont 1:fdd22bb7aa52 6323
emilmont 1:fdd22bb7aa52 6324 /* Circularly update rOffset. Watch out for positive and negative value */
emilmont 1:fdd22bb7aa52 6325 rOffset += bufferInc;
emilmont 1:fdd22bb7aa52 6326
emilmont 1:fdd22bb7aa52 6327 if(rOffset >= L)
emilmont 1:fdd22bb7aa52 6328 {
emilmont 1:fdd22bb7aa52 6329 rOffset -= L;
emilmont 1:fdd22bb7aa52 6330 }
emilmont 1:fdd22bb7aa52 6331
emilmont 1:fdd22bb7aa52 6332 /* Decrement the loop counter */
emilmont 1:fdd22bb7aa52 6333 i--;
emilmont 1:fdd22bb7aa52 6334 }
emilmont 1:fdd22bb7aa52 6335
emilmont 1:fdd22bb7aa52 6336 /* Update the index pointer */
emilmont 1:fdd22bb7aa52 6337 *readOffset = rOffset;
emilmont 1:fdd22bb7aa52 6338 }
emilmont 1:fdd22bb7aa52 6339
emilmont 1:fdd22bb7aa52 6340
emilmont 1:fdd22bb7aa52 6341 /**
emilmont 1:fdd22bb7aa52 6342 * @brief Sum of the squares of the elements of a Q31 vector.
emilmont 1:fdd22bb7aa52 6343 * @param[in] *pSrc is input pointer
emilmont 1:fdd22bb7aa52 6344 * @param[in] blockSize is the number of samples to process
emilmont 1:fdd22bb7aa52 6345 * @param[out] *pResult is output value.
emilmont 1:fdd22bb7aa52 6346 * @return none.
emilmont 1:fdd22bb7aa52 6347 */
emilmont 1:fdd22bb7aa52 6348
emilmont 1:fdd22bb7aa52 6349 void arm_power_q31(
emilmont 1:fdd22bb7aa52 6350 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 6351 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 6352 q63_t * pResult);
emilmont 1:fdd22bb7aa52 6353
emilmont 1:fdd22bb7aa52 6354 /**
emilmont 1:fdd22bb7aa52 6355 * @brief Sum of the squares of the elements of a floating-point vector.
emilmont 1:fdd22bb7aa52 6356 * @param[in] *pSrc is input pointer
emilmont 1:fdd22bb7aa52 6357 * @param[in] blockSize is the number of samples to process
emilmont 1:fdd22bb7aa52 6358 * @param[out] *pResult is output value.
emilmont 1:fdd22bb7aa52 6359 * @return none.
emilmont 1:fdd22bb7aa52 6360 */
emilmont 1:fdd22bb7aa52 6361
emilmont 1:fdd22bb7aa52 6362 void arm_power_f32(
emilmont 1:fdd22bb7aa52 6363 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 6364 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 6365 float32_t * pResult);
emilmont 1:fdd22bb7aa52 6366
emilmont 1:fdd22bb7aa52 6367 /**
emilmont 1:fdd22bb7aa52 6368 * @brief Sum of the squares of the elements of a Q15 vector.
emilmont 1:fdd22bb7aa52 6369 * @param[in] *pSrc is input pointer
emilmont 1:fdd22bb7aa52 6370 * @param[in] blockSize is the number of samples to process
emilmont 1:fdd22bb7aa52 6371 * @param[out] *pResult is output value.
emilmont 1:fdd22bb7aa52 6372 * @return none.
emilmont 1:fdd22bb7aa52 6373 */
emilmont 1:fdd22bb7aa52 6374
emilmont 1:fdd22bb7aa52 6375 void arm_power_q15(
emilmont 1:fdd22bb7aa52 6376 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 6377 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 6378 q63_t * pResult);
emilmont 1:fdd22bb7aa52 6379
emilmont 1:fdd22bb7aa52 6380 /**
emilmont 1:fdd22bb7aa52 6381 * @brief Sum of the squares of the elements of a Q7 vector.
emilmont 1:fdd22bb7aa52 6382 * @param[in] *pSrc is input pointer
emilmont 1:fdd22bb7aa52 6383 * @param[in] blockSize is the number of samples to process
emilmont 1:fdd22bb7aa52 6384 * @param[out] *pResult is output value.
emilmont 1:fdd22bb7aa52 6385 * @return none.
emilmont 1:fdd22bb7aa52 6386 */
emilmont 1:fdd22bb7aa52 6387
emilmont 1:fdd22bb7aa52 6388 void arm_power_q7(
emilmont 1:fdd22bb7aa52 6389 q7_t * pSrc,
emilmont 1:fdd22bb7aa52 6390 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 6391 q31_t * pResult);
emilmont 1:fdd22bb7aa52 6392
emilmont 1:fdd22bb7aa52 6393 /**
emilmont 1:fdd22bb7aa52 6394 * @brief Mean value of a Q7 vector.
emilmont 1:fdd22bb7aa52 6395 * @param[in] *pSrc is input pointer
emilmont 1:fdd22bb7aa52 6396 * @param[in] blockSize is the number of samples to process
emilmont 1:fdd22bb7aa52 6397 * @param[out] *pResult is output value.
emilmont 1:fdd22bb7aa52 6398 * @return none.
emilmont 1:fdd22bb7aa52 6399 */
emilmont 1:fdd22bb7aa52 6400
emilmont 1:fdd22bb7aa52 6401 void arm_mean_q7(
emilmont 1:fdd22bb7aa52 6402 q7_t * pSrc,
emilmont 1:fdd22bb7aa52 6403 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 6404 q7_t * pResult);
emilmont 1:fdd22bb7aa52 6405
emilmont 1:fdd22bb7aa52 6406 /**
emilmont 1:fdd22bb7aa52 6407 * @brief Mean value of a Q15 vector.
emilmont 1:fdd22bb7aa52 6408 * @param[in] *pSrc is input pointer
emilmont 1:fdd22bb7aa52 6409 * @param[in] blockSize is the number of samples to process
emilmont 1:fdd22bb7aa52 6410 * @param[out] *pResult is output value.
emilmont 1:fdd22bb7aa52 6411 * @return none.
emilmont 1:fdd22bb7aa52 6412 */
emilmont 1:fdd22bb7aa52 6413 void arm_mean_q15(
emilmont 1:fdd22bb7aa52 6414 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 6415 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 6416 q15_t * pResult);
emilmont 1:fdd22bb7aa52 6417
emilmont 1:fdd22bb7aa52 6418 /**
emilmont 1:fdd22bb7aa52 6419 * @brief Mean value of a Q31 vector.
emilmont 1:fdd22bb7aa52 6420 * @param[in] *pSrc is input pointer
emilmont 1:fdd22bb7aa52 6421 * @param[in] blockSize is the number of samples to process
emilmont 1:fdd22bb7aa52 6422 * @param[out] *pResult is output value.
emilmont 1:fdd22bb7aa52 6423 * @return none.
emilmont 1:fdd22bb7aa52 6424 */
emilmont 1:fdd22bb7aa52 6425 void arm_mean_q31(
emilmont 1:fdd22bb7aa52 6426 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 6427 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 6428 q31_t * pResult);
emilmont 1:fdd22bb7aa52 6429
emilmont 1:fdd22bb7aa52 6430 /**
emilmont 1:fdd22bb7aa52 6431 * @brief Mean value of a floating-point vector.
emilmont 1:fdd22bb7aa52 6432 * @param[in] *pSrc is input pointer
emilmont 1:fdd22bb7aa52 6433 * @param[in] blockSize is the number of samples to process
emilmont 1:fdd22bb7aa52 6434 * @param[out] *pResult is output value.
emilmont 1:fdd22bb7aa52 6435 * @return none.
emilmont 1:fdd22bb7aa52 6436 */
emilmont 1:fdd22bb7aa52 6437 void arm_mean_f32(
emilmont 1:fdd22bb7aa52 6438 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 6439 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 6440 float32_t * pResult);
emilmont 1:fdd22bb7aa52 6441
emilmont 1:fdd22bb7aa52 6442 /**
emilmont 1:fdd22bb7aa52 6443 * @brief Variance of the elements of a floating-point vector.
emilmont 1:fdd22bb7aa52 6444 * @param[in] *pSrc is input pointer
emilmont 1:fdd22bb7aa52 6445 * @param[in] blockSize is the number of samples to process
emilmont 1:fdd22bb7aa52 6446 * @param[out] *pResult is output value.
emilmont 1:fdd22bb7aa52 6447 * @return none.
emilmont 1:fdd22bb7aa52 6448 */
emilmont 1:fdd22bb7aa52 6449
emilmont 1:fdd22bb7aa52 6450 void arm_var_f32(
emilmont 1:fdd22bb7aa52 6451 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 6452 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 6453 float32_t * pResult);
emilmont 1:fdd22bb7aa52 6454
emilmont 1:fdd22bb7aa52 6455 /**
emilmont 1:fdd22bb7aa52 6456 * @brief Variance of the elements of a Q31 vector.
emilmont 1:fdd22bb7aa52 6457 * @param[in] *pSrc is input pointer
emilmont 1:fdd22bb7aa52 6458 * @param[in] blockSize is the number of samples to process
emilmont 1:fdd22bb7aa52 6459 * @param[out] *pResult is output value.
emilmont 1:fdd22bb7aa52 6460 * @return none.
emilmont 1:fdd22bb7aa52 6461 */
emilmont 1:fdd22bb7aa52 6462
emilmont 1:fdd22bb7aa52 6463 void arm_var_q31(
emilmont 1:fdd22bb7aa52 6464 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 6465 uint32_t blockSize,
1050186 5:a912b042151f 6466 q31_t * pResult);
emilmont 1:fdd22bb7aa52 6467
emilmont 1:fdd22bb7aa52 6468 /**
emilmont 1:fdd22bb7aa52 6469 * @brief Variance of the elements of a Q15 vector.
emilmont 1:fdd22bb7aa52 6470 * @param[in] *pSrc is input pointer
emilmont 1:fdd22bb7aa52 6471 * @param[in] blockSize is the number of samples to process
emilmont 1:fdd22bb7aa52 6472 * @param[out] *pResult is output value.
emilmont 1:fdd22bb7aa52 6473 * @return none.
emilmont 1:fdd22bb7aa52 6474 */
emilmont 1:fdd22bb7aa52 6475
emilmont 1:fdd22bb7aa52 6476 void arm_var_q15(
emilmont 1:fdd22bb7aa52 6477 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 6478 uint32_t blockSize,
1050186 5:a912b042151f 6479 q15_t * pResult);
emilmont 1:fdd22bb7aa52 6480
emilmont 1:fdd22bb7aa52 6481 /**
emilmont 1:fdd22bb7aa52 6482 * @brief Root Mean Square of the elements of a floating-point vector.
emilmont 1:fdd22bb7aa52 6483 * @param[in] *pSrc is input pointer
emilmont 1:fdd22bb7aa52 6484 * @param[in] blockSize is the number of samples to process
emilmont 1:fdd22bb7aa52 6485 * @param[out] *pResult is output value.
emilmont 1:fdd22bb7aa52 6486 * @return none.
emilmont 1:fdd22bb7aa52 6487 */
emilmont 1:fdd22bb7aa52 6488
emilmont 1:fdd22bb7aa52 6489 void arm_rms_f32(
emilmont 1:fdd22bb7aa52 6490 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 6491 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 6492 float32_t * pResult);
emilmont 1:fdd22bb7aa52 6493
emilmont 1:fdd22bb7aa52 6494 /**
emilmont 1:fdd22bb7aa52 6495 * @brief Root Mean Square of the elements of a Q31 vector.
emilmont 1:fdd22bb7aa52 6496 * @param[in] *pSrc is input pointer
emilmont 1:fdd22bb7aa52 6497 * @param[in] blockSize is the number of samples to process
emilmont 1:fdd22bb7aa52 6498 * @param[out] *pResult is output value.
emilmont 1:fdd22bb7aa52 6499 * @return none.
emilmont 1:fdd22bb7aa52 6500 */
emilmont 1:fdd22bb7aa52 6501
emilmont 1:fdd22bb7aa52 6502 void arm_rms_q31(
emilmont 1:fdd22bb7aa52 6503 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 6504 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 6505 q31_t * pResult);
emilmont 1:fdd22bb7aa52 6506
emilmont 1:fdd22bb7aa52 6507 /**
emilmont 1:fdd22bb7aa52 6508 * @brief Root Mean Square of the elements of a Q15 vector.
emilmont 1:fdd22bb7aa52 6509 * @param[in] *pSrc is input pointer
emilmont 1:fdd22bb7aa52 6510 * @param[in] blockSize is the number of samples to process
emilmont 1:fdd22bb7aa52 6511 * @param[out] *pResult is output value.
emilmont 1:fdd22bb7aa52 6512 * @return none.
emilmont 1:fdd22bb7aa52 6513 */
emilmont 1:fdd22bb7aa52 6514
emilmont 1:fdd22bb7aa52 6515 void arm_rms_q15(
emilmont 1:fdd22bb7aa52 6516 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 6517 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 6518 q15_t * pResult);
emilmont 1:fdd22bb7aa52 6519
emilmont 1:fdd22bb7aa52 6520 /**
emilmont 1:fdd22bb7aa52 6521 * @brief Standard deviation of the elements of a floating-point vector.
emilmont 1:fdd22bb7aa52 6522 * @param[in] *pSrc is input pointer
emilmont 1:fdd22bb7aa52 6523 * @param[in] blockSize is the number of samples to process
emilmont 1:fdd22bb7aa52 6524 * @param[out] *pResult is output value.
emilmont 1:fdd22bb7aa52 6525 * @return none.
emilmont 1:fdd22bb7aa52 6526 */
emilmont 1:fdd22bb7aa52 6527
emilmont 1:fdd22bb7aa52 6528 void arm_std_f32(
emilmont 1:fdd22bb7aa52 6529 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 6530 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 6531 float32_t * pResult);
emilmont 1:fdd22bb7aa52 6532
emilmont 1:fdd22bb7aa52 6533 /**
emilmont 1:fdd22bb7aa52 6534 * @brief Standard deviation of the elements of a Q31 vector.
emilmont 1:fdd22bb7aa52 6535 * @param[in] *pSrc is input pointer
emilmont 1:fdd22bb7aa52 6536 * @param[in] blockSize is the number of samples to process
emilmont 1:fdd22bb7aa52 6537 * @param[out] *pResult is output value.
emilmont 1:fdd22bb7aa52 6538 * @return none.
emilmont 1:fdd22bb7aa52 6539 */
emilmont 1:fdd22bb7aa52 6540
emilmont 1:fdd22bb7aa52 6541 void arm_std_q31(
emilmont 1:fdd22bb7aa52 6542 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 6543 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 6544 q31_t * pResult);
emilmont 1:fdd22bb7aa52 6545
emilmont 1:fdd22bb7aa52 6546 /**
emilmont 1:fdd22bb7aa52 6547 * @brief Standard deviation of the elements of a Q15 vector.
emilmont 1:fdd22bb7aa52 6548 * @param[in] *pSrc is input pointer
emilmont 1:fdd22bb7aa52 6549 * @param[in] blockSize is the number of samples to process
emilmont 1:fdd22bb7aa52 6550 * @param[out] *pResult is output value.
emilmont 1:fdd22bb7aa52 6551 * @return none.
emilmont 1:fdd22bb7aa52 6552 */
emilmont 1:fdd22bb7aa52 6553
emilmont 1:fdd22bb7aa52 6554 void arm_std_q15(
emilmont 1:fdd22bb7aa52 6555 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 6556 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 6557 q15_t * pResult);
emilmont 1:fdd22bb7aa52 6558
emilmont 1:fdd22bb7aa52 6559 /**
emilmont 1:fdd22bb7aa52 6560 * @brief Floating-point complex magnitude
emilmont 1:fdd22bb7aa52 6561 * @param[in] *pSrc points to the complex input vector
emilmont 1:fdd22bb7aa52 6562 * @param[out] *pDst points to the real output vector
emilmont 1:fdd22bb7aa52 6563 * @param[in] numSamples number of complex samples in the input vector
emilmont 1:fdd22bb7aa52 6564 * @return none.
emilmont 1:fdd22bb7aa52 6565 */
emilmont 1:fdd22bb7aa52 6566
emilmont 1:fdd22bb7aa52 6567 void arm_cmplx_mag_f32(
emilmont 1:fdd22bb7aa52 6568 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 6569 float32_t * pDst,
emilmont 1:fdd22bb7aa52 6570 uint32_t numSamples);
emilmont 1:fdd22bb7aa52 6571
emilmont 1:fdd22bb7aa52 6572 /**
emilmont 1:fdd22bb7aa52 6573 * @brief Q31 complex magnitude
emilmont 1:fdd22bb7aa52 6574 * @param[in] *pSrc points to the complex input vector
emilmont 1:fdd22bb7aa52 6575 * @param[out] *pDst points to the real output vector
emilmont 1:fdd22bb7aa52 6576 * @param[in] numSamples number of complex samples in the input vector
emilmont 1:fdd22bb7aa52 6577 * @return none.
emilmont 1:fdd22bb7aa52 6578 */
emilmont 1:fdd22bb7aa52 6579
emilmont 1:fdd22bb7aa52 6580 void arm_cmplx_mag_q31(
emilmont 1:fdd22bb7aa52 6581 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 6582 q31_t * pDst,
emilmont 1:fdd22bb7aa52 6583 uint32_t numSamples);
emilmont 1:fdd22bb7aa52 6584
emilmont 1:fdd22bb7aa52 6585 /**
emilmont 1:fdd22bb7aa52 6586 * @brief Q15 complex magnitude
emilmont 1:fdd22bb7aa52 6587 * @param[in] *pSrc points to the complex input vector
emilmont 1:fdd22bb7aa52 6588 * @param[out] *pDst points to the real output vector
emilmont 1:fdd22bb7aa52 6589 * @param[in] numSamples number of complex samples in the input vector
emilmont 1:fdd22bb7aa52 6590 * @return none.
emilmont 1:fdd22bb7aa52 6591 */
emilmont 1:fdd22bb7aa52 6592
emilmont 1:fdd22bb7aa52 6593 void arm_cmplx_mag_q15(
emilmont 1:fdd22bb7aa52 6594 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 6595 q15_t * pDst,
emilmont 1:fdd22bb7aa52 6596 uint32_t numSamples);
emilmont 1:fdd22bb7aa52 6597
emilmont 1:fdd22bb7aa52 6598 /**
emilmont 1:fdd22bb7aa52 6599 * @brief Q15 complex dot product
emilmont 1:fdd22bb7aa52 6600 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 6601 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 6602 * @param[in] numSamples number of complex samples in each vector
emilmont 1:fdd22bb7aa52 6603 * @param[out] *realResult real part of the result returned here
emilmont 1:fdd22bb7aa52 6604 * @param[out] *imagResult imaginary part of the result returned here
emilmont 1:fdd22bb7aa52 6605 * @return none.
emilmont 1:fdd22bb7aa52 6606 */
emilmont 1:fdd22bb7aa52 6607
emilmont 1:fdd22bb7aa52 6608 void arm_cmplx_dot_prod_q15(
emilmont 1:fdd22bb7aa52 6609 q15_t * pSrcA,
emilmont 1:fdd22bb7aa52 6610 q15_t * pSrcB,
emilmont 1:fdd22bb7aa52 6611 uint32_t numSamples,
emilmont 1:fdd22bb7aa52 6612 q31_t * realResult,
emilmont 1:fdd22bb7aa52 6613 q31_t * imagResult);
emilmont 1:fdd22bb7aa52 6614
emilmont 1:fdd22bb7aa52 6615 /**
emilmont 1:fdd22bb7aa52 6616 * @brief Q31 complex dot product
emilmont 1:fdd22bb7aa52 6617 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 6618 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 6619 * @param[in] numSamples number of complex samples in each vector
emilmont 1:fdd22bb7aa52 6620 * @param[out] *realResult real part of the result returned here
emilmont 1:fdd22bb7aa52 6621 * @param[out] *imagResult imaginary part of the result returned here
emilmont 1:fdd22bb7aa52 6622 * @return none.
emilmont 1:fdd22bb7aa52 6623 */
emilmont 1:fdd22bb7aa52 6624
emilmont 1:fdd22bb7aa52 6625 void arm_cmplx_dot_prod_q31(
emilmont 1:fdd22bb7aa52 6626 q31_t * pSrcA,
emilmont 1:fdd22bb7aa52 6627 q31_t * pSrcB,
emilmont 1:fdd22bb7aa52 6628 uint32_t numSamples,
emilmont 1:fdd22bb7aa52 6629 q63_t * realResult,
emilmont 1:fdd22bb7aa52 6630 q63_t * imagResult);
emilmont 1:fdd22bb7aa52 6631
emilmont 1:fdd22bb7aa52 6632 /**
emilmont 1:fdd22bb7aa52 6633 * @brief Floating-point complex dot product
emilmont 1:fdd22bb7aa52 6634 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 6635 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 6636 * @param[in] numSamples number of complex samples in each vector
emilmont 1:fdd22bb7aa52 6637 * @param[out] *realResult real part of the result returned here
emilmont 1:fdd22bb7aa52 6638 * @param[out] *imagResult imaginary part of the result returned here
emilmont 1:fdd22bb7aa52 6639 * @return none.
emilmont 1:fdd22bb7aa52 6640 */
emilmont 1:fdd22bb7aa52 6641
emilmont 1:fdd22bb7aa52 6642 void arm_cmplx_dot_prod_f32(
emilmont 1:fdd22bb7aa52 6643 float32_t * pSrcA,
emilmont 1:fdd22bb7aa52 6644 float32_t * pSrcB,
emilmont 1:fdd22bb7aa52 6645 uint32_t numSamples,
emilmont 1:fdd22bb7aa52 6646 float32_t * realResult,
emilmont 1:fdd22bb7aa52 6647 float32_t * imagResult);
emilmont 1:fdd22bb7aa52 6648
emilmont 1:fdd22bb7aa52 6649 /**
emilmont 1:fdd22bb7aa52 6650 * @brief Q15 complex-by-real multiplication
emilmont 1:fdd22bb7aa52 6651 * @param[in] *pSrcCmplx points to the complex input vector
emilmont 1:fdd22bb7aa52 6652 * @param[in] *pSrcReal points to the real input vector
emilmont 1:fdd22bb7aa52 6653 * @param[out] *pCmplxDst points to the complex output vector
emilmont 1:fdd22bb7aa52 6654 * @param[in] numSamples number of samples in each vector
emilmont 1:fdd22bb7aa52 6655 * @return none.
emilmont 1:fdd22bb7aa52 6656 */
emilmont 1:fdd22bb7aa52 6657
emilmont 1:fdd22bb7aa52 6658 void arm_cmplx_mult_real_q15(
emilmont 1:fdd22bb7aa52 6659 q15_t * pSrcCmplx,
emilmont 1:fdd22bb7aa52 6660 q15_t * pSrcReal,
emilmont 1:fdd22bb7aa52 6661 q15_t * pCmplxDst,
emilmont 1:fdd22bb7aa52 6662 uint32_t numSamples);
emilmont 1:fdd22bb7aa52 6663
emilmont 1:fdd22bb7aa52 6664 /**
emilmont 1:fdd22bb7aa52 6665 * @brief Q31 complex-by-real multiplication
emilmont 1:fdd22bb7aa52 6666 * @param[in] *pSrcCmplx points to the complex input vector
emilmont 1:fdd22bb7aa52 6667 * @param[in] *pSrcReal points to the real input vector
emilmont 1:fdd22bb7aa52 6668 * @param[out] *pCmplxDst points to the complex output vector
emilmont 1:fdd22bb7aa52 6669 * @param[in] numSamples number of samples in each vector
emilmont 1:fdd22bb7aa52 6670 * @return none.
emilmont 1:fdd22bb7aa52 6671 */
emilmont 1:fdd22bb7aa52 6672
emilmont 1:fdd22bb7aa52 6673 void arm_cmplx_mult_real_q31(
emilmont 1:fdd22bb7aa52 6674 q31_t * pSrcCmplx,
emilmont 1:fdd22bb7aa52 6675 q31_t * pSrcReal,
emilmont 1:fdd22bb7aa52 6676 q31_t * pCmplxDst,
emilmont 1:fdd22bb7aa52 6677 uint32_t numSamples);
emilmont 1:fdd22bb7aa52 6678
emilmont 1:fdd22bb7aa52 6679 /**
emilmont 1:fdd22bb7aa52 6680 * @brief Floating-point complex-by-real multiplication
emilmont 1:fdd22bb7aa52 6681 * @param[in] *pSrcCmplx points to the complex input vector
emilmont 1:fdd22bb7aa52 6682 * @param[in] *pSrcReal points to the real input vector
emilmont 1:fdd22bb7aa52 6683 * @param[out] *pCmplxDst points to the complex output vector
emilmont 1:fdd22bb7aa52 6684 * @param[in] numSamples number of samples in each vector
emilmont 1:fdd22bb7aa52 6685 * @return none.
emilmont 1:fdd22bb7aa52 6686 */
emilmont 1:fdd22bb7aa52 6687
emilmont 1:fdd22bb7aa52 6688 void arm_cmplx_mult_real_f32(
emilmont 1:fdd22bb7aa52 6689 float32_t * pSrcCmplx,
emilmont 1:fdd22bb7aa52 6690 float32_t * pSrcReal,
emilmont 1:fdd22bb7aa52 6691 float32_t * pCmplxDst,
emilmont 1:fdd22bb7aa52 6692 uint32_t numSamples);
emilmont 1:fdd22bb7aa52 6693
emilmont 1:fdd22bb7aa52 6694 /**
emilmont 1:fdd22bb7aa52 6695 * @brief Minimum value of a Q7 vector.
emilmont 1:fdd22bb7aa52 6696 * @param[in] *pSrc is input pointer
emilmont 1:fdd22bb7aa52 6697 * @param[in] blockSize is the number of samples to process
emilmont 1:fdd22bb7aa52 6698 * @param[out] *result is output pointer
emilmont 1:fdd22bb7aa52 6699 * @param[in] index is the array index of the minimum value in the input buffer.
emilmont 1:fdd22bb7aa52 6700 * @return none.
emilmont 1:fdd22bb7aa52 6701 */
emilmont 1:fdd22bb7aa52 6702
emilmont 1:fdd22bb7aa52 6703 void arm_min_q7(
emilmont 1:fdd22bb7aa52 6704 q7_t * pSrc,
emilmont 1:fdd22bb7aa52 6705 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 6706 q7_t * result,
emilmont 1:fdd22bb7aa52 6707 uint32_t * index);
emilmont 1:fdd22bb7aa52 6708
emilmont 1:fdd22bb7aa52 6709 /**
emilmont 1:fdd22bb7aa52 6710 * @brief Minimum value of a Q15 vector.
emilmont 1:fdd22bb7aa52 6711 * @param[in] *pSrc is input pointer
emilmont 1:fdd22bb7aa52 6712 * @param[in] blockSize is the number of samples to process
emilmont 1:fdd22bb7aa52 6713 * @param[out] *pResult is output pointer
emilmont 1:fdd22bb7aa52 6714 * @param[in] *pIndex is the array index of the minimum value in the input buffer.
emilmont 1:fdd22bb7aa52 6715 * @return none.
emilmont 1:fdd22bb7aa52 6716 */
emilmont 1:fdd22bb7aa52 6717
emilmont 1:fdd22bb7aa52 6718 void arm_min_q15(
emilmont 1:fdd22bb7aa52 6719 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 6720 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 6721 q15_t * pResult,
emilmont 1:fdd22bb7aa52 6722 uint32_t * pIndex);
emilmont 1:fdd22bb7aa52 6723
emilmont 1:fdd22bb7aa52 6724 /**
emilmont 1:fdd22bb7aa52 6725 * @brief Minimum value of a Q31 vector.
emilmont 1:fdd22bb7aa52 6726 * @param[in] *pSrc is input pointer
emilmont 1:fdd22bb7aa52 6727 * @param[in] blockSize is the number of samples to process
emilmont 1:fdd22bb7aa52 6728 * @param[out] *pResult is output pointer
emilmont 1:fdd22bb7aa52 6729 * @param[out] *pIndex is the array index of the minimum value in the input buffer.
emilmont 1:fdd22bb7aa52 6730 * @return none.
emilmont 1:fdd22bb7aa52 6731 */
emilmont 1:fdd22bb7aa52 6732 void arm_min_q31(
emilmont 1:fdd22bb7aa52 6733 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 6734 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 6735 q31_t * pResult,
emilmont 1:fdd22bb7aa52 6736 uint32_t * pIndex);
emilmont 1:fdd22bb7aa52 6737
emilmont 1:fdd22bb7aa52 6738 /**
emilmont 1:fdd22bb7aa52 6739 * @brief Minimum value of a floating-point vector.
emilmont 1:fdd22bb7aa52 6740 * @param[in] *pSrc is input pointer
emilmont 1:fdd22bb7aa52 6741 * @param[in] blockSize is the number of samples to process
emilmont 1:fdd22bb7aa52 6742 * @param[out] *pResult is output pointer
emilmont 1:fdd22bb7aa52 6743 * @param[out] *pIndex is the array index of the minimum value in the input buffer.
emilmont 1:fdd22bb7aa52 6744 * @return none.
emilmont 1:fdd22bb7aa52 6745 */
emilmont 1:fdd22bb7aa52 6746
emilmont 1:fdd22bb7aa52 6747 void arm_min_f32(
emilmont 1:fdd22bb7aa52 6748 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 6749 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 6750 float32_t * pResult,
emilmont 1:fdd22bb7aa52 6751 uint32_t * pIndex);
emilmont 1:fdd22bb7aa52 6752
emilmont 1:fdd22bb7aa52 6753 /**
emilmont 1:fdd22bb7aa52 6754 * @brief Maximum value of a Q7 vector.
emilmont 1:fdd22bb7aa52 6755 * @param[in] *pSrc points to the input buffer
emilmont 1:fdd22bb7aa52 6756 * @param[in] blockSize length of the input vector
emilmont 1:fdd22bb7aa52 6757 * @param[out] *pResult maximum value returned here
emilmont 1:fdd22bb7aa52 6758 * @param[out] *pIndex index of maximum value returned here
emilmont 1:fdd22bb7aa52 6759 * @return none.
emilmont 1:fdd22bb7aa52 6760 */
emilmont 1:fdd22bb7aa52 6761
emilmont 1:fdd22bb7aa52 6762 void arm_max_q7(
emilmont 1:fdd22bb7aa52 6763 q7_t * pSrc,
emilmont 1:fdd22bb7aa52 6764 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 6765 q7_t * pResult,
emilmont 1:fdd22bb7aa52 6766 uint32_t * pIndex);
emilmont 1:fdd22bb7aa52 6767
emilmont 1:fdd22bb7aa52 6768 /**
emilmont 1:fdd22bb7aa52 6769 * @brief Maximum value of a Q15 vector.
emilmont 1:fdd22bb7aa52 6770 * @param[in] *pSrc points to the input buffer
emilmont 1:fdd22bb7aa52 6771 * @param[in] blockSize length of the input vector
emilmont 1:fdd22bb7aa52 6772 * @param[out] *pResult maximum value returned here
emilmont 1:fdd22bb7aa52 6773 * @param[out] *pIndex index of maximum value returned here
emilmont 1:fdd22bb7aa52 6774 * @return none.
emilmont 1:fdd22bb7aa52 6775 */
emilmont 1:fdd22bb7aa52 6776
emilmont 1:fdd22bb7aa52 6777 void arm_max_q15(
emilmont 1:fdd22bb7aa52 6778 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 6779 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 6780 q15_t * pResult,
emilmont 1:fdd22bb7aa52 6781 uint32_t * pIndex);
emilmont 1:fdd22bb7aa52 6782
emilmont 1:fdd22bb7aa52 6783 /**
emilmont 1:fdd22bb7aa52 6784 * @brief Maximum value of a Q31 vector.
emilmont 1:fdd22bb7aa52 6785 * @param[in] *pSrc points to the input buffer
emilmont 1:fdd22bb7aa52 6786 * @param[in] blockSize length of the input vector
emilmont 1:fdd22bb7aa52 6787 * @param[out] *pResult maximum value returned here
emilmont 1:fdd22bb7aa52 6788 * @param[out] *pIndex index of maximum value returned here
emilmont 1:fdd22bb7aa52 6789 * @return none.
emilmont 1:fdd22bb7aa52 6790 */
emilmont 1:fdd22bb7aa52 6791
emilmont 1:fdd22bb7aa52 6792 void arm_max_q31(
emilmont 1:fdd22bb7aa52 6793 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 6794 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 6795 q31_t * pResult,
emilmont 1:fdd22bb7aa52 6796 uint32_t * pIndex);
emilmont 1:fdd22bb7aa52 6797
emilmont 1:fdd22bb7aa52 6798 /**
emilmont 1:fdd22bb7aa52 6799 * @brief Maximum value of a floating-point vector.
emilmont 1:fdd22bb7aa52 6800 * @param[in] *pSrc points to the input buffer
emilmont 1:fdd22bb7aa52 6801 * @param[in] blockSize length of the input vector
emilmont 1:fdd22bb7aa52 6802 * @param[out] *pResult maximum value returned here
emilmont 1:fdd22bb7aa52 6803 * @param[out] *pIndex index of maximum value returned here
emilmont 1:fdd22bb7aa52 6804 * @return none.
emilmont 1:fdd22bb7aa52 6805 */
emilmont 1:fdd22bb7aa52 6806
emilmont 1:fdd22bb7aa52 6807 void arm_max_f32(
emilmont 1:fdd22bb7aa52 6808 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 6809 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 6810 float32_t * pResult,
emilmont 1:fdd22bb7aa52 6811 uint32_t * pIndex);
emilmont 1:fdd22bb7aa52 6812
emilmont 1:fdd22bb7aa52 6813 /**
emilmont 1:fdd22bb7aa52 6814 * @brief Q15 complex-by-complex multiplication
emilmont 1:fdd22bb7aa52 6815 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 6816 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 6817 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 6818 * @param[in] numSamples number of complex samples in each vector
emilmont 1:fdd22bb7aa52 6819 * @return none.
emilmont 1:fdd22bb7aa52 6820 */
emilmont 1:fdd22bb7aa52 6821
emilmont 1:fdd22bb7aa52 6822 void arm_cmplx_mult_cmplx_q15(
emilmont 1:fdd22bb7aa52 6823 q15_t * pSrcA,
emilmont 1:fdd22bb7aa52 6824 q15_t * pSrcB,
emilmont 1:fdd22bb7aa52 6825 q15_t * pDst,
emilmont 1:fdd22bb7aa52 6826 uint32_t numSamples);
emilmont 1:fdd22bb7aa52 6827
emilmont 1:fdd22bb7aa52 6828 /**
emilmont 1:fdd22bb7aa52 6829 * @brief Q31 complex-by-complex multiplication
emilmont 1:fdd22bb7aa52 6830 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 6831 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 6832 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 6833 * @param[in] numSamples number of complex samples in each vector
emilmont 1:fdd22bb7aa52 6834 * @return none.
emilmont 1:fdd22bb7aa52 6835 */
emilmont 1:fdd22bb7aa52 6836
emilmont 1:fdd22bb7aa52 6837 void arm_cmplx_mult_cmplx_q31(
emilmont 1:fdd22bb7aa52 6838 q31_t * pSrcA,
emilmont 1:fdd22bb7aa52 6839 q31_t * pSrcB,
emilmont 1:fdd22bb7aa52 6840 q31_t * pDst,
emilmont 1:fdd22bb7aa52 6841 uint32_t numSamples);
emilmont 1:fdd22bb7aa52 6842
emilmont 1:fdd22bb7aa52 6843 /**
emilmont 1:fdd22bb7aa52 6844 * @brief Floating-point complex-by-complex multiplication
emilmont 1:fdd22bb7aa52 6845 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 6846 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 6847 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 6848 * @param[in] numSamples number of complex samples in each vector
emilmont 1:fdd22bb7aa52 6849 * @return none.
emilmont 1:fdd22bb7aa52 6850 */
emilmont 1:fdd22bb7aa52 6851
emilmont 1:fdd22bb7aa52 6852 void arm_cmplx_mult_cmplx_f32(
emilmont 1:fdd22bb7aa52 6853 float32_t * pSrcA,
emilmont 1:fdd22bb7aa52 6854 float32_t * pSrcB,
emilmont 1:fdd22bb7aa52 6855 float32_t * pDst,
emilmont 1:fdd22bb7aa52 6856 uint32_t numSamples);
emilmont 1:fdd22bb7aa52 6857
emilmont 1:fdd22bb7aa52 6858 /**
mbed_official 3:7a284390b0ce 6859 * @brief Converts the elements of the floating-point vector to Q31 vector.
mbed_official 3:7a284390b0ce 6860 * @param[in] *pSrc points to the floating-point input vector
emilmont 1:fdd22bb7aa52 6861 * @param[out] *pDst points to the Q31 output vector
mbed_official 3:7a284390b0ce 6862 * @param[in] blockSize length of the input vector
mbed_official 3:7a284390b0ce 6863 * @return none.
emilmont 1:fdd22bb7aa52 6864 */
emilmont 1:fdd22bb7aa52 6865 void arm_float_to_q31(
emilmont 1:fdd22bb7aa52 6866 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 6867 q31_t * pDst,
emilmont 1:fdd22bb7aa52 6868 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 6869
emilmont 1:fdd22bb7aa52 6870 /**
mbed_official 3:7a284390b0ce 6871 * @brief Converts the elements of the floating-point vector to Q15 vector.
mbed_official 3:7a284390b0ce 6872 * @param[in] *pSrc points to the floating-point input vector
emilmont 1:fdd22bb7aa52 6873 * @param[out] *pDst points to the Q15 output vector
mbed_official 3:7a284390b0ce 6874 * @param[in] blockSize length of the input vector
emilmont 1:fdd22bb7aa52 6875 * @return none
emilmont 1:fdd22bb7aa52 6876 */
emilmont 1:fdd22bb7aa52 6877 void arm_float_to_q15(
emilmont 1:fdd22bb7aa52 6878 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 6879 q15_t * pDst,
emilmont 1:fdd22bb7aa52 6880 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 6881
emilmont 1:fdd22bb7aa52 6882 /**
mbed_official 3:7a284390b0ce 6883 * @brief Converts the elements of the floating-point vector to Q7 vector.
mbed_official 3:7a284390b0ce 6884 * @param[in] *pSrc points to the floating-point input vector
emilmont 1:fdd22bb7aa52 6885 * @param[out] *pDst points to the Q7 output vector
mbed_official 3:7a284390b0ce 6886 * @param[in] blockSize length of the input vector
emilmont 1:fdd22bb7aa52 6887 * @return none
emilmont 1:fdd22bb7aa52 6888 */
emilmont 1:fdd22bb7aa52 6889 void arm_float_to_q7(
emilmont 1:fdd22bb7aa52 6890 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 6891 q7_t * pDst,
emilmont 1:fdd22bb7aa52 6892 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 6893
emilmont 1:fdd22bb7aa52 6894
emilmont 1:fdd22bb7aa52 6895 /**
emilmont 1:fdd22bb7aa52 6896 * @brief Converts the elements of the Q31 vector to Q15 vector.
emilmont 1:fdd22bb7aa52 6897 * @param[in] *pSrc is input pointer
emilmont 1:fdd22bb7aa52 6898 * @param[out] *pDst is output pointer
emilmont 1:fdd22bb7aa52 6899 * @param[in] blockSize is the number of samples to process
emilmont 1:fdd22bb7aa52 6900 * @return none.
emilmont 1:fdd22bb7aa52 6901 */
emilmont 1:fdd22bb7aa52 6902 void arm_q31_to_q15(
emilmont 1:fdd22bb7aa52 6903 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 6904 q15_t * pDst,
emilmont 1:fdd22bb7aa52 6905 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 6906
emilmont 1:fdd22bb7aa52 6907 /**
emilmont 1:fdd22bb7aa52 6908 * @brief Converts the elements of the Q31 vector to Q7 vector.
emilmont 1:fdd22bb7aa52 6909 * @param[in] *pSrc is input pointer
emilmont 1:fdd22bb7aa52 6910 * @param[out] *pDst is output pointer
emilmont 1:fdd22bb7aa52 6911 * @param[in] blockSize is the number of samples to process
emilmont 1:fdd22bb7aa52 6912 * @return none.
emilmont 1:fdd22bb7aa52 6913 */
emilmont 1:fdd22bb7aa52 6914 void arm_q31_to_q7(
emilmont 1:fdd22bb7aa52 6915 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 6916 q7_t * pDst,
emilmont 1:fdd22bb7aa52 6917 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 6918
emilmont 1:fdd22bb7aa52 6919 /**
emilmont 1:fdd22bb7aa52 6920 * @brief Converts the elements of the Q15 vector to floating-point vector.
emilmont 1:fdd22bb7aa52 6921 * @param[in] *pSrc is input pointer
emilmont 1:fdd22bb7aa52 6922 * @param[out] *pDst is output pointer
emilmont 1:fdd22bb7aa52 6923 * @param[in] blockSize is the number of samples to process
emilmont 1:fdd22bb7aa52 6924 * @return none.
emilmont 1:fdd22bb7aa52 6925 */
emilmont 1:fdd22bb7aa52 6926 void arm_q15_to_float(
emilmont 1:fdd22bb7aa52 6927 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 6928 float32_t * pDst,
emilmont 1:fdd22bb7aa52 6929 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 6930
emilmont 1:fdd22bb7aa52 6931
emilmont 1:fdd22bb7aa52 6932 /**
emilmont 1:fdd22bb7aa52 6933 * @brief Converts the elements of the Q15 vector to Q31 vector.
emilmont 1:fdd22bb7aa52 6934 * @param[in] *pSrc is input pointer
emilmont 1:fdd22bb7aa52 6935 * @param[out] *pDst is output pointer
emilmont 1:fdd22bb7aa52 6936 * @param[in] blockSize is the number of samples to process
emilmont 1:fdd22bb7aa52 6937 * @return none.
emilmont 1:fdd22bb7aa52 6938 */
emilmont 1:fdd22bb7aa52 6939 void arm_q15_to_q31(
emilmont 1:fdd22bb7aa52 6940 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 6941 q31_t * pDst,
emilmont 1:fdd22bb7aa52 6942 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 6943
emilmont 1:fdd22bb7aa52 6944
emilmont 1:fdd22bb7aa52 6945 /**
emilmont 1:fdd22bb7aa52 6946 * @brief Converts the elements of the Q15 vector to Q7 vector.
emilmont 1:fdd22bb7aa52 6947 * @param[in] *pSrc is input pointer
emilmont 1:fdd22bb7aa52 6948 * @param[out] *pDst is output pointer
emilmont 1:fdd22bb7aa52 6949 * @param[in] blockSize is the number of samples to process
emilmont 1:fdd22bb7aa52 6950 * @return none.
emilmont 1:fdd22bb7aa52 6951 */
emilmont 1:fdd22bb7aa52 6952 void arm_q15_to_q7(
emilmont 1:fdd22bb7aa52 6953 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 6954 q7_t * pDst,
emilmont 1:fdd22bb7aa52 6955 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 6956
emilmont 1:fdd22bb7aa52 6957
emilmont 1:fdd22bb7aa52 6958 /**
emilmont 1:fdd22bb7aa52 6959 * @ingroup groupInterpolation
emilmont 1:fdd22bb7aa52 6960 */
emilmont 1:fdd22bb7aa52 6961
emilmont 1:fdd22bb7aa52 6962 /**
emilmont 1:fdd22bb7aa52 6963 * @defgroup BilinearInterpolate Bilinear Interpolation
emilmont 1:fdd22bb7aa52 6964 *
emilmont 1:fdd22bb7aa52 6965 * Bilinear interpolation is an extension of linear interpolation applied to a two dimensional grid.
emilmont 1:fdd22bb7aa52 6966 * The underlying function <code>f(x, y)</code> is sampled on a regular grid and the interpolation process
emilmont 1:fdd22bb7aa52 6967 * determines values between the grid points.
emilmont 1:fdd22bb7aa52 6968 * Bilinear interpolation is equivalent to two step linear interpolation, first in the x-dimension and then in the y-dimension.
emilmont 1:fdd22bb7aa52 6969 * Bilinear interpolation is often used in image processing to rescale images.
emilmont 1:fdd22bb7aa52 6970 * The CMSIS DSP library provides bilinear interpolation functions for Q7, Q15, Q31, and floating-point data types.
emilmont 1:fdd22bb7aa52 6971 *
emilmont 1:fdd22bb7aa52 6972 * <b>Algorithm</b>
emilmont 1:fdd22bb7aa52 6973 * \par
emilmont 1:fdd22bb7aa52 6974 * The instance structure used by the bilinear interpolation functions describes a two dimensional data table.
emilmont 1:fdd22bb7aa52 6975 * For floating-point, the instance structure is defined as:
emilmont 1:fdd22bb7aa52 6976 * <pre>
emilmont 1:fdd22bb7aa52 6977 * typedef struct
emilmont 1:fdd22bb7aa52 6978 * {
emilmont 1:fdd22bb7aa52 6979 * uint16_t numRows;
emilmont 1:fdd22bb7aa52 6980 * uint16_t numCols;
emilmont 1:fdd22bb7aa52 6981 * float32_t *pData;
emilmont 1:fdd22bb7aa52 6982 * } arm_bilinear_interp_instance_f32;
emilmont 1:fdd22bb7aa52 6983 * </pre>
emilmont 1:fdd22bb7aa52 6984 *
emilmont 1:fdd22bb7aa52 6985 * \par
emilmont 1:fdd22bb7aa52 6986 * where <code>numRows</code> specifies the number of rows in the table;
emilmont 1:fdd22bb7aa52 6987 * <code>numCols</code> specifies the number of columns in the table;
emilmont 1:fdd22bb7aa52 6988 * and <code>pData</code> points to an array of size <code>numRows*numCols</code> values.
emilmont 1:fdd22bb7aa52 6989 * The data table <code>pTable</code> is organized in row order and the supplied data values fall on integer indexes.
emilmont 1:fdd22bb7aa52 6990 * That is, table element (x,y) is located at <code>pTable[x + y*numCols]</code> where x and y are integers.
emilmont 1:fdd22bb7aa52 6991 *
emilmont 1:fdd22bb7aa52 6992 * \par
emilmont 1:fdd22bb7aa52 6993 * Let <code>(x, y)</code> specify the desired interpolation point. Then define:
emilmont 1:fdd22bb7aa52 6994 * <pre>
emilmont 1:fdd22bb7aa52 6995 * XF = floor(x)
emilmont 1:fdd22bb7aa52 6996 * YF = floor(y)
emilmont 1:fdd22bb7aa52 6997 * </pre>
emilmont 1:fdd22bb7aa52 6998 * \par
emilmont 1:fdd22bb7aa52 6999 * The interpolated output point is computed as:
emilmont 1:fdd22bb7aa52 7000 * <pre>
emilmont 1:fdd22bb7aa52 7001 * f(x, y) = f(XF, YF) * (1-(x-XF)) * (1-(y-YF))
emilmont 1:fdd22bb7aa52 7002 * + f(XF+1, YF) * (x-XF)*(1-(y-YF))
emilmont 1:fdd22bb7aa52 7003 * + f(XF, YF+1) * (1-(x-XF))*(y-YF)
emilmont 1:fdd22bb7aa52 7004 * + f(XF+1, YF+1) * (x-XF)*(y-YF)
emilmont 1:fdd22bb7aa52 7005 * </pre>
mbed_official 3:7a284390b0ce 7006 * Note that the coordinates (x, y) contain integer and fractional components.
emilmont 1:fdd22bb7aa52 7007 * The integer components specify which portion of the table to use while the
emilmont 1:fdd22bb7aa52 7008 * fractional components control the interpolation processor.
emilmont 1:fdd22bb7aa52 7009 *
emilmont 1:fdd22bb7aa52 7010 * \par
mbed_official 3:7a284390b0ce 7011 * if (x,y) are outside of the table boundary, Bilinear interpolation returns zero output.
emilmont 1:fdd22bb7aa52 7012 */
emilmont 1:fdd22bb7aa52 7013
emilmont 1:fdd22bb7aa52 7014 /**
emilmont 1:fdd22bb7aa52 7015 * @addtogroup BilinearInterpolate
emilmont 1:fdd22bb7aa52 7016 * @{
emilmont 1:fdd22bb7aa52 7017 */
emilmont 1:fdd22bb7aa52 7018
emilmont 1:fdd22bb7aa52 7019 /**
emilmont 1:fdd22bb7aa52 7020 *
emilmont 1:fdd22bb7aa52 7021 * @brief Floating-point bilinear interpolation.
emilmont 1:fdd22bb7aa52 7022 * @param[in,out] *S points to an instance of the interpolation structure.
emilmont 1:fdd22bb7aa52 7023 * @param[in] X interpolation coordinate.
emilmont 1:fdd22bb7aa52 7024 * @param[in] Y interpolation coordinate.
emilmont 1:fdd22bb7aa52 7025 * @return out interpolated value.
emilmont 1:fdd22bb7aa52 7026 */
emilmont 1:fdd22bb7aa52 7027
emilmont 1:fdd22bb7aa52 7028
mbed_official 3:7a284390b0ce 7029 static __INLINE float32_t arm_bilinear_interp_f32(
emilmont 1:fdd22bb7aa52 7030 const arm_bilinear_interp_instance_f32 * S,
emilmont 1:fdd22bb7aa52 7031 float32_t X,
emilmont 1:fdd22bb7aa52 7032 float32_t Y)
emilmont 1:fdd22bb7aa52 7033 {
emilmont 1:fdd22bb7aa52 7034 float32_t out;
emilmont 1:fdd22bb7aa52 7035 float32_t f00, f01, f10, f11;
emilmont 1:fdd22bb7aa52 7036 float32_t *pData = S->pData;
emilmont 1:fdd22bb7aa52 7037 int32_t xIndex, yIndex, index;
emilmont 1:fdd22bb7aa52 7038 float32_t xdiff, ydiff;
emilmont 1:fdd22bb7aa52 7039 float32_t b1, b2, b3, b4;
emilmont 1:fdd22bb7aa52 7040
emilmont 1:fdd22bb7aa52 7041 xIndex = (int32_t) X;
emilmont 1:fdd22bb7aa52 7042 yIndex = (int32_t) Y;
emilmont 1:fdd22bb7aa52 7043
emilmont 1:fdd22bb7aa52 7044 /* Care taken for table outside boundary */
emilmont 1:fdd22bb7aa52 7045 /* Returns zero output when values are outside table boundary */
emilmont 1:fdd22bb7aa52 7046 if(xIndex < 0 || xIndex > (S->numRows - 1) || yIndex < 0
emilmont 1:fdd22bb7aa52 7047 || yIndex > (S->numCols - 1))
emilmont 1:fdd22bb7aa52 7048 {
emilmont 1:fdd22bb7aa52 7049 return (0);
emilmont 1:fdd22bb7aa52 7050 }
emilmont 1:fdd22bb7aa52 7051
emilmont 1:fdd22bb7aa52 7052 /* Calculation of index for two nearest points in X-direction */
emilmont 1:fdd22bb7aa52 7053 index = (xIndex - 1) + (yIndex - 1) * S->numCols;
emilmont 1:fdd22bb7aa52 7054
emilmont 1:fdd22bb7aa52 7055
emilmont 1:fdd22bb7aa52 7056 /* Read two nearest points in X-direction */
emilmont 1:fdd22bb7aa52 7057 f00 = pData[index];
emilmont 1:fdd22bb7aa52 7058 f01 = pData[index + 1];
emilmont 1:fdd22bb7aa52 7059
emilmont 1:fdd22bb7aa52 7060 /* Calculation of index for two nearest points in Y-direction */
emilmont 1:fdd22bb7aa52 7061 index = (xIndex - 1) + (yIndex) * S->numCols;
emilmont 1:fdd22bb7aa52 7062
emilmont 1:fdd22bb7aa52 7063
emilmont 1:fdd22bb7aa52 7064 /* Read two nearest points in Y-direction */
emilmont 1:fdd22bb7aa52 7065 f10 = pData[index];
emilmont 1:fdd22bb7aa52 7066 f11 = pData[index + 1];
emilmont 1:fdd22bb7aa52 7067
emilmont 1:fdd22bb7aa52 7068 /* Calculation of intermediate values */
emilmont 1:fdd22bb7aa52 7069 b1 = f00;
emilmont 1:fdd22bb7aa52 7070 b2 = f01 - f00;
emilmont 1:fdd22bb7aa52 7071 b3 = f10 - f00;
emilmont 1:fdd22bb7aa52 7072 b4 = f00 - f01 - f10 + f11;
emilmont 1:fdd22bb7aa52 7073
emilmont 1:fdd22bb7aa52 7074 /* Calculation of fractional part in X */
emilmont 1:fdd22bb7aa52 7075 xdiff = X - xIndex;
emilmont 1:fdd22bb7aa52 7076
emilmont 1:fdd22bb7aa52 7077 /* Calculation of fractional part in Y */
emilmont 1:fdd22bb7aa52 7078 ydiff = Y - yIndex;
emilmont 1:fdd22bb7aa52 7079
emilmont 1:fdd22bb7aa52 7080 /* Calculation of bi-linear interpolated output */
emilmont 1:fdd22bb7aa52 7081 out = b1 + b2 * xdiff + b3 * ydiff + b4 * xdiff * ydiff;
emilmont 1:fdd22bb7aa52 7082
emilmont 1:fdd22bb7aa52 7083 /* return to application */
emilmont 1:fdd22bb7aa52 7084 return (out);
emilmont 1:fdd22bb7aa52 7085
emilmont 1:fdd22bb7aa52 7086 }
emilmont 1:fdd22bb7aa52 7087
emilmont 1:fdd22bb7aa52 7088 /**
emilmont 1:fdd22bb7aa52 7089 *
emilmont 1:fdd22bb7aa52 7090 * @brief Q31 bilinear interpolation.
emilmont 1:fdd22bb7aa52 7091 * @param[in,out] *S points to an instance of the interpolation structure.
emilmont 1:fdd22bb7aa52 7092 * @param[in] X interpolation coordinate in 12.20 format.
emilmont 1:fdd22bb7aa52 7093 * @param[in] Y interpolation coordinate in 12.20 format.
emilmont 1:fdd22bb7aa52 7094 * @return out interpolated value.
emilmont 1:fdd22bb7aa52 7095 */
emilmont 1:fdd22bb7aa52 7096
mbed_official 3:7a284390b0ce 7097 static __INLINE q31_t arm_bilinear_interp_q31(
emilmont 1:fdd22bb7aa52 7098 arm_bilinear_interp_instance_q31 * S,
emilmont 1:fdd22bb7aa52 7099 q31_t X,
emilmont 1:fdd22bb7aa52 7100 q31_t Y)
emilmont 1:fdd22bb7aa52 7101 {
emilmont 1:fdd22bb7aa52 7102 q31_t out; /* Temporary output */
emilmont 1:fdd22bb7aa52 7103 q31_t acc = 0; /* output */
emilmont 1:fdd22bb7aa52 7104 q31_t xfract, yfract; /* X, Y fractional parts */
emilmont 1:fdd22bb7aa52 7105 q31_t x1, x2, y1, y2; /* Nearest output values */
emilmont 1:fdd22bb7aa52 7106 int32_t rI, cI; /* Row and column indices */
emilmont 1:fdd22bb7aa52 7107 q31_t *pYData = S->pData; /* pointer to output table values */
emilmont 1:fdd22bb7aa52 7108 uint32_t nCols = S->numCols; /* num of rows */
emilmont 1:fdd22bb7aa52 7109
emilmont 1:fdd22bb7aa52 7110
emilmont 1:fdd22bb7aa52 7111 /* Input is in 12.20 format */
emilmont 1:fdd22bb7aa52 7112 /* 12 bits for the table index */
emilmont 1:fdd22bb7aa52 7113 /* Index value calculation */
emilmont 1:fdd22bb7aa52 7114 rI = ((X & 0xFFF00000) >> 20u);
emilmont 1:fdd22bb7aa52 7115
emilmont 1:fdd22bb7aa52 7116 /* Input is in 12.20 format */
emilmont 1:fdd22bb7aa52 7117 /* 12 bits for the table index */
emilmont 1:fdd22bb7aa52 7118 /* Index value calculation */
emilmont 1:fdd22bb7aa52 7119 cI = ((Y & 0xFFF00000) >> 20u);
emilmont 1:fdd22bb7aa52 7120
emilmont 1:fdd22bb7aa52 7121 /* Care taken for table outside boundary */
emilmont 1:fdd22bb7aa52 7122 /* Returns zero output when values are outside table boundary */
emilmont 1:fdd22bb7aa52 7123 if(rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1))
emilmont 1:fdd22bb7aa52 7124 {
emilmont 1:fdd22bb7aa52 7125 return (0);
emilmont 1:fdd22bb7aa52 7126 }
emilmont 1:fdd22bb7aa52 7127
emilmont 1:fdd22bb7aa52 7128 /* 20 bits for the fractional part */
emilmont 1:fdd22bb7aa52 7129 /* shift left xfract by 11 to keep 1.31 format */
emilmont 1:fdd22bb7aa52 7130 xfract = (X & 0x000FFFFF) << 11u;
emilmont 1:fdd22bb7aa52 7131
emilmont 1:fdd22bb7aa52 7132 /* Read two nearest output values from the index */
emilmont 1:fdd22bb7aa52 7133 x1 = pYData[(rI) + nCols * (cI)];
emilmont 1:fdd22bb7aa52 7134 x2 = pYData[(rI) + nCols * (cI) + 1u];
emilmont 1:fdd22bb7aa52 7135
emilmont 1:fdd22bb7aa52 7136 /* 20 bits for the fractional part */
emilmont 1:fdd22bb7aa52 7137 /* shift left yfract by 11 to keep 1.31 format */
emilmont 1:fdd22bb7aa52 7138 yfract = (Y & 0x000FFFFF) << 11u;
emilmont 1:fdd22bb7aa52 7139
emilmont 1:fdd22bb7aa52 7140 /* Read two nearest output values from the index */
emilmont 1:fdd22bb7aa52 7141 y1 = pYData[(rI) + nCols * (cI + 1)];
emilmont 1:fdd22bb7aa52 7142 y2 = pYData[(rI) + nCols * (cI + 1) + 1u];
emilmont 1:fdd22bb7aa52 7143
emilmont 1:fdd22bb7aa52 7144 /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 3.29(q29) format */
emilmont 1:fdd22bb7aa52 7145 out = ((q31_t) (((q63_t) x1 * (0x7FFFFFFF - xfract)) >> 32));
emilmont 1:fdd22bb7aa52 7146 acc = ((q31_t) (((q63_t) out * (0x7FFFFFFF - yfract)) >> 32));
emilmont 1:fdd22bb7aa52 7147
emilmont 1:fdd22bb7aa52 7148 /* x2 * (xfract) * (1-yfract) in 3.29(q29) and adding to acc */
emilmont 1:fdd22bb7aa52 7149 out = ((q31_t) ((q63_t) x2 * (0x7FFFFFFF - yfract) >> 32));
emilmont 1:fdd22bb7aa52 7150 acc += ((q31_t) ((q63_t) out * (xfract) >> 32));
emilmont 1:fdd22bb7aa52 7151
emilmont 1:fdd22bb7aa52 7152 /* y1 * (1 - xfract) * (yfract) in 3.29(q29) and adding to acc */
emilmont 1:fdd22bb7aa52 7153 out = ((q31_t) ((q63_t) y1 * (0x7FFFFFFF - xfract) >> 32));
emilmont 1:fdd22bb7aa52 7154 acc += ((q31_t) ((q63_t) out * (yfract) >> 32));
emilmont 1:fdd22bb7aa52 7155
emilmont 1:fdd22bb7aa52 7156 /* y2 * (xfract) * (yfract) in 3.29(q29) and adding to acc */
emilmont 1:fdd22bb7aa52 7157 out = ((q31_t) ((q63_t) y2 * (xfract) >> 32));
emilmont 1:fdd22bb7aa52 7158 acc += ((q31_t) ((q63_t) out * (yfract) >> 32));
emilmont 1:fdd22bb7aa52 7159
emilmont 1:fdd22bb7aa52 7160 /* Convert acc to 1.31(q31) format */
emilmont 1:fdd22bb7aa52 7161 return (acc << 2u);
emilmont 1:fdd22bb7aa52 7162
emilmont 1:fdd22bb7aa52 7163 }
emilmont 1:fdd22bb7aa52 7164
emilmont 1:fdd22bb7aa52 7165 /**
emilmont 1:fdd22bb7aa52 7166 * @brief Q15 bilinear interpolation.
emilmont 1:fdd22bb7aa52 7167 * @param[in,out] *S points to an instance of the interpolation structure.
emilmont 1:fdd22bb7aa52 7168 * @param[in] X interpolation coordinate in 12.20 format.
emilmont 1:fdd22bb7aa52 7169 * @param[in] Y interpolation coordinate in 12.20 format.
emilmont 1:fdd22bb7aa52 7170 * @return out interpolated value.
emilmont 1:fdd22bb7aa52 7171 */
emilmont 1:fdd22bb7aa52 7172
mbed_official 3:7a284390b0ce 7173 static __INLINE q15_t arm_bilinear_interp_q15(
emilmont 1:fdd22bb7aa52 7174 arm_bilinear_interp_instance_q15 * S,
emilmont 1:fdd22bb7aa52 7175 q31_t X,
emilmont 1:fdd22bb7aa52 7176 q31_t Y)
emilmont 1:fdd22bb7aa52 7177 {
emilmont 1:fdd22bb7aa52 7178 q63_t acc = 0; /* output */
emilmont 1:fdd22bb7aa52 7179 q31_t out; /* Temporary output */
emilmont 1:fdd22bb7aa52 7180 q15_t x1, x2, y1, y2; /* Nearest output values */
emilmont 1:fdd22bb7aa52 7181 q31_t xfract, yfract; /* X, Y fractional parts */
emilmont 1:fdd22bb7aa52 7182 int32_t rI, cI; /* Row and column indices */
emilmont 1:fdd22bb7aa52 7183 q15_t *pYData = S->pData; /* pointer to output table values */
emilmont 1:fdd22bb7aa52 7184 uint32_t nCols = S->numCols; /* num of rows */
emilmont 1:fdd22bb7aa52 7185
emilmont 1:fdd22bb7aa52 7186 /* Input is in 12.20 format */
emilmont 1:fdd22bb7aa52 7187 /* 12 bits for the table index */
emilmont 1:fdd22bb7aa52 7188 /* Index value calculation */
emilmont 1:fdd22bb7aa52 7189 rI = ((X & 0xFFF00000) >> 20);
emilmont 1:fdd22bb7aa52 7190
emilmont 1:fdd22bb7aa52 7191 /* Input is in 12.20 format */
emilmont 1:fdd22bb7aa52 7192 /* 12 bits for the table index */
emilmont 1:fdd22bb7aa52 7193 /* Index value calculation */
emilmont 1:fdd22bb7aa52 7194 cI = ((Y & 0xFFF00000) >> 20);
emilmont 1:fdd22bb7aa52 7195
emilmont 1:fdd22bb7aa52 7196 /* Care taken for table outside boundary */
emilmont 1:fdd22bb7aa52 7197 /* Returns zero output when values are outside table boundary */
emilmont 1:fdd22bb7aa52 7198 if(rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1))
emilmont 1:fdd22bb7aa52 7199 {
emilmont 1:fdd22bb7aa52 7200 return (0);
emilmont 1:fdd22bb7aa52 7201 }
emilmont 1:fdd22bb7aa52 7202
emilmont 1:fdd22bb7aa52 7203 /* 20 bits for the fractional part */
emilmont 1:fdd22bb7aa52 7204 /* xfract should be in 12.20 format */
emilmont 1:fdd22bb7aa52 7205 xfract = (X & 0x000FFFFF);
emilmont 1:fdd22bb7aa52 7206
emilmont 1:fdd22bb7aa52 7207 /* Read two nearest output values from the index */
emilmont 1:fdd22bb7aa52 7208 x1 = pYData[(rI) + nCols * (cI)];
emilmont 1:fdd22bb7aa52 7209 x2 = pYData[(rI) + nCols * (cI) + 1u];
emilmont 1:fdd22bb7aa52 7210
emilmont 1:fdd22bb7aa52 7211
emilmont 1:fdd22bb7aa52 7212 /* 20 bits for the fractional part */
emilmont 1:fdd22bb7aa52 7213 /* yfract should be in 12.20 format */
emilmont 1:fdd22bb7aa52 7214 yfract = (Y & 0x000FFFFF);
emilmont 1:fdd22bb7aa52 7215
emilmont 1:fdd22bb7aa52 7216 /* Read two nearest output values from the index */
emilmont 1:fdd22bb7aa52 7217 y1 = pYData[(rI) + nCols * (cI + 1)];
emilmont 1:fdd22bb7aa52 7218 y2 = pYData[(rI) + nCols * (cI + 1) + 1u];
emilmont 1:fdd22bb7aa52 7219
emilmont 1:fdd22bb7aa52 7220 /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 13.51 format */
emilmont 1:fdd22bb7aa52 7221
emilmont 1:fdd22bb7aa52 7222 /* x1 is in 1.15(q15), xfract in 12.20 format and out is in 13.35 format */
emilmont 1:fdd22bb7aa52 7223 /* convert 13.35 to 13.31 by right shifting and out is in 1.31 */
emilmont 1:fdd22bb7aa52 7224 out = (q31_t) (((q63_t) x1 * (0xFFFFF - xfract)) >> 4u);
emilmont 1:fdd22bb7aa52 7225 acc = ((q63_t) out * (0xFFFFF - yfract));
emilmont 1:fdd22bb7aa52 7226
emilmont 1:fdd22bb7aa52 7227 /* x2 * (xfract) * (1-yfract) in 1.51 and adding to acc */
emilmont 1:fdd22bb7aa52 7228 out = (q31_t) (((q63_t) x2 * (0xFFFFF - yfract)) >> 4u);
emilmont 1:fdd22bb7aa52 7229 acc += ((q63_t) out * (xfract));
emilmont 1:fdd22bb7aa52 7230
emilmont 1:fdd22bb7aa52 7231 /* y1 * (1 - xfract) * (yfract) in 1.51 and adding to acc */
emilmont 1:fdd22bb7aa52 7232 out = (q31_t) (((q63_t) y1 * (0xFFFFF - xfract)) >> 4u);
emilmont 1:fdd22bb7aa52 7233 acc += ((q63_t) out * (yfract));
emilmont 1:fdd22bb7aa52 7234
emilmont 1:fdd22bb7aa52 7235 /* y2 * (xfract) * (yfract) in 1.51 and adding to acc */
emilmont 1:fdd22bb7aa52 7236 out = (q31_t) (((q63_t) y2 * (xfract)) >> 4u);
emilmont 1:fdd22bb7aa52 7237 acc += ((q63_t) out * (yfract));
emilmont 1:fdd22bb7aa52 7238
emilmont 1:fdd22bb7aa52 7239 /* acc is in 13.51 format and down shift acc by 36 times */
emilmont 1:fdd22bb7aa52 7240 /* Convert out to 1.15 format */
emilmont 1:fdd22bb7aa52 7241 return (acc >> 36);
emilmont 1:fdd22bb7aa52 7242
emilmont 1:fdd22bb7aa52 7243 }
emilmont 1:fdd22bb7aa52 7244
emilmont 1:fdd22bb7aa52 7245 /**
emilmont 1:fdd22bb7aa52 7246 * @brief Q7 bilinear interpolation.
emilmont 1:fdd22bb7aa52 7247 * @param[in,out] *S points to an instance of the interpolation structure.
emilmont 1:fdd22bb7aa52 7248 * @param[in] X interpolation coordinate in 12.20 format.
emilmont 1:fdd22bb7aa52 7249 * @param[in] Y interpolation coordinate in 12.20 format.
emilmont 1:fdd22bb7aa52 7250 * @return out interpolated value.
emilmont 1:fdd22bb7aa52 7251 */
emilmont 1:fdd22bb7aa52 7252
mbed_official 3:7a284390b0ce 7253 static __INLINE q7_t arm_bilinear_interp_q7(
emilmont 1:fdd22bb7aa52 7254 arm_bilinear_interp_instance_q7 * S,
emilmont 1:fdd22bb7aa52 7255 q31_t X,
emilmont 1:fdd22bb7aa52 7256 q31_t Y)
emilmont 1:fdd22bb7aa52 7257 {
emilmont 1:fdd22bb7aa52 7258 q63_t acc = 0; /* output */
emilmont 1:fdd22bb7aa52 7259 q31_t out; /* Temporary output */
emilmont 1:fdd22bb7aa52 7260 q31_t xfract, yfract; /* X, Y fractional parts */
emilmont 1:fdd22bb7aa52 7261 q7_t x1, x2, y1, y2; /* Nearest output values */
emilmont 1:fdd22bb7aa52 7262 int32_t rI, cI; /* Row and column indices */
emilmont 1:fdd22bb7aa52 7263 q7_t *pYData = S->pData; /* pointer to output table values */
emilmont 1:fdd22bb7aa52 7264 uint32_t nCols = S->numCols; /* num of rows */
emilmont 1:fdd22bb7aa52 7265
emilmont 1:fdd22bb7aa52 7266 /* Input is in 12.20 format */
emilmont 1:fdd22bb7aa52 7267 /* 12 bits for the table index */
emilmont 1:fdd22bb7aa52 7268 /* Index value calculation */
emilmont 1:fdd22bb7aa52 7269 rI = ((X & 0xFFF00000) >> 20);
emilmont 1:fdd22bb7aa52 7270
emilmont 1:fdd22bb7aa52 7271 /* Input is in 12.20 format */
emilmont 1:fdd22bb7aa52 7272 /* 12 bits for the table index */
emilmont 1:fdd22bb7aa52 7273 /* Index value calculation */
emilmont 1:fdd22bb7aa52 7274 cI = ((Y & 0xFFF00000) >> 20);
emilmont 1:fdd22bb7aa52 7275
emilmont 1:fdd22bb7aa52 7276 /* Care taken for table outside boundary */
emilmont 1:fdd22bb7aa52 7277 /* Returns zero output when values are outside table boundary */
emilmont 1:fdd22bb7aa52 7278 if(rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1))
emilmont 1:fdd22bb7aa52 7279 {
emilmont 1:fdd22bb7aa52 7280 return (0);
emilmont 1:fdd22bb7aa52 7281 }
emilmont 1:fdd22bb7aa52 7282
emilmont 1:fdd22bb7aa52 7283 /* 20 bits for the fractional part */
emilmont 1:fdd22bb7aa52 7284 /* xfract should be in 12.20 format */
emilmont 1:fdd22bb7aa52 7285 xfract = (X & 0x000FFFFF);
emilmont 1:fdd22bb7aa52 7286
emilmont 1:fdd22bb7aa52 7287 /* Read two nearest output values from the index */
emilmont 1:fdd22bb7aa52 7288 x1 = pYData[(rI) + nCols * (cI)];
emilmont 1:fdd22bb7aa52 7289 x2 = pYData[(rI) + nCols * (cI) + 1u];
emilmont 1:fdd22bb7aa52 7290
emilmont 1:fdd22bb7aa52 7291
emilmont 1:fdd22bb7aa52 7292 /* 20 bits for the fractional part */
emilmont 1:fdd22bb7aa52 7293 /* yfract should be in 12.20 format */
emilmont 1:fdd22bb7aa52 7294 yfract = (Y & 0x000FFFFF);
emilmont 1:fdd22bb7aa52 7295
emilmont 1:fdd22bb7aa52 7296 /* Read two nearest output values from the index */
emilmont 1:fdd22bb7aa52 7297 y1 = pYData[(rI) + nCols * (cI + 1)];
emilmont 1:fdd22bb7aa52 7298 y2 = pYData[(rI) + nCols * (cI + 1) + 1u];
emilmont 1:fdd22bb7aa52 7299
emilmont 1:fdd22bb7aa52 7300 /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 16.47 format */
emilmont 1:fdd22bb7aa52 7301 out = ((x1 * (0xFFFFF - xfract)));
emilmont 1:fdd22bb7aa52 7302 acc = (((q63_t) out * (0xFFFFF - yfract)));
emilmont 1:fdd22bb7aa52 7303
emilmont 1:fdd22bb7aa52 7304 /* x2 * (xfract) * (1-yfract) in 2.22 and adding to acc */
emilmont 1:fdd22bb7aa52 7305 out = ((x2 * (0xFFFFF - yfract)));
emilmont 1:fdd22bb7aa52 7306 acc += (((q63_t) out * (xfract)));
emilmont 1:fdd22bb7aa52 7307
emilmont 1:fdd22bb7aa52 7308 /* y1 * (1 - xfract) * (yfract) in 2.22 and adding to acc */
emilmont 1:fdd22bb7aa52 7309 out = ((y1 * (0xFFFFF - xfract)));
emilmont 1:fdd22bb7aa52 7310 acc += (((q63_t) out * (yfract)));
emilmont 1:fdd22bb7aa52 7311
emilmont 1:fdd22bb7aa52 7312 /* y2 * (xfract) * (yfract) in 2.22 and adding to acc */
emilmont 1:fdd22bb7aa52 7313 out = ((y2 * (yfract)));
emilmont 1:fdd22bb7aa52 7314 acc += (((q63_t) out * (xfract)));
emilmont 1:fdd22bb7aa52 7315
emilmont 1:fdd22bb7aa52 7316 /* acc in 16.47 format and down shift by 40 to convert to 1.7 format */
emilmont 1:fdd22bb7aa52 7317 return (acc >> 40);
emilmont 1:fdd22bb7aa52 7318
emilmont 1:fdd22bb7aa52 7319 }
emilmont 1:fdd22bb7aa52 7320
emilmont 1:fdd22bb7aa52 7321 /**
emilmont 1:fdd22bb7aa52 7322 * @} end of BilinearInterpolate group
emilmont 1:fdd22bb7aa52 7323 */
emilmont 1:fdd22bb7aa52 7324
emilmont 1:fdd22bb7aa52 7325
mbed_official 3:7a284390b0ce 7326 #if defined ( __CC_ARM ) //Keil
mbed_official 3:7a284390b0ce 7327 //SMMLAR
mbed_official 3:7a284390b0ce 7328 #define multAcc_32x32_keep32_R(a, x, y) \
mbed_official 3:7a284390b0ce 7329 a = (q31_t) (((((q63_t) a) << 32) + ((q63_t) x * y) + 0x80000000LL ) >> 32)
mbed_official 3:7a284390b0ce 7330
mbed_official 3:7a284390b0ce 7331 //SMMLSR
mbed_official 3:7a284390b0ce 7332 #define multSub_32x32_keep32_R(a, x, y) \
mbed_official 3:7a284390b0ce 7333 a = (q31_t) (((((q63_t) a) << 32) - ((q63_t) x * y) + 0x80000000LL ) >> 32)
mbed_official 3:7a284390b0ce 7334
mbed_official 3:7a284390b0ce 7335 //SMMULR
mbed_official 3:7a284390b0ce 7336 #define mult_32x32_keep32_R(a, x, y) \
mbed_official 3:7a284390b0ce 7337 a = (q31_t) (((q63_t) x * y + 0x80000000LL ) >> 32)
mbed_official 3:7a284390b0ce 7338
mbed_official 3:7a284390b0ce 7339 //Enter low optimization region - place directly above function definition
mbed_official 3:7a284390b0ce 7340 #define LOW_OPTIMIZATION_ENTER \
mbed_official 3:7a284390b0ce 7341 _Pragma ("push") \
mbed_official 3:7a284390b0ce 7342 _Pragma ("O1")
mbed_official 3:7a284390b0ce 7343
mbed_official 3:7a284390b0ce 7344 //Exit low optimization region - place directly after end of function definition
mbed_official 3:7a284390b0ce 7345 #define LOW_OPTIMIZATION_EXIT \
mbed_official 3:7a284390b0ce 7346 _Pragma ("pop")
mbed_official 3:7a284390b0ce 7347
mbed_official 3:7a284390b0ce 7348 //Enter low optimization region - place directly above function definition
mbed_official 3:7a284390b0ce 7349 #define IAR_ONLY_LOW_OPTIMIZATION_ENTER
mbed_official 3:7a284390b0ce 7350
mbed_official 3:7a284390b0ce 7351 //Exit low optimization region - place directly after end of function definition
mbed_official 3:7a284390b0ce 7352 #define IAR_ONLY_LOW_OPTIMIZATION_EXIT
mbed_official 3:7a284390b0ce 7353
mbed_official 3:7a284390b0ce 7354 #elif defined(__ICCARM__) //IAR
mbed_official 3:7a284390b0ce 7355 //SMMLA
mbed_official 3:7a284390b0ce 7356 #define multAcc_32x32_keep32_R(a, x, y) \
mbed_official 3:7a284390b0ce 7357 a += (q31_t) (((q63_t) x * y) >> 32)
mbed_official 3:7a284390b0ce 7358
mbed_official 3:7a284390b0ce 7359 //SMMLS
mbed_official 3:7a284390b0ce 7360 #define multSub_32x32_keep32_R(a, x, y) \
mbed_official 3:7a284390b0ce 7361 a -= (q31_t) (((q63_t) x * y) >> 32)
mbed_official 3:7a284390b0ce 7362
mbed_official 3:7a284390b0ce 7363 //SMMUL
mbed_official 3:7a284390b0ce 7364 #define mult_32x32_keep32_R(a, x, y) \
mbed_official 3:7a284390b0ce 7365 a = (q31_t) (((q63_t) x * y ) >> 32)
mbed_official 3:7a284390b0ce 7366
mbed_official 3:7a284390b0ce 7367 //Enter low optimization region - place directly above function definition
mbed_official 3:7a284390b0ce 7368 #define LOW_OPTIMIZATION_ENTER \
mbed_official 3:7a284390b0ce 7369 _Pragma ("optimize=low")
mbed_official 3:7a284390b0ce 7370
mbed_official 3:7a284390b0ce 7371 //Exit low optimization region - place directly after end of function definition
mbed_official 3:7a284390b0ce 7372 #define LOW_OPTIMIZATION_EXIT
mbed_official 3:7a284390b0ce 7373
mbed_official 3:7a284390b0ce 7374 //Enter low optimization region - place directly above function definition
mbed_official 3:7a284390b0ce 7375 #define IAR_ONLY_LOW_OPTIMIZATION_ENTER \
mbed_official 3:7a284390b0ce 7376 _Pragma ("optimize=low")
mbed_official 3:7a284390b0ce 7377
mbed_official 3:7a284390b0ce 7378 //Exit low optimization region - place directly after end of function definition
mbed_official 3:7a284390b0ce 7379 #define IAR_ONLY_LOW_OPTIMIZATION_EXIT
mbed_official 3:7a284390b0ce 7380
mbed_official 3:7a284390b0ce 7381 #elif defined(__GNUC__)
mbed_official 3:7a284390b0ce 7382 //SMMLA
mbed_official 3:7a284390b0ce 7383 #define multAcc_32x32_keep32_R(a, x, y) \
mbed_official 3:7a284390b0ce 7384 a += (q31_t) (((q63_t) x * y) >> 32)
mbed_official 3:7a284390b0ce 7385
mbed_official 3:7a284390b0ce 7386 //SMMLS
mbed_official 3:7a284390b0ce 7387 #define multSub_32x32_keep32_R(a, x, y) \
mbed_official 3:7a284390b0ce 7388 a -= (q31_t) (((q63_t) x * y) >> 32)
mbed_official 3:7a284390b0ce 7389
mbed_official 3:7a284390b0ce 7390 //SMMUL
mbed_official 3:7a284390b0ce 7391 #define mult_32x32_keep32_R(a, x, y) \
mbed_official 3:7a284390b0ce 7392 a = (q31_t) (((q63_t) x * y ) >> 32)
mbed_official 3:7a284390b0ce 7393
mbed_official 3:7a284390b0ce 7394 #define LOW_OPTIMIZATION_ENTER __attribute__(( optimize("-O1") ))
mbed_official 3:7a284390b0ce 7395
mbed_official 3:7a284390b0ce 7396 #define LOW_OPTIMIZATION_EXIT
mbed_official 3:7a284390b0ce 7397
mbed_official 3:7a284390b0ce 7398 #define IAR_ONLY_LOW_OPTIMIZATION_ENTER
mbed_official 3:7a284390b0ce 7399
mbed_official 3:7a284390b0ce 7400 #define IAR_ONLY_LOW_OPTIMIZATION_EXIT
mbed_official 3:7a284390b0ce 7401
1050186 5:a912b042151f 7402 #elif defined(__CSMC__) // Cosmic
1050186 5:a912b042151f 7403 //SMMLA
1050186 5:a912b042151f 7404 #define multAcc_32x32_keep32_R(a, x, y) \
1050186 5:a912b042151f 7405 a += (q31_t) (((q63_t) x * y) >> 32)
1050186 5:a912b042151f 7406
1050186 5:a912b042151f 7407 //SMMLS
1050186 5:a912b042151f 7408 #define multSub_32x32_keep32_R(a, x, y) \
1050186 5:a912b042151f 7409 a -= (q31_t) (((q63_t) x * y) >> 32)
1050186 5:a912b042151f 7410
1050186 5:a912b042151f 7411 //SMMUL
1050186 5:a912b042151f 7412 #define mult_32x32_keep32_R(a, x, y) \
1050186 5:a912b042151f 7413 a = (q31_t) (((q63_t) x * y ) >> 32)
1050186 5:a912b042151f 7414
1050186 5:a912b042151f 7415 #define LOW_OPTIMIZATION_ENTER
1050186 5:a912b042151f 7416 #define LOW_OPTIMIZATION_EXIT
1050186 5:a912b042151f 7417 #define IAR_ONLY_LOW_OPTIMIZATION_ENTER
1050186 5:a912b042151f 7418 #define IAR_ONLY_LOW_OPTIMIZATION_EXIT
1050186 5:a912b042151f 7419
mbed_official 3:7a284390b0ce 7420 #endif
mbed_official 3:7a284390b0ce 7421
emilmont 1:fdd22bb7aa52 7422
emilmont 1:fdd22bb7aa52 7423
emilmont 1:fdd22bb7aa52 7424
emilmont 1:fdd22bb7aa52 7425
emilmont 2:da51fb522205 7426 #ifdef __cplusplus
emilmont 1:fdd22bb7aa52 7427 }
emilmont 1:fdd22bb7aa52 7428 #endif
emilmont 1:fdd22bb7aa52 7429
emilmont 1:fdd22bb7aa52 7430
emilmont 1:fdd22bb7aa52 7431 #endif /* _ARM_MATH_H */
emilmont 1:fdd22bb7aa52 7432
emilmont 1:fdd22bb7aa52 7433
emilmont 1:fdd22bb7aa52 7434 /**
emilmont 1:fdd22bb7aa52 7435 *
emilmont 1:fdd22bb7aa52 7436 * End of file.
emilmont 1:fdd22bb7aa52 7437 */