CMSIS-DSP  Verison 1.1.0
CMSIS DSP Software Library
arm_convolution_example_f32.c
/* ---------------------------------------------------------------------- 
* Copyright (C) 2010 ARM Limited. All rights reserved.   
*  
* $Date:        29. November 2010  
* $Revision:    V1.0.3 
*  
* Project:          CMSIS DSP Library  
* Title:            arm_convolution_example_f32.c                 
*  
* Description:  Example code demonstrating Convolution of two input signals using fft. 
* 
* Target Processor: Cortex-M4/Cortex-M3  
*
*
* Version 1.0.3 2010/11/29 
*    Re-organized the CMSIS folders and updated documentation. 
* 
* Version 1.0.1 2010/10/05 KK 
*    Production release and review comments incorporated.  
*
* Version 1.0.0 2010/09/20 KK
*    Production release and review comments incorporated.
* ------------------------------------------------------------------- */ 
 
#include "arm_math.h" 
#include "math_helper.h"                                 
 
/* ---------------------------------------------------------------------- 
* Defines each of the tests performed 
* ------------------------------------------------------------------- */ 
#define MAX_BLOCKSIZE   128 
#define DELTA           (0.000001f) 
#define SNR_THRESHOLD   90 
 
/* ---------------------------------------------------------------------- 
* Declare I/O buffers  
* ------------------------------------------------------------------- */ 
float32_t Ak[MAX_BLOCKSIZE];            /* Input A */ 
float32_t Bk[MAX_BLOCKSIZE];            /* Input B */ 
float32_t AxB[MAX_BLOCKSIZE * 2];       /* Output */ 
 
/* ---------------------------------------------------------------------- 
* Test input data for Floating point Convolution example for 32-blockSize 
* Generated by the MATLAB randn() function 
* ------------------------------------------------------------------- */ 
float32_t testInputA_f32[64] =  
{  
-0.808920,      1.357369,       1.180861,       -0.504544,      1.762637,       -0.703285,       
1.696966,       0.620571,       -0.151093,      -0.100235,      -0.872382,      -0.403579,       
-0.860749,      -0.382648,      -1.052338,      0.128113,       -0.646269,      1.093377,        
-2.209198,      0.471706,       0.408901,       1.266242,       0.598252,       1.176827,        
-0.203421,      0.213596,       -0.851964,      -0.466958,      0.021841,       -0.698938,       
-0.604107,      0.461778,       -0.318219,      0.942520,       0.577585,       0.417619,        
0.614665,       0.563679,       -1.295073,      -0.764437,      0.952194,       -0.859222,       
-0.618554,      -2.268542,      -1.210592,      1.655853,       -2.627219,      -0.994249,       
-1.374704,      0.343799,       0.025619,       1.227481,       -0.708031,      0.069355,        
-1.845228,      -1.570886,      1.010668,       -1.802084,      1.630088,       1.286090,        
-0.161050,      -0.940794,      0.367961,       0.291907 
                 
};  
  
float32_t testInputB_f32[64] =  
{  
0.933724,       0.046881,       1.316470,       0.438345,       0.332682,       2.094885,        
0.512081,       0.035546,       0.050894,       -2.320371,      0.168711,       -1.830493,       
-0.444834,      -1.003242,      -0.531494,      -1.365600,      -0.155420,      -0.757692,       
-0.431880,      -0.380021,      0.096243,       -0.695835,      0.558850,       -1.648962,       
0.020369,       -0.363630,      0.887146,       0.845503,       -0.252864,      -0.330397,       
1.269131,       -1.109295,      -1.027876,      0.135940,       0.116721,       -0.293399,       
-1.349799,      0.166078,       -0.802201,      0.369367,       -0.964568,      -2.266011,       
0.465178,       0.651222,       -0.325426,      0.320245,       -0.784178,      -0.579456,       
0.093374,       0.604778,       -0.048225,      0.376297,       -0.394412,      0.578182,        
-1.218141,      -1.387326,      0.692462,       -0.631297,      0.153137,       -0.638952,       
0.635474,       -0.970468,      1.334057,       -0.111370 
};  
  
const float testRefOutput_f32[126] =   
{  
-0.818943,      1.229484,       -0.533664,      1.016604,       0.341875,       -1.963656,       
5.171476,       3.478033,       7.616361,       6.648384,       0.479069,       1.792012,        
-1.295591,      -7.447818,      0.315830,       -10.657445,     -2.483469,      -6.524236,       
-7.380591,      -3.739005,      -8.388957,      0.184147,       -1.554888,      3.786508,        
-1.684421,      5.400610,       -1.578126,      7.403361,       8.315999,       2.080267,        
11.077776,      2.749673,       7.138962,       2.748762,       0.660363,       0.981552,        
1.442275,       0.552721,       -2.576892,      4.703989,       0.989156,       8.759344,        
-0.564825,      -3.994680,      0.954710,       -5.014144,      6.592329,       1.599488,        
-13.979146,     -0.391891,      -4.453369,      -2.311242,      -2.948764,      1.761415,        
-0.138322,      10.433007,      -2.309103,      4.297153,       8.535523,       3.209462,        
8.695819,       5.569919,       2.514304,       5.582029,       2.060199,       0.642280,        
7.024616,       1.686615,       -6.481756,      1.343084,       -3.526451,      1.099073,        
-2.965764,      -0.173723,      -4.111484,      6.528384,       -6.965658,      1.726291,        
1.535172,       11.023435,      2.338401,       -4.690188,      1.298210,       3.943885,        
8.407885,       5.168365,       0.684131,       1.559181,       1.859998,       2.852417,        
8.574070,       -6.369078,      6.023458,       11.837963,      -6.027632,      4.469678,        
-6.799093,      -2.674048,      6.250367,       -6.809971,      -3.459360,      9.112410,        
-2.711621,      -1.336678,      1.564249,       -1.564297,      -1.296760,      8.904013,        
-3.230109,      6.878013,       -7.819823,      3.369909,       -1.657410,      -2.007358,       
-4.112825,      1.370685,       -3.420525,      -6.276605,      3.244873,       -3.352638,       
1.545372,       0.902211,       0.197489,       -1.408732,      0.523390,       0.348440 
}; 
 
 
/* ---------------------------------------------------------------------- 
* Declare Global variables  
* ------------------------------------------------------------------- */ 
uint32_t srcALen = 64;   /* Length of Input A */ 
uint32_t srcBLen = 64;   /* Length of Input B */ 
uint32_t outLen;                 /* Length of convolution output */ 
float32_t snr;                   /* output SNR */ 
 
int32_t main(void) 
{ 
        arm_status status;         /* Status of the example */ 
        arm_cfft_radix4_instance_f32 cfft_instance;     /* CFFT Structure instance */ 
 
        /* CFFT Structure instance pointer */ 
    arm_cfft_radix4_instance_f32 *cfft_instance_ptr =  
                        (arm_cfft_radix4_instance_f32*) &cfft_instance; 
 
        /* output length of convolution */ 
        outLen = srcALen + srcBLen - 1; 
 
        /* Initialise the fft input buffers with all zeros */ 
        arm_fill_f32(0.0,  Ak, MAX_BLOCKSIZE); 
        arm_fill_f32(0.0,  Bk, MAX_BLOCKSIZE); 
 
        /* Copy the input values to the fft input buffers */ 
        arm_copy_f32(testInputA_f32,  Ak, MAX_BLOCKSIZE/2); 
        arm_copy_f32(testInputB_f32,  Bk, MAX_BLOCKSIZE/2); 
         
        /* Initialize the CFFT function to compute 64 point fft */  
    status = arm_cfft_radix4_init_f32(cfft_instance_ptr, 64, 0, 1); 
 
        /* Transform input a[n] from time domain to frequency domain A[k] */ 
        arm_cfft_radix4_f32(cfft_instance_ptr, Ak); 
        /* Transform input b[n] from time domain to frequency domain B[k] */ 
        arm_cfft_radix4_f32(cfft_instance_ptr, Bk); 
         
        /* Complex Multiplication of the two input buffers in frequency domain */ 
        arm_cmplx_mult_cmplx_f32(Ak, Bk, AxB, MAX_BLOCKSIZE/2);  
 
    /* Initialize the CIFFT function to compute 64 point ifft */  
        status = arm_cfft_radix4_init_f32(cfft_instance_ptr, 64, 1, 1); 
 
        /* Transform the multiplication output from frequency domain to time domain, 
           that gives the convolved output  */ 
        arm_cfft_radix4_f32(cfft_instance_ptr, AxB); 
 
        /* SNR Calculation */ 
        snr = arm_snr_f32((float32_t *)testRefOutput_f32, AxB, srcALen + srcBLen - 1); 
         
        /* Compare the SNR with threshold to test whether the  
           computed output is matched with the reference output values. */ 
        if( snr > SNR_THRESHOLD) 
        { 
                status = ARM_MATH_SUCCESS; 
        } 
                 
        if( status != ARM_MATH_SUCCESS) 
        { 
          while(1); 
        } 

    while(1);                             /* main function does not return */
}