CMSIS DSP Software Library: arm_convolution_example_f32.c Source File
Main Page
Modules
Data Structures
Files
Examples
File List
Globals
arm_convolution_example_f32.c
Go to the documentation of this file.00001 /* ----------------------------------------------------------------------
00002 * Copyright (C) 2010 ARM Limited. All rights reserved.
00003 *
00004 * $Date: 29. November 2010
00005 * $Revision: V1.0.3
00006 *
00007 * Project: CMSIS DSP Library
00008 * Title: arm_convolution_example_f32.c
00009 *
00010 * Description: Example code demonstrating Convolution of two input signals using fft.
00011 *
00012 * Target Processor: Cortex-M4/Cortex-M3
00013 *
00014 *
00015 * Version 1.0.3 2010/11/29
00016 * Re-organized the CMSIS folders and updated documentation.
00017 *
00018 * Version 1.0.1 2010/10/05 KK
00019 * Production release and review comments incorporated.
00020 *
00021 * Version 1.0.0 2010/09/20 KK
00022 * Production release and review comments incorporated.
00023 * ------------------------------------------------------------------- */
00024
00089 #include "arm_math.h"
00090 #include "math_helper.h"
00091
00092 /* ----------------------------------------------------------------------
00093 * Defines each of the tests performed
00094 * ------------------------------------------------------------------- */
00095 #define MAX_BLOCKSIZE 128
00096 #define DELTA (0.000001f)
00097 #define SNR_THRESHOLD 90
00098
00099 /* ----------------------------------------------------------------------
00100 * Declare I/O buffers
00101 * ------------------------------------------------------------------- */
00102 float32_t Ak[MAX_BLOCKSIZE]; /* Input A */
00103 float32_t Bk[MAX_BLOCKSIZE]; /* Input B */
00104 float32_t AxB[MAX_BLOCKSIZE * 2]; /* Output */
00105
00106 /* ----------------------------------------------------------------------
00107 * Test input data for Floating point Convolution example for 32-blockSize
00108 * Generated by the MATLAB randn() function
00109 * ------------------------------------------------------------------- */
00110 float32_t testInputA_f32[64] =
00111 {
00112 -0.808920, 1.357369, 1.180861, -0.504544, 1.762637, -0.703285,
00113 1.696966, 0.620571, -0.151093, -0.100235, -0.872382, -0.403579,
00114 -0.860749, -0.382648, -1.052338, 0.128113, -0.646269, 1.093377,
00115 -2.209198, 0.471706, 0.408901, 1.266242, 0.598252, 1.176827,
00116 -0.203421, 0.213596, -0.851964, -0.466958, 0.021841, -0.698938,
00117 -0.604107, 0.461778, -0.318219, 0.942520, 0.577585, 0.417619,
00118 0.614665, 0.563679, -1.295073, -0.764437, 0.952194, -0.859222,
00119 -0.618554, -2.268542, -1.210592, 1.655853, -2.627219, -0.994249,
00120 -1.374704, 0.343799, 0.025619, 1.227481, -0.708031, 0.069355,
00121 -1.845228, -1.570886, 1.010668, -1.802084, 1.630088, 1.286090,
00122 -0.161050, -0.940794, 0.367961, 0.291907
00123
00124 };
00125
00126 float32_t testInputB_f32[64] =
00127 {
00128 0.933724, 0.046881, 1.316470, 0.438345, 0.332682, 2.094885,
00129 0.512081, 0.035546, 0.050894, -2.320371, 0.168711, -1.830493,
00130 -0.444834, -1.003242, -0.531494, -1.365600, -0.155420, -0.757692,
00131 -0.431880, -0.380021, 0.096243, -0.695835, 0.558850, -1.648962,
00132 0.020369, -0.363630, 0.887146, 0.845503, -0.252864, -0.330397,
00133 1.269131, -1.109295, -1.027876, 0.135940, 0.116721, -0.293399,
00134 -1.349799, 0.166078, -0.802201, 0.369367, -0.964568, -2.266011,
00135 0.465178, 0.651222, -0.325426, 0.320245, -0.784178, -0.579456,
00136 0.093374, 0.604778, -0.048225, 0.376297, -0.394412, 0.578182,
00137 -1.218141, -1.387326, 0.692462, -0.631297, 0.153137, -0.638952,
00138 0.635474, -0.970468, 1.334057, -0.111370
00139 };
00140
00141 const float testRefOutput_f32[126] =
00142 {
00143 -0.818943, 1.229484, -0.533664, 1.016604, 0.341875, -1.963656,
00144 5.171476, 3.478033, 7.616361, 6.648384, 0.479069, 1.792012,
00145 -1.295591, -7.447818, 0.315830, -10.657445, -2.483469, -6.524236,
00146 -7.380591, -3.739005, -8.388957, 0.184147, -1.554888, 3.786508,
00147 -1.684421, 5.400610, -1.578126, 7.403361, 8.315999, 2.080267,
00148 11.077776, 2.749673, 7.138962, 2.748762, 0.660363, 0.981552,
00149 1.442275, 0.552721, -2.576892, 4.703989, 0.989156, 8.759344,
00150 -0.564825, -3.994680, 0.954710, -5.014144, 6.592329, 1.599488,
00151 -13.979146, -0.391891, -4.453369, -2.311242, -2.948764, 1.761415,
00152 -0.138322, 10.433007, -2.309103, 4.297153, 8.535523, 3.209462,
00153 8.695819, 5.569919, 2.514304, 5.582029, 2.060199, 0.642280,
00154 7.024616, 1.686615, -6.481756, 1.343084, -3.526451, 1.099073,
00155 -2.965764, -0.173723, -4.111484, 6.528384, -6.965658, 1.726291,
00156 1.535172, 11.023435, 2.338401, -4.690188, 1.298210, 3.943885,
00157 8.407885, 5.168365, 0.684131, 1.559181, 1.859998, 2.852417,
00158 8.574070, -6.369078, 6.023458, 11.837963, -6.027632, 4.469678,
00159 -6.799093, -2.674048, 6.250367, -6.809971, -3.459360, 9.112410,
00160 -2.711621, -1.336678, 1.564249, -1.564297, -1.296760, 8.904013,
00161 -3.230109, 6.878013, -7.819823, 3.369909, -1.657410, -2.007358,
00162 -4.112825, 1.370685, -3.420525, -6.276605, 3.244873, -3.352638,
00163 1.545372, 0.902211, 0.197489, -1.408732, 0.523390, 0.348440
00164 };
00165
00166
00167 /* ----------------------------------------------------------------------
00168 * Declare Global variables
00169 * ------------------------------------------------------------------- */
00170 uint32_t srcALen = 64; /* Length of Input A */
00171 uint32_t srcBLen = 64; /* Length of Input B */
00172 uint32_t outLen; /* Length of convolution output */
00173 float32_t snr; /* output SNR */
00174
00175 int32_t main(void)
00176 {
00177 arm_status status; /* Status of the example */
00178 arm_cfft_radix4_instance_f32 cfft_instance; /* CFFT Structure instance */
00179
00180 /* CFFT Structure instance pointer */
00181 arm_cfft_radix4_instance_f32 *cfft_instance_ptr =
00182 (arm_cfft_radix4_instance_f32*) &cfft_instance;
00183
00184 /* output length of convolution */
00185 outLen = srcALen + srcBLen - 1;
00186
00187 /* Initialise the fft input buffers with all zeros */
00188 arm_fill_f32(0.0, Ak, MAX_BLOCKSIZE);
00189 arm_fill_f32(0.0, Bk, MAX_BLOCKSIZE);
00190
00191 /* Copy the input values to the fft input buffers */
00192 arm_copy_f32(testInputA_f32, Ak, MAX_BLOCKSIZE/2);
00193 arm_copy_f32(testInputB_f32, Bk, MAX_BLOCKSIZE/2);
00194
00195 /* Initialize the CFFT function to compute 64 point fft */
00196 status = arm_cfft_radix4_init_f32(cfft_instance_ptr, 64, 0, 1);
00197
00198 /* Transform input a[n] from time domain to frequency domain A[k] */
00199 arm_cfft_radix4_f32(cfft_instance_ptr, Ak);
00200 /* Transform input b[n] from time domain to frequency domain B[k] */
00201 arm_cfft_radix4_f32(cfft_instance_ptr, Bk);
00202
00203 /* Complex Multiplication of the two input buffers in frequency domain */
00204 arm_cmplx_mult_cmplx_f32(Ak, Bk, AxB, MAX_BLOCKSIZE/2);
00205
00206 /* Initialize the CIFFT function to compute 64 point ifft */
00207 status = arm_cfft_radix4_init_f32(cfft_instance_ptr, 64, 1, 1);
00208
00209 /* Transform the multiplication output from frequency domain to time domain,
00210 that gives the convolved output */
00211 arm_cfft_radix4_f32(cfft_instance_ptr, AxB);
00212
00213 /* SNR Calculation */
00214 snr = arm_snr_f32((float32_t *)testRefOutput_f32, AxB, srcALen + srcBLen - 1);
00215
00216 /* Compare the SNR with threshold to test whether the
00217 computed output is matched with the reference output values. */
00218 if( snr > SNR_THRESHOLD)
00219 {
00220 status = ARM_MATH_SUCCESS;
00221 }
00222
00223 if( status != ARM_MATH_SUCCESS)
00224 {
00225 while(1);
00226 }
00227 }
00228
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines
Generated on Mon Nov 29 2010 17:19:56 for CMSIS DSP Software Library by
1.7.2
Wyszukiwarka
Podobne podstrony:
arm dotproduct example ?2? sourcearm fir example ?2? sourcearm variance example ?2? sourcearm matrix example ?2? sourcearm convolution example ?2?arm linear interp example ?2? sourcearm signal converge example ?2? sourcearm class marks example ?2? sourcearm sin cos example ?2? sourcearm sin cos example ?2? sourcearm ?t bin example ?2? sourcearm matrix example ?2?arm cmplx mag ?2? sourcearm fir interpolate ?2? sourcearm mat trans ?2? sourcearm variance example ?2?arm fir lattice ?2? sourcearm mat ?d ?2? sourcearm mat sub ?2? sourcewięcej podobnych podstron