mirror of
https://github.com/radio95-rnt/fm95.git
synced 2026-07-29 15:59:14 +02:00
proper phase shifts for rds2 - less deviation
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
|
||||
void init_oscillator(Oscillator *osc, float frequency, float sample_rate) {
|
||||
osc->phase = 0.0f;
|
||||
osc->unwrapped_phase = 0.0;
|
||||
osc->phase_increment = (M_2PI * frequency) / sample_rate;
|
||||
osc->sample_rate = sample_rate;
|
||||
}
|
||||
@@ -32,8 +33,21 @@ float get_oscillator_cos_multiplier_ni(Oscillator *osc, float multiplier) {
|
||||
|
||||
inline bool advance_oscillator(Oscillator *osc) {
|
||||
osc->phase += osc->phase_increment;
|
||||
osc->unwrapped_phase += osc->phase_increment;
|
||||
if (osc->phase >= M_2PI) {
|
||||
osc->phase -= M_2PI;
|
||||
return true;
|
||||
} return false;
|
||||
}
|
||||
|
||||
bool oscillator_did_cycle(Oscillator *osc, float phase_shift, float *prev_shifted_phase) {
|
||||
float shifted = osc->phase + phase_shift;
|
||||
|
||||
// wrap into [0, 2π)
|
||||
while (shifted >= M_2PI) shifted -= M_2PI;
|
||||
while (shifted < 0.0f) shifted += M_2PI;
|
||||
|
||||
bool crossed = shifted < *prev_shifted_phase;
|
||||
*prev_shifted_phase = shifted;
|
||||
return crossed;
|
||||
}
|
||||
+3
-1
@@ -6,6 +6,7 @@
|
||||
|
||||
typedef struct {
|
||||
float phase;
|
||||
double unwrapped_phase;
|
||||
float phase_increment;
|
||||
float sample_rate;
|
||||
} Oscillator;
|
||||
@@ -16,4 +17,5 @@ float get_oscillator_sin_sample(Oscillator *osc);
|
||||
float get_oscillator_cos_sample(Oscillator *osc);
|
||||
float get_oscillator_sin_multiplier_ni(Oscillator *osc, float multiplier);
|
||||
float get_oscillator_cos_multiplier_ni(Oscillator *osc, float multiplier);
|
||||
bool advance_oscillator(Oscillator *osc);
|
||||
bool advance_oscillator(Oscillator *osc);
|
||||
bool oscillator_did_cycle(Oscillator *osc, float phase_shift, float *prev_shifted_phase);
|
||||
Reference in New Issue
Block a user