(
&mut self,
input: &[Complex32],
out: &mut [Complex32],
tags: &mut Tags,
nitems_to_process: usize,
)
| 756 | } |
| 757 | |
| 758 | fn sync( |
| 759 | &mut self, |
| 760 | input: &[Complex32], |
| 761 | out: &mut [Complex32], |
| 762 | tags: &mut Tags, |
| 763 | nitems_to_process: usize, |
| 764 | ) -> (isize, usize) { |
| 765 | let mut items_to_output = 0; |
| 766 | if !self.cfo_frac_sto_frac_est { |
| 767 | let (preamble_upchirps_tmp, cfo_frac_tmp) = self.estimate_cfo_frac_bernier( |
| 768 | &self.preamble_raw[(self.m_number_of_bins - self.k_hat)..], |
| 769 | ); |
| 770 | self.preamble_upchirps = preamble_upchirps_tmp; |
| 771 | self.m_cfo_frac = cfo_frac_tmp; |
| 772 | self.m_sto_frac = self.estimate_sto_frac(); |
| 773 | // create correction vector |
| 774 | self.cfo_frac_correc = (0..self.m_number_of_bins) |
| 775 | .map(|x| { |
| 776 | Complex32::from_polar( |
| 777 | 1., |
| 778 | -2. * PI * self.m_cfo_frac as f32 / self.m_number_of_bins as f32 * x as f32, |
| 779 | ) |
| 780 | }) |
| 781 | .collect(); |
| 782 | self.cfo_frac_sto_frac_est = true; |
| 783 | } |
| 784 | let mut items_to_consume = self.m_samples_per_symbol as isize; |
| 785 | // apply cfo correction |
| 786 | let symb_corr = volk_32fc_x2_multiply_32fc(&self.in_down, &self.cfo_frac_correc); |
| 787 | |
| 788 | self.bin_idx = get_symbol_val( |
| 789 | &symb_corr, |
| 790 | &self.m_downchirp, |
| 791 | &self.fft_forward_number_of_bins, |
| 792 | ); |
| 793 | match self.symbol_cnt { |
| 794 | SyncState::NetId1 => { |
| 795 | if self.bin_idx.is_some() |
| 796 | && (self.bin_idx.unwrap() == 0 |
| 797 | || self.bin_idx.unwrap() == 1 |
| 798 | || self.bin_idx.unwrap() == self.m_number_of_bins - 1) |
| 799 | { |
| 800 | // look for additional upchirps. Won't work if network identifier 1 equals 2^sf-1, 0 or 1! |
| 801 | let input_offset = (0.75 * self.m_samples_per_symbol as f32) as usize; |
| 802 | let count = self.m_samples_per_symbol / 4; |
| 803 | self.net_id_samp[0..count] |
| 804 | .copy_from_slice(&input[input_offset..(input_offset + count)]); |
| 805 | if self.additional_upchirps >= 3 { |
| 806 | self.preamble_raw_up.rotate_left(self.m_samples_per_symbol); |
| 807 | let preamble_raw_up_offset = |
| 808 | self.m_samples_per_symbol * (Into::<usize>::into(self.m_n_up_req) + 3); |
| 809 | let input_offset = self.m_os_factor / 2 + self.k_hat * self.m_os_factor; |
| 810 | let count = self.m_samples_per_symbol; |
| 811 | self.preamble_raw_up |
| 812 | [preamble_raw_up_offset..(preamble_raw_up_offset + count)] |
| 813 | .copy_from_slice(&input[input_offset..(input_offset + count)]); |
| 814 | } else { |
| 815 | let preamble_raw_up_offset = self.m_samples_per_symbol |
no test coverage detected