libsstvenc
Asynchronous Analogue SSTV encoder
Loading...
Searching...
No Matches
oscillator.c
Go to the documentation of this file.
1
6/*
7 * © Stuart Longland VK4MSL
8 * SPDX-License-Identifier: MIT
9 */
10
11#include <assert.h>
13#include <math.h>
14#include <stdint.h>
15
20#define SSTVENC_OSC_PHASE_FRAC_BITS (29)
21
25#define SSTVENC_OSC_PHASE_FRAC_SCALE \
26 ((double)(1 << SSTVENC_OSC_PHASE_FRAC_BITS))
27
28double sstvenc_osc_get_frequency(const struct sstvenc_oscillator* const osc) {
29 return ((double)(((uint64_t)osc->phase_inc) * osc->sample_rate))
30 / (2 * M_PI * SSTVENC_OSC_PHASE_FRAC_SCALE);
31}
32
34 double frequency) {
35 assert(frequency >= 0);
36 assert(frequency < (osc->sample_rate / 2));
37
38 osc->phase_inc = (2 * M_PI * frequency * SSTVENC_OSC_PHASE_FRAC_SCALE)
39 / osc->sample_rate;
40}
41
42void sstvenc_osc_init(struct sstvenc_oscillator* const osc, double amplitude,
43 double frequency, double offset, uint32_t sample_rate) {
44 osc->amplitude = amplitude;
45 osc->offset = offset;
46 osc->output = 0.0;
47 osc->sample_rate = sample_rate;
48 osc->phase = 0;
49 sstvenc_osc_set_frequency(osc, frequency);
50}
51
52void sstvenc_osc_compute(struct sstvenc_oscillator* const osc) {
53 if (osc->sample_rate) {
54 /* Compute output */
55 osc->output = osc->amplitude
56 * sin(osc->offset
57 + (((double)osc->phase)
59
60 /* Increment phase, modulo 2Pi */
61 osc->phase += osc->phase_inc;
62 osc->phase
63 %= (uint32_t)(2 * M_PI * SSTVENC_OSC_PHASE_FRAC_SCALE);
64 }
65}
66
uint32_t sample_rate
Definition oscillator.h:55
void sstvenc_osc_init(struct sstvenc_oscillator *const osc, double amplitude, double frequency, double offset, uint32_t sample_rate)
Definition oscillator.c:42
void sstvenc_osc_set_frequency(struct sstvenc_oscillator *const osc, double frequency)
Definition oscillator.c:33
void sstvenc_osc_compute(struct sstvenc_oscillator *const osc)
Definition oscillator.c:52
double sstvenc_osc_get_frequency(const struct sstvenc_oscillator *const osc)
Definition oscillator.c:28
#define SSTVENC_OSC_PHASE_FRAC_SCALE
Definition oscillator.c:25