From d1b0a6956a73cb70923d20604df1fcdebd2143fc Mon Sep 17 00:00:00 2001 From: Ryan Summers Date: Tue, 10 Aug 2021 13:39:33 +0200 Subject: [PATCH 1/2] Adding optimized signal generator --- src/bin/lockin.rs | 2 +- src/hardware/signal_generator.rs | 40 ++++++++++++++------------------ 2 files changed, 18 insertions(+), 24 deletions(-) diff --git a/src/bin/lockin.rs b/src/bin/lockin.rs index a6f0551..059c166 100644 --- a/src/bin/lockin.rs +++ b/src/bin/lockin.rs @@ -279,7 +279,7 @@ const APP: () = { let signal_config = { let frequency_tuning_word = - (1u64 << (32 - BATCH_SIZE_SIZE_LOG2)) as u32; + (1u64 << (32 - BATCH_SIZE_SIZE_LOG2)) as i32; signal_generator::Config { // Same frequency as batch size. diff --git a/src/hardware/signal_generator.rs b/src/hardware/signal_generator.rs index 5bcea8f..cfade3f 100644 --- a/src/hardware/signal_generator.rs +++ b/src/hardware/signal_generator.rs @@ -93,12 +93,12 @@ impl BasicConfig { ftw / self.symmetry } else { NYQUIST - } as u32, + } as i32, if symmetry_complement * NYQUIST > ftw { ftw / symmetry_complement } else { NYQUIST - } as u32, + } as i32, ]; Ok(Config { @@ -120,7 +120,7 @@ pub struct Config { pub amplitude: i16, /// The frequency tuning word of the signal. Phase is incremented by this amount - pub frequency_tuning_word: [u32; 2], + pub frequency_tuning_word: [i32; 2], } impl Default for Config { @@ -135,7 +135,7 @@ impl Default for Config { #[derive(Debug)] pub struct SignalGenerator { - phase_accumulator: u32, + phase_accumulator: i32, config: Config, } @@ -174,32 +174,26 @@ impl core::iter::Iterator for SignalGenerator { /// Get the next value in the generator sequence. fn next(&mut self) -> Option { - self.phase_accumulator = self.phase_accumulator.wrapping_add( - if (self.phase_accumulator as i32).is_negative() { - self.config.frequency_tuning_word[0] - } else { - self.config.frequency_tuning_word[1] - }, - ); + let sign = self.phase_accumulator.is_negative(); + self.phase_accumulator = self + .phase_accumulator + .wrapping_add(self.config.frequency_tuning_word[sign as usize]); - let phase = self.phase_accumulator as i32; - - let amplitude: i16 = match self.config.signal { - Signal::Cosine => (dsp::cossin(phase).0 >> 16) as i16, + let scale = match self.config.signal { + Signal::Cosine => (dsp::cossin(self.phase_accumulator).0 >> 16), Signal::Square => { - if phase.is_negative() { - i16::MAX + if sign { + -i16::MAX as i32 } else { - -i16::MAX + i16::MAX as i32 } } - Signal::Triangle => i16::MAX - (phase.abs() >> 15) as i16, + Signal::Triangle => { + i16::MAX as i32 - (self.phase_accumulator.abs() >> 15) + } }; // Calculate the final output result as an i16. - let result = amplitude as i32 * self.config.amplitude as i32; - - // Note: We downshift by 15-bits to preserve only one of the sign bits. - Some(((result + (1 << 14)) >> 15) as i16) + Some(((self.config.amplitude as i32 * scale) >> 15) as _) } } From 3b055b81657e2cc837faf4a074f8378cdb87266c Mon Sep 17 00:00:00 2001 From: Ryan Summers Date: Tue, 10 Aug 2021 16:45:17 +0200 Subject: [PATCH 2/2] Updating after review --- src/hardware/signal_generator.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hardware/signal_generator.rs b/src/hardware/signal_generator.rs index cfade3f..b0d744f 100644 --- a/src/hardware/signal_generator.rs +++ b/src/hardware/signal_generator.rs @@ -183,13 +183,13 @@ impl core::iter::Iterator for SignalGenerator { Signal::Cosine => (dsp::cossin(self.phase_accumulator).0 >> 16), Signal::Square => { if sign { - -i16::MAX as i32 + -1 << 15 } else { - i16::MAX as i32 + 1 << 15 } } Signal::Triangle => { - i16::MAX as i32 - (self.phase_accumulator.abs() >> 15) + (self.phase_accumulator >> 15).abs() - (1 << 15) } };