proper phase shifts for rds2 - less deviation

This commit is contained in:
2026-07-12 09:58:46 +02:00
parent f3035091d7
commit 224ad3bc64
4 changed files with 32 additions and 16 deletions
+14
View File
@@ -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
View File
@@ -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);