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>
12
#include <
libsstvenc/oscillator.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
28
double
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
33
void
sstvenc_osc_set_frequency
(
struct
sstvenc_oscillator
*
const
osc,
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
42
void
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
52
void
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
)
58
/
SSTVENC_OSC_PHASE_FRAC_SCALE
));
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
sstvenc_oscillator::output
double output
Definition
oscillator.h:50
sstvenc_oscillator::sample_rate
uint32_t sample_rate
Definition
oscillator.h:55
sstvenc_oscillator::offset
double offset
Definition
oscillator.h:45
sstvenc_oscillator::phase
uint32_t phase
Definition
oscillator.h:62
sstvenc_oscillator::phase_inc
uint32_t phase_inc
Definition
oscillator.h:69
sstvenc_oscillator::amplitude
double amplitude
Definition
oscillator.h:37
sstvenc_oscillator
Definition
oscillator.h:29
sstvenc_osc_init
void sstvenc_osc_init(struct sstvenc_oscillator *const osc, double amplitude, double frequency, double offset, uint32_t sample_rate)
Definition
oscillator.c:42
sstvenc_osc_set_frequency
void sstvenc_osc_set_frequency(struct sstvenc_oscillator *const osc, double frequency)
Definition
oscillator.c:33
sstvenc_osc_compute
void sstvenc_osc_compute(struct sstvenc_oscillator *const osc)
Definition
oscillator.c:52
sstvenc_osc_get_frequency
double sstvenc_osc_get_frequency(const struct sstvenc_oscillator *const osc)
Definition
oscillator.c:28
SSTVENC_OSC_PHASE_FRAC_SCALE
#define SSTVENC_OSC_PHASE_FRAC_SCALE
Definition
oscillator.c:25
oscillator.h
src
oscillator.c
Generated by
1.12.0