libsstvenc
Asynchronous Analogue SSTV encoder
Loading...
Searching...
No Matches
pulseshape.c
Go to the documentation of this file.
1
6/*
7 * © Stuart Longland VK4MSL
8 * SPDX-License-Identifier: MIT
9 */
10
13
15 uint32_t hold_time) {
17 ps->hold_sz = hold_time;
18 ps->sample_idx = 0;
19}
20
21void sstvenc_ps_reset(struct sstvenc_pulseshape* const ps, double hold_time,
22 uint8_t time_unit) {
23 uint32_t samples = sstvenc_ts_unit_to_samples(
24 hold_time, ps->sample_rate, time_unit);
25 sstvenc_ps_reset_samples(ps, samples);
26}
27
28void sstvenc_ps_init(struct sstvenc_pulseshape* const ps, double amplitude,
29 double rise_time, double hold_time, double fall_time,
30 uint32_t sample_rate, uint8_t time_unit) {
31 uint32_t samples;
32
33 ps->amplitude = amplitude;
34 ps->sample_rate = sample_rate;
35 ps->output = 0.0;
36
37 samples
38 = sstvenc_ts_unit_to_samples(rise_time, sample_rate, time_unit);
39 if (samples > UINT16_MAX) {
40 ps->rise_sz = UINT16_MAX;
41 } else {
42 ps->rise_sz = samples;
43 }
44
45 samples
46 = sstvenc_ts_unit_to_samples(fall_time, sample_rate, time_unit);
47 if (samples > UINT16_MAX) {
48 ps->fall_sz = UINT16_MAX;
49 } else {
50 ps->fall_sz = samples;
51 }
52
53 sstvenc_ps_reset(ps, hold_time, time_unit);
54}
55
56void sstvenc_ps_advance(struct sstvenc_pulseshape* const ps) {
57 if (ps->phase < SSTVENC_PS_PHASE_DONE) {
58 ps->sample_idx = 0;
59 ps->phase++;
60 }
61}
62
63void sstvenc_ps_compute(struct sstvenc_pulseshape* const ps) {
64 ps->sample_idx++;
65
66 switch (ps->phase) {
68 ps->phase++;
69 /* Fall-thru */
71 if (ps->rise_sz) {
72 /* Compute the raised sine amplitude */
73 ps->output = ps->amplitude
74 * (1.0
75 - cos((ps->sample_idx * M_PI)
76 / (2 * ((double)ps->rise_sz))));
77 if (ps->output > ps->amplitude) {
78 ps->output = ps->amplitude;
79 }
80 }
81 if (ps->sample_idx > ps->rise_sz) {
82 /* Next phase */
84 }
85 break;
87 ps->output = ps->amplitude;
89 && (ps->sample_idx >= ps->hold_sz)) {
90 /* Next phase */
92 }
93 break;
95 if (ps->fall_sz) {
96 /* Compute the raised sine amplitude */
97 ps->output
98 = ps->amplitude
99 * (1.0
100 - cos(((ps->fall_sz - ps->sample_idx) * M_PI)
101 / (2 * ((double)ps->fall_sz))));
102
103 if (ps->output > ps->amplitude) {
104 ps->output = ps->amplitude;
105 }
106 }
107 if (ps->sample_idx >= ps->fall_sz) {
108 /* Next phase */
110 }
111 break;
113 default:
114 ps->output = 0.0;
115 break;
116 }
117}
118
120 struct sstvenc_oscillator* const osc,
121 double* buffer, size_t buffer_sz) {
122 size_t written_sz = 0;
123
124 while ((buffer_sz > 0) && (ps->phase < SSTVENC_PS_PHASE_DONE)) {
126 osc->amplitude = ps->output;
127
129 buffer[0] = osc->output;
130
131 buffer++;
132 buffer_sz--;
133
134 written_sz++;
135 }
136
137 return written_sz;
138}
139
void sstvenc_osc_compute(struct sstvenc_oscillator *const osc)
Definition oscillator.c:52
#define SSTVENC_PS_PHASE_HOLD
Definition pulseshape.h:58
#define SSTVENC_PS_PHASE_FALL
Definition pulseshape.h:67
#define SSTVENC_PS_PHASE_INIT
Definition pulseshape.h:35
#define SSTVENC_PS_PHASE_RISE
Definition pulseshape.h:44
#define SSTVENC_PS_PHASE_DONE
Definition pulseshape.h:75
uint32_t sample_idx
Definition pulseshape.h:97
uint32_t sample_rate
Definition pulseshape.h:95
#define SSTVENC_PS_HOLD_TIME_INF
Definition pulseshape.h:83
size_t sstvenc_psosc_fill_buffer(struct sstvenc_pulseshape *const ps, struct sstvenc_oscillator *const osc, double *buffer, size_t buffer_sz)
Definition pulseshape.c:119
void sstvenc_ps_advance(struct sstvenc_pulseshape *const ps)
Definition pulseshape.c:56
void sstvenc_ps_compute(struct sstvenc_pulseshape *const ps)
Definition pulseshape.c:63
void sstvenc_ps_init(struct sstvenc_pulseshape *const ps, double amplitude, double rise_time, double hold_time, double fall_time, uint32_t sample_rate, uint8_t time_unit)
Definition pulseshape.c:28
void sstvenc_ps_reset(struct sstvenc_pulseshape *const ps, double hold_time, uint8_t time_unit)
Definition pulseshape.c:21
void sstvenc_ps_reset_samples(struct sstvenc_pulseshape *const ps, uint32_t hold_time)
Definition pulseshape.c:14
uint32_t sstvenc_ts_unit_to_samples(double time, uint32_t sample_rate, uint8_t unit)
Definition timescale.c:46