martin modes, and some bugfixes to get them working
This commit is contained in:
40
sstv.c
40
sstv.c
@@ -5,16 +5,19 @@
|
||||
#include <math.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#define PI 3.14159265358979
|
||||
#define PI 3.14159265358979
|
||||
#define AMPLITUDE 12000
|
||||
|
||||
static double phase = 0.0;
|
||||
static double phase = 0.0;
|
||||
static double sample_accum = 0.0; // accumulator
|
||||
|
||||
void sstv_tone(wav_t *wav, double freq, double duration_ms) {
|
||||
uint32_t total_samples = (uint32_t)((duration_ms / 1000.0) * wav->sample_rate);
|
||||
sample_accum += (duration_ms / 1000.0) * wav->sample_rate;
|
||||
uint32_t total_samples = (uint32_t)sample_accum;
|
||||
sample_accum -= total_samples;
|
||||
|
||||
double step = 2.0 * PI * freq / wav->sample_rate;
|
||||
for (uint32_t i = 0; i < total_samples; i++) {
|
||||
double step = 2.0 * PI * freq / wav->sample_rate;
|
||||
phase += step;
|
||||
if (phase > 2.0 * PI)
|
||||
phase -= 2.0 * PI;
|
||||
@@ -24,31 +27,36 @@ void sstv_tone(wav_t *wav, double freq, double duration_ms) {
|
||||
}
|
||||
}
|
||||
|
||||
void sstv_vis_header(wav_t *wav) {
|
||||
uint8_t vis = 0x08;
|
||||
uint8_t parity = 0;
|
||||
|
||||
void sstv_vis_header_ex(wav_t *wav, uint8_t vis_code) {
|
||||
// reset accumulator
|
||||
phase = 0.0;
|
||||
sample_accum = 0.0;
|
||||
|
||||
/* preamble */
|
||||
sstv_tone(wav, 1900, 300);
|
||||
sstv_tone(wav, 1200, 10);
|
||||
sstv_tone(wav, 1200, 10);
|
||||
sstv_tone(wav, 1900, 300);
|
||||
|
||||
sstv_tone(wav, 1200, 30);
|
||||
|
||||
uint8_t parity = 0;
|
||||
for (int i = 0; i < 7; i++) {
|
||||
uint8_t bit = (vis >> i) & 1;
|
||||
if (bit) {
|
||||
sstv_tone(wav, 1100, 30);
|
||||
parity ^= 1;
|
||||
} else {
|
||||
sstv_tone(wav, 1300, 30);
|
||||
}
|
||||
uint8_t bit = (vis_code >> i) & 1;
|
||||
sstv_tone(wav, bit ? 1100 : 1300, 30);
|
||||
parity ^= bit;
|
||||
}
|
||||
|
||||
/* parity bit */
|
||||
sstv_tone(wav, parity ? 1100 : 1300, 30);
|
||||
|
||||
/* stop bit */
|
||||
sstv_tone(wav, 1200, 30);
|
||||
}
|
||||
|
||||
void sstv_vis_header(wav_t *wav) {
|
||||
sstv_vis_header_ex(wav, 0x08);
|
||||
}
|
||||
|
||||
int sstv_encode_robot36(const char *input_image, const char *output_wav) {
|
||||
image_t img, resized;
|
||||
wav_t wav;
|
||||
|
||||
Reference in New Issue
Block a user