mirror of
https://github.com/radio95-rnt/rds95.git
synced 2026-07-29 08:19:17 +02:00
51 lines
1.8 KiB
C
51 lines
1.8 KiB
C
#include "modulator.h"
|
|
#include "fs.h"
|
|
|
|
void init_rds_modulator(RDSModulator* rdsMod, RDSEncoder* enc, uint8_t num_streams) {
|
|
memset(rdsMod, 0, sizeof(RDSModulator));
|
|
rdsMod->num_streams = num_streams;
|
|
|
|
memset(enc, 0, sizeof(RDSEncoder));
|
|
rdsMod->enc = enc;
|
|
|
|
rdsMod->data = (RDSModulatorModulationData*)calloc(num_streams, sizeof(RDSModulatorModulationData));
|
|
if (rdsMod->data == NULL) {
|
|
fprintf(stderr, "Error: Could not allocate memory for RDS modulation data\n");
|
|
return;
|
|
}
|
|
|
|
for (uint8_t i = 0; i < num_streams; i++) {
|
|
rdsMod->data[i].symbol_shift = i * M_PI / 2.0f;
|
|
rdsMod->data[i].bit_pos = BITS_PER_GROUP;
|
|
}
|
|
}
|
|
|
|
void cleanup_rds_modulator(RDSModulator* rdsMod) {
|
|
if (rdsMod->data) {
|
|
free(rdsMod->data);
|
|
rdsMod->data = NULL;
|
|
}
|
|
}
|
|
|
|
float get_rds_sample(RDSModulator* rdsMod, uint8_t stream) {
|
|
if(stream >= rdsMod->num_streams) return 0.0f;
|
|
|
|
rdsMod->data[stream].phase += 1187.5 / RDS_SAMPLE_RATE;
|
|
|
|
if (rdsMod->data[stream].phase >= 1.0f) {
|
|
rdsMod->data[stream].phase -= 1.0f;
|
|
if (rdsMod->data[stream].bit_pos == BITS_PER_GROUP) {
|
|
get_rds_bits(rdsMod->enc, rdsMod->data[stream].bit_buffer, stream);
|
|
rdsMod->data[stream].bit_pos = 0;
|
|
}
|
|
|
|
rdsMod->data[stream].cur_bit = rdsMod->data[stream].bit_buffer[rdsMod->data[stream].bit_pos++];
|
|
rdsMod->data[stream].prev_output = rdsMod->data[stream].cur_output;
|
|
rdsMod->data[stream].cur_output = rdsMod->data[stream].prev_output ^ rdsMod->data[stream].cur_bit; // Something with differential encoding? Instead of encoding the data, encode if the bit of data changes
|
|
}
|
|
|
|
float sample = sinf(M_2PI * rdsMod->data[stream].phase + rdsMod->data[stream].symbol_shift);
|
|
if(rdsMod->data[stream].cur_output == 0) sample = -sample; // do bpsk, if you comment this part out, nothing will be decoded
|
|
|
|
return sample;
|
|
} |