From 80ed715f5a11411a3396e98fab7906c89884938b Mon Sep 17 00:00:00 2001 From: Matt Huszagh Date: Tue, 12 Jan 2021 16:07:04 -0800 Subject: [PATCH] shift sin/cos before demodulation product to avoid i64 --- dsp/src/lib.rs | 6 ------ src/main.rs | 16 ++++++---------- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/dsp/src/lib.rs b/dsp/src/lib.rs index 2f02601..3f090b5 100644 --- a/dsp/src/lib.rs +++ b/dsp/src/lib.rs @@ -20,12 +20,6 @@ pub fn shift_round(x: i32, shift: usize) -> i32 { (x + (1 << (shift - 1))) >> shift } -/// TODO consolidate with `shift_round`. -#[inline(always)] -pub fn shift_round64(x: i64, shift: usize) -> i64 { - (x + (1 << (shift - 1))) >> shift -} - /// Integer division, round up half. /// /// # Arguments diff --git a/src/main.rs b/src/main.rs index 3d484d8..22fe534 100644 --- a/src/main.rs +++ b/src/main.rs @@ -101,7 +101,7 @@ use dac::{Dac0Output, Dac1Output}; use dsp::{ divide_round, iir, iir_int, pll::PLL, - shift_round, shift_round64, + shift_round, trig::{atan2, cossin}, }; use pounder::DdsOutput; @@ -1088,15 +1088,11 @@ const APP: () = { let mut signal = (0_i32, 0_i32); - // TODO should we shift cos/sin first to avoid i64? - signal.0 = shift_round64( - adc_samples[0][i] as i16 as i64 * cos as i64, - 16, - ) as i32; - signal.1 = shift_round64( - adc_samples[0][i] as i16 as i64 * sin as i64, - 16, - ) as i32; + // shift cos/sin before multiplying to avoid i64 multiplication + signal.0 = + adc_samples[0][i] as i16 as i32 * shift_round(cos, 16); + signal.0 = + adc_samples[0][i] as i16 as i32 * shift_round(sin, 16); signal.0 = iir_lockin.update(&mut iir_state_lockin[0], signal.0);