|
From: | Marcin Wachowiak |
Subject: | Re: Block with overlapping window - consume_each() in regard to set_history() |
Date: | Sat, 19 Dec 2020 14:14:24 +0100 |
Hello,I am having a hard time trying to correct a block that calculates autocorrelation with overlapping.Having read about set_history(), consume_each() behaviour of the block does not match my size calculations.
- Should consume_each include the N-samples that are stored in history or not? (I guess history samples indices are calculated based on what is provided in consume_each())
The code of the block is as follows:...//setting parameters in constructor:d_nonoverlap_size = d_snapshot_size-d_overlap_size;set_history(d_overlap_size+1);//determine input/output buffer sizes relationship (in connected blocks)set_relative_rate(1.0/d_nonoverlap_size);...Then there is forecast:...// Setup input output relationshipfor (int i=0; i<ninput_items_required.size(); i++)ninput_items_required[i] = d_nonoverlap_size*noutput_items;...And general work:intautocorrelate_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 pointergr_complex *out = (gr_complex *) output_items[0];// Create each output matrixfor (int i=0; i<output_matrices; i++){// Form input matrixfor(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 pointerEigen::Map<Eigen::MatrixXcf> out_matrix(out+d_num_inputs*d_num_inputs*i,d_num_inputs,d_num_inputs);// Do autocorrelationout_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);}When the block is simulated in comparison to no (0) overlap it returns strange values probably due to sizing issues, some historical samples distort the result.Whole code and more complex test case(music_algo_simulation_2rx_with_noise.grc) is available here: https://github.com/MarcinWachowiak/GNU-Radio-USRP-BeamformingPlease advise.Kind regards,Marcin Wachowiak
[Prev in Thread] | Current Thread | [Next in Thread] |