diff options
author | Andreas Eversberg <jolly@eversberg.eu> | 2017-01-29 07:25:12 +0100 |
---|---|---|
committer | Andreas Eversberg <jolly@eversberg.eu> | 2017-02-18 21:01:13 +0100 |
commit | 7e45f556cec493c3c77fcb6400d8ae211faf2220 (patch) | |
tree | cb5903509228c36e7dcd52ae0a049b380e81f401 /src/bnetz | |
parent | bd7ccc5fa05587606757adbacb6e1bf12f12fd2c (diff) |
Correcting all levels and move all remaining integer samples to sample_t
The leves are based on the standards of each mobile network. They
are adjusted to the specified frequency deviation now.
Diffstat (limited to 'src/bnetz')
-rw-r--r-- | src/bnetz/bnetz.h | 4 | ||||
-rw-r--r-- | src/bnetz/dsp.c | 64 |
2 files changed, 36 insertions, 32 deletions
diff --git a/src/bnetz/bnetz.h b/src/bnetz/bnetz.h index 3ba4b51..176abfd 100644 --- a/src/bnetz/bnetz.h +++ b/src/bnetz/bnetz.h @@ -88,8 +88,8 @@ typedef struct bnetz { int fsk_filter_qualidx; /* index of quality array above */ int tone_detected; /* what tone has been detected */ int tone_count; /* how long has that tone been detected */ - double phaseshift256[2]; /* how much the phase of sine wave changes per sample */ - double phase256; /* current phase */ + double phaseshift65536[2]; /* how much the phase of sine wave changes per sample */ + double phase65536; /* current phase */ int telegramm; /* set, if there is a valid telegram */ sample_t *telegramm_spl; /* 16 * samples_per_bit */ int telegramm_pos; /* current sample position in telegramm_spl */ diff --git a/src/bnetz/dsp.c b/src/bnetz/dsp.c index 95a78d6..70b4649 100644 --- a/src/bnetz/dsp.c +++ b/src/bnetz/dsp.c @@ -34,9 +34,19 @@ #define PI 3.1415927 +/* Notes on TX_PEAK_TONE level: + * + * At 2000 Hz the deviation shall be 4 kHz, so with emphasis the deviation + * at 1000 Hz would be theoretically 2 kHz. This is factor 0.714 below + * 2.8 kHz deviation we want at dBm0. + */ + /* signaling */ -#define BANDWIDTH 5000.0 /* maximum bandwidth */ -#define TX_PEAK_TONE 5000.0 /* peak amplitude for all tones */ +#define MAX_DEVIATION 4000.0 +#define MAX_MODULATION 3000.0 +#define DBM0_DEVIATION 2800.0 /* deviation of dBm0 at 1 kHz */ +#define TX_PEAK_TONE (4000.0 / 2000.0 * 1000.0 / DBM0_DEVIATION) +#define MAX_DISPLAY 1.4 /* something above dBm0 */ #define BIT_DURATION 0.010 /* bit length: 10 ms */ #define FILTER_STEP 0.001 /* step every 1 ms */ #define METERING_HZ 2900 /* metering pulse frequency */ @@ -54,7 +64,7 @@ static double fsk_bits[2] = { }; /* table for fast sine generation */ -static sample_t dsp_sine[256]; +static sample_t dsp_sine[65536]; /* global init for FSK */ void dsp_init(void) @@ -62,13 +72,8 @@ void dsp_init(void) int i; PDEBUG(DDSP, DEBUG_DEBUG, "Generating sine table.\n"); - for (i = 0; i < 256; i++) { - dsp_sine[i] = (int)(sin((double)i / 256.0 * 2.0 * PI) * TX_PEAK_TONE); - } - - if (TX_PEAK_TONE > 32767.0) { - fprintf(stderr, "TX_PEAK_TONE definition too high, please fix!\n"); - abort(); + for (i = 0; i < 65536; i++) { + dsp_sine[i] = sin((double)i / 65536.0 * 2.0 * PI) * TX_PEAK_TONE; } } @@ -85,9 +90,8 @@ int dsp_init_sender(bnetz_t *bnetz) PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Init DSP for 'Sender'.\n"); - /* set deviation and modulation parameters */ - bnetz->sender.bandwidth = BANDWIDTH; - bnetz->sender.sample_deviation = 1250.0 / (double)TX_PEAK_TONE; // FIXME: calc real value + /* set modulation parameters */ + sender_set_fm(&bnetz->sender, MAX_DEVIATION, MAX_MODULATION, DBM0_DEVIATION, MAX_DISPLAY); audio_init_loss(&bnetz->sender.loss, LOSS_INTERVAL, bnetz->sender.loss_volume, LOSS_TIME); @@ -114,8 +118,8 @@ int dsp_init_sender(bnetz_t *bnetz) /* count symbols */ for (i = 0; i < 2; i++) { audio_goertzel_init(&bnetz->fsk_goertzel[i], fsk_bits[i], bnetz->sender.samplerate); - bnetz->phaseshift256[i] = 256.0 / ((double)bnetz->sender.samplerate / fsk_bits[i]); - PDEBUG(DDSP, DEBUG_DEBUG, "phaseshift[%d] = %.4f (must be arround 64 at 8000hz)\n", i, bnetz->phaseshift256[i]); + bnetz->phaseshift65536[i] = 65536.0 / ((double)bnetz->sender.samplerate / fsk_bits[i]); + PDEBUG(DDSP, DEBUG_DEBUG, "phaseshift[%d] = %.4f (must be arround 64 at 8000hz)\n", i, bnetz->phaseshift65536[i]); } return 0; @@ -241,9 +245,9 @@ static inline void fsk_decode_step(bnetz_t *bnetz, int pos) // FIXME: better threshold /* adjust level, so we get peak of sine curve */ if (level / 0.63 > 0.05 && (softbit > 0.75 || softbit < 0.25)) { - fsk_receive_tone(bnetz, bit, 1, level / 0.63662 * 32768.0 / TX_PEAK_TONE, quality); + fsk_receive_tone(bnetz, bit, 1, level / 0.63662 / TX_PEAK_TONE, quality); } else - fsk_receive_tone(bnetz, bit, 0, level / 0.63662 * 32768.0 / TX_PEAK_TONE, quality); + fsk_receive_tone(bnetz, bit, 0, level / 0.63662 / TX_PEAK_TONE, quality); if (bnetz->fsk_filter_bit != bit) { /* if we have a bit change, reset sample counter to one half bit duration */ @@ -256,7 +260,7 @@ static inline void fsk_decode_step(bnetz_t *bnetz, int pos) printf("|%s|\n", debug_amplitude(quality); #endif /* adjust level, so we get peak of sine curve */ - fsk_receive_bit(bnetz, bit, level / 0.63662 * 32768.0 / TX_PEAK_TONE, quality); + fsk_receive_bit(bnetz, bit, level / 0.63662 / TX_PEAK_TONE, quality); bnetz->fsk_filter_sample = 10; } } @@ -308,17 +312,17 @@ static void fsk_tone(bnetz_t *bnetz, sample_t *samples, int length, int tone) double phaseshift, phase; int i; - phase = bnetz->phase256; - phaseshift = bnetz->phaseshift256[tone]; + phase = bnetz->phase65536; + phaseshift = bnetz->phaseshift65536[tone]; for (i = 0; i < length; i++) { - *samples++ = dsp_sine[(uint8_t)phase]; + *samples++ = dsp_sine[(uint16_t)phase]; phase += phaseshift; - if (phase >= 256) - phase -= 256; + if (phase >= 65536) + phase -= 65536; } - bnetz->phase256 = phase; + bnetz->phase65536 = phase; } static int fsk_telegramm(bnetz_t *bnetz, sample_t *samples, int length) @@ -342,17 +346,17 @@ next_telegramm: bnetz->telegramm_pos = 0; spl = bnetz->telegramm_spl; /* render telegramm */ - phase = bnetz->phase256; + phase = bnetz->phase65536; for (i = 0; i < 16; i++) { - phaseshift = bnetz->phaseshift256[telegramm[i] == '1']; + phaseshift = bnetz->phaseshift65536[telegramm[i] == '1']; for (j = 0; j < bnetz->samples_per_bit; j++) { - *spl++ = dsp_sine[(uint8_t)phase]; + *spl++ = dsp_sine[(uint16_t)phase]; phase += phaseshift; - if (phase >= 256) - phase -= 256; + if (phase >= 65536) + phase -= 65536; } } - bnetz->phase256 = phase; + bnetz->phase65536 = phase; } /* send audio from telegramm */ |