int
autocorrelate_impl::general_work (int output_matrices,
gr_vector_int &ninput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items)
{
// Cast pointer
gr_complex *out = (gr_complex *) output_items[0];
// Create each output matrix
for (int i=0; i<output_matrices; i++)
{
// Form input matrix
for(int k=0; k<d_num_inputs; k++)
{
memcpy((void*)d_input_matrix.col(k).data(),
((gr_complex*)input_items[k]+i*d_nonoverlap_size),
sizeof(gr_complex)*d_snapshot_size);
}
// Make output pointer into matrix pointer
Eigen::Map<Eigen::MatrixXcf> out_matrix(out+d_num_inputs*d_num_inputs*i,d_num_inputs,d_num_inputs);
// Do autocorrelation
out_matrix = (1.0/d_snapshot_size)*d_input_matrix.transpose()*d_input_matrix.conjugate();
if (d_avg_method == 1)
out_matrix = 0.5*out_matrix+(0.5/d_snapshot_size)*d_J*out_matrix.conjugate()*d_J;
}
// Tell runtime system how many input items we consumed on
// each input stream.
consume_each (d_nonoverlap_size*output_matrices+d_overlap_size);
// Tell runtime system how many output items we produced.
return (output_matrices);
}