cf_t srslte_vec_dot_prod_cfc(cf_t *x, float *y, uint32_t len) { #ifdef HAVE_VOLK_DOTPROD_CFC_FUNCTION cf_t res; volk_32fc_32f_dot_prod_32fc(&res, x, y, len); return res; #else uint32_t i; cf_t res = 0; for (i=0;i<len;i++) { res += x[i]*y[i]; } return res; #endif }
/* Translate, filter and decimate signal from _buf, write it to file descriptor fd. * _buf, buflen - input signal * _carry, carrylen - buffer for filter history * _taps, tapslen - filter coefficients * decim - decimation * rotator - vector denoting phase difference of successive samples * _rotpos, rotposlen - vector denoting current rotator phase * _firpos, firposlen - (integer), starting position in filter * fd - output descriptor */ int xdump(char * _buf, size_t buflen, char * _carry, size_t carrylen, char * _taps, size_t tapslen, int decim, float rotator, char * _rotpos, size_t rotposlen, char * _firpos, size_t firposlen, int fd) { assert(rotposlen == sizeof(lv_32fc_t)); assert(firposlen == sizeof(int32_t)); int * firpos = (int*) _firpos; float * taps = (float*) _taps; int nsamples = buflen / (sizeof(float)*COMPLEX); float * alldata = malloc(sizeof(float) * COMPLEX * (buflen + carrylen)); lv_32fc_t phase_inc = lv_cmake(cos(rotator), sin(rotator)); lv_32fc_t* phase = (lv_32fc_t*) _rotpos; volk_32fc_s32fc_x2_rotator_32fc((lv_32fc_t*)alldata, // dst (lv_32fc_t*)_carry, // src phase_inc, phase, carrylen / (sizeof(float)*COMPLEX)); // params volk_32fc_s32fc_x2_rotator_32fc((lv_32fc_t*)(alldata + carrylen / sizeof(float)), // dst (lv_32fc_t*)_buf, // src phase_inc, phase, nsamples); // params int32_t i; int outsample = 0; FILE * of = fdopen(fd, "w"); if(of == NULL) { perror("fdopen"); fprintf(stderr, "Cannot open fd %i for writing\n", fd); return 0; } for(i = *firpos; i<nsamples; i+=decim) { lv_32fc_t prod; volk_32fc_32f_dot_prod_32fc(&prod, (lv_32fc_t*) (alldata+i*COMPLEX), taps, tapslen/sizeof(float)); fwrite(&prod, sizeof(lv_32fc_t), 1, of); outsample++; } *firpos = i - nsamples; free(alldata); //fclose(of); return 0; }
void process(aligned_vector<complex_type>::const_iterator i0, aligned_vector<complex_type>::const_iterator i1, int output_offset) { assert(std::distance(i0,i1) == q()); for (int i=0, n=p()*q(); i<n; ++i) { const int i_mod_p(i%p()); const int i_mod_q(i%q()); if (!i_mod_p) { history_[counter_] = history_[counter_+ql()] = *i0++; counter_ = ((1+counter_) % ql()); } if (!i_mod_q) { volk_32fc_32f_dot_prod_32fc(&out_[output_offset + i/q()], &history_[counter_], &b_[i_mod_p*ql()], ql()); } } }