Corrected setSampleRate_Hz() to do so

pull/16/merge
boblark 2 years ago
parent 88126e2b21
commit d01dc8ebd4
  1. 40
      RadioIQMixer_F32.h

@ -1,34 +1,34 @@
/* /*
* RadioIQMixer_F32.h * RadioIQMixer_F32.h
* *
* 8 April 2020 Bob Larkin * 8 April 2020 Bob Larkin
* With much credit to: * With much credit to:
* Chip Audette (OpenAudio) Feb 2017 * Chip Audette (OpenAudio) Feb 2017
* and of course, to PJRC for the Teensy and Teensy Audio Library * and of course, to PJRC for the Teensy and Teensy Audio Library
* *
* This quadrature mixer block is suitable for both transmit and receive. * This quadrature mixer block is suitable for both transmit and receive.
* *
* A basic building block is a pair of mixers with the * A basic building block is a pair of mixers with the
* LO going to the mixers at the same frequency, but differing in phase * LO going to the mixers at the same frequency, but differing in phase
* by 90 degrees. This provides two outputs I and Q that are offset in * by 90 degrees. This provides two outputs I and Q that are offset in
* frequency but also 90 degrees apart in phase. The LO are included * frequency but also 90 degrees apart in phase. The LO are included
* in the block, but there are no post-mixing filters. * in the block, but there are no post-mixing filters.
* *
* The frequency is set by .frequency(float freq_Hz) * The frequency is set by .frequency(float freq_Hz)
* There is provision for varying * There is provision for varying
* the phase between the sine and cosine oscillators. Technically this is no * the phase between the sine and cosine oscillators. Technically this is no
* longer sin and cos, but that is what real hardware needs. * longer sin and cos, but that is what real hardware needs.
* *
* The amplitudeC(a) allows balancing of I and Q channels. * The amplitudeC(a) allows balancing of I and Q channels.
* *
* The output levels are 0.5 times the input level. * The output levels are 0.5 times the input level.
* *
* Status: Tested in doSimple==1 * Status: Tested in doSimple==1
* Tested in FineFreqShift_OA.ino, T3.6 and T4.0 * Tested in FineFreqShift_OA.ino, T3.6 and T4.0
* *
* Inputs: 0 is signal * Inputs: 0 is signal
* Outputs: 0 is I 1 is Q * Outputs: 0 is I 1 is Q
* *
* Functions, available during operation: * Functions, available during operation:
* void frequency(float32_t fr) Sets LO frequency Hz * void frequency(float32_t fr) Sets LO frequency Hz
* void iqmPhaseS(float32_t ps) Sets Phase of Sine in radians * void iqmPhaseS(float32_t ps) Sets Phase of Sine in radians
@ -37,13 +37,14 @@
* void useSimple(bool s) Faster if 1, but no phase/amplitude adjustment * void useSimple(bool s) Faster if 1, but no phase/amplitude adjustment
* void setSampleRate_Hz(float32_t fs_Hz) Allows dynamic sample rate change for this function * void setSampleRate_Hz(float32_t fs_Hz) Allows dynamic sample rate change for this function
* void useTwoChannel(bool 2Ch) Uses 2 input cannels, I & Q, if true. Apr 2021 * void useTwoChannel(bool 2Ch) Uses 2 input cannels, I & Q, if true. Apr 2021
* *
* Time: T3.6 For an update of a 128 sample block, doSimple=1, 46 microseconds * Time: T3.6 For an update of a 128 sample block, doSimple=1, 46 microseconds
* T4.0 For an update of a 128 sample block, doSimple=1, 20 microseconds * T4.0 For an update of a 128 sample block, doSimple=1, 20 microseconds
* *
* Rev Apr2021 Allowed for 2-channel I-Q input. Defaults to 1 Channel. "real." * Rev Apr2021 Allowed for 2-channel I-Q input. Defaults to 1 Channel. "real."
* Rev 30Jan23 Corrected setSampleRate_Hz(sr) to do so! RSL
*/ */
#ifndef _radioIQMixer_f32_h #ifndef _radioIQMixer_f32_h
#define _radioIQMixer_f32_h #define _radioIQMixer_f32_h
@ -83,7 +84,7 @@ public:
doSimple = false; doSimple = false;
return; return;
} }
// phaseS_C_r is the number of radians that the cosine output leads the // phaseS_C_r is the number of radians that the cosine output leads the
// sine output. The default is M_PI_2 = pi/2 = 1.57079633 radians, // sine output. The default is M_PI_2 = pi/2 = 1.57079633 radians,
// corresponding to 90.00 degrees cosine leading sine. // corresponding to 90.00 degrees cosine leading sine.
@ -110,7 +111,7 @@ public:
// complex input. With twoChannel===true channel 1 is Q. // complex input. With twoChannel===true channel 1 is Q.
void useTwoChannel(bool _2Ch) { void useTwoChannel(bool _2Ch) {
twoChannel = _2Ch; twoChannel = _2Ch;
} }
// Speed up calculations by setting phaseS_C=90deg, amplitude=1 // Speed up calculations by setting phaseS_C=90deg, amplitude=1
void useSimple(bool s) { void useSimple(bool s) {
@ -120,19 +121,20 @@ public:
amplitude_pk = 1.0f; amplitude_pk = 1.0f;
} }
return; return;
} }
void setSampleRate_Hz(float32_t fs_Hz) { void setSampleRate_Hz(float32_t fs_Hz) {
sample_rate_Hz = fs_Hz; // Added 30Jan23 RSL
// Check freq range // Check freq range
if (freq > sample_rate_Hz/2.0f) freq = sample_rate_Hz/2.f; if (freq > sample_rate_Hz/2.0f) freq = sample_rate_Hz/2.f;
// update phase increment for new frequency // update phase increment for new frequency
phaseIncrement = 512.0f * freq / fs_Hz; phaseIncrement = 512.0f * freq / sample_rate_Hz;
} }
void showError(uint16_t e) { // Serial.print errors in update() void showError(uint16_t e) { // Serial.print errors in update()
errorPrintIQM = e; errorPrintIQM = e;
} }
virtual void update(void); virtual void update(void);
private: private:

Loading…
Cancel
Save