MCPcopy Create free account
hub / github.com/FutureSDR/FutureSDR / sync

Method sync

examples/lora/src/frame_sync.rs:758–872  ·  view source on GitHub ↗
(
        &mut self,
        input: &[Complex32],
        out: &mut [Complex32],
        tags: &mut Tags,
        nitems_to_process: usize,
    )

Source from the content-addressed store, hash-verified

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

Callers 1

workMethod · 0.45

Calls 7

get_symbol_valFunction · 0.85
estimate_sto_fracMethod · 0.80
transition_stateMethod · 0.80
sync_quarter_downMethod · 0.80
mapMethod · 0.45

Tested by

no test coverage detected