sofia@0: /* sofia@0: GPU multi-rate FIR filter bank example software sofia@0: sofia@0: Oxford e-Research Centre, Oxford University sofia@0: sofia@0: Centre for Digital Music, Queen Mary, University of London. sofia@0: sofia@0: This program is free software: you can redistribute it and/or modify sofia@0: it under the terms of the GNU General Public License as published by sofia@0: the Free Software Foundation, either version 3 of the License, sofia@0: or (at your option) any later version. sofia@0: See the file COPYING included with this distribution for more information. sofia@0: */ sofia@0: sofia@0: #include sofia@0: #include sofia@0: #include sofia@0: sofia@0: #include sofia@0: #include "filters.h" sofia@0: sofia@0: //////////////////////////////////////////////////////////////////////////////// sofia@0: // Program main sofia@0: //////////////////////////////////////////////////////////////////////////////// sofia@0: sofia@0: using namespace std; sofia@0: sofia@0: sofia@0: int main( int argc, char** argv) sofia@0: { sofia@0: unsigned int N = 100; // total number of input blocks before resampling sofia@0: sofia@0: int bufb_size = B_SIZE + OFFSET; sofia@0: sofia@0: // the total input signal to loop through is sofia@0: // essentially used to check results and provide multiple sofia@0: // block iterations. sofia@0: sofia@0: float *h_in[MAX_RATES], *h_out[MAX_RATES], *h_reference[MAX_RATES]; // input and output arrays sofia@0: int out_sz[MAX_RATES]; //total output size for all filters sofia@0: sofia@0: //timing sofia@0: struct timeval t_start, t_end; sofia@0: double t_gpu = 0.0, t_mcpu = 0.0; sofia@0: sofia@0: // parameters, filter and GPU arrays structures sofia@0: // object pointers can be passed to these for C++ code sofia@0: filter_arrays farr; sofia@0: params gparams; sofia@0: gpu_arrays gpuarrays; sofia@0: int ratenumf[MAX_RATES]; sofia@0: sofia@0: // command line arguments sofia@0: cmd_args args; sofia@0: sofia@0: //deaults sofia@0: args.nrates = 3; sofia@0: args.nf = 60; sofia@0: args.insize = 1024; sofia@0: args.rconst = 0; sofia@0: args.tim=1; sofia@0: sofia@0: read_command_line(argc, argv, &args); sofia@0: sofia@0: //initialise parameters sofia@0: int nf = args.nf; sofia@0: int numrates = args.nrates; sofia@0: int rem= nf%numrates; sofia@0: sofia@0: printf("\nGPU FIR filter parameters\n------\n"); sofia@0: printf("\nTotal number of input blocks = %d\n", N); sofia@0: gparams.nfilters = nf; // not sure if this is needed sofia@0: printf("\nTotal number of filters = %d\n", gparams.nfilters); sofia@0: gparams.fsize = B_SIZE; sofia@0: printf("\nFilter size = %d\n", gparams.fsize); sofia@0: gparams.nrates = numrates; sofia@0: printf("\nNumber of sampling rates = %d\n", gparams.nrates); sofia@0: gparams.streams = 1; sofia@0: printf("\nCUDA streams flag = %d\n", gparams.streams); sofia@0: sofia@0: //dividing sampling rates equally... sofia@0: for (int i=0; i< numrates; ++i){ sofia@0: ratenumf[i] = nf/numrates; sofia@0: } sofia@0: if (rem > 0){ sofia@0: for (int i=0; i