samplerate.c: Allow transcoding to lower sample rate other than 8000 Hz

This commit is contained in:
Andreas Eversberg
2017-03-04 16:52:20 +01:00
parent 3fc4fc54be
commit 8e0d7d2513
5 changed files with 14 additions and 16 deletions

View File

@@ -134,7 +134,7 @@ int dsp_init_sender(cnetz_t *cnetz, int measure_speed, double clock_speed[2])
} }
/* reinit the sample rate to shrink/expand audio */ /* reinit the sample rate to shrink/expand audio */
init_samplerate(&cnetz->sender.srstate, (double)cnetz->sender.samplerate / 1.1); /* 66 <-> 60 */ init_samplerate(&cnetz->sender.srstate, 0x8000, (double)cnetz->sender.samplerate / 1.1); /* 66 <-> 60 */
rc = fsk_fm_init(&cnetz->fsk_demod, cnetz, cnetz->sender.samplerate, (double)BITRATE / (1.0 + clock_speed[0] / 1000000.0)); rc = fsk_fm_init(&cnetz->fsk_demod, cnetz, cnetz->sender.samplerate, (double)BITRATE / (1.0 + clock_speed[0] / 1000000.0));
if (rc < 0) if (rc < 0)

View File

@@ -497,7 +497,7 @@ int call_init(const char *station_id, const char *audiodev, int samplerate, int
if (!audiodev[0]) if (!audiodev[0])
return 0; return 0;
rc = init_samplerate(&call.srstate, samplerate); rc = init_samplerate(&call.srstate, 8000.0, (double)samplerate);
if (rc < 0) { if (rc < 0) {
PDEBUG(DSENDER, DEBUG_ERROR, "Failed to init sample rate conversion!\n"); PDEBUG(DSENDER, DEBUG_ERROR, "Failed to init sample rate conversion!\n");
goto error; goto error;

View File

@@ -25,24 +25,22 @@
#include "sample.h" #include "sample.h"
#include "samplerate.h" #include "samplerate.h"
int init_samplerate(samplerate_t *state, double samplerate) int init_samplerate(samplerate_t *state, double low_samplerate, double high_samplerate)
{ {
#if 0
if ((samplerate % 8000)) {
fprintf(stderr, "Sample rate must be a muliple of 8000 to support MNCC socket interface, aborting!\n");
return -EINVAL;
}
#endif
memset(state, 0, sizeof(*state)); memset(state, 0, sizeof(*state));
state->factor = samplerate / 8000.0; state->factor = high_samplerate / low_samplerate;
if (state->factor < 1.0) {
fprintf(stderr, "Software error: Low sample rate must be lower than high sample rate, aborting!\n");
abort();
}
filter_lowpass_init(&state->up.lp, 3300.0, samplerate, 2); filter_lowpass_init(&state->up.lp, 3300.0, high_samplerate, 2);
filter_lowpass_init(&state->down.lp, 3300.0, samplerate, 2); filter_lowpass_init(&state->down.lp, 3300.0, high_samplerate, 2);
return 0; return 0;
} }
/* convert input sample rate to 8000 Hz */ /* convert high sample rate to low sample rate */
int samplerate_downsample(samplerate_t *state, sample_t *samples, int input_num) int samplerate_downsample(samplerate_t *state, sample_t *samples, int input_num)
{ {
int output_num = 0, i, idx; int output_num = 0, i, idx;
@@ -96,7 +94,7 @@ int samplerate_downsample(samplerate_t *state, sample_t *samples, int input_num)
return output_num; return output_num;
} }
/* convert 8000 Hz sample rate to output sample rate */ /* convert low sample rate to high sample rate */
int samplerate_upsample(samplerate_t *state, sample_t *input, int input_num, sample_t *output) int samplerate_upsample(samplerate_t *state, sample_t *input, int input_num, sample_t *output)
{ {
int output_num = 0, i, idx; int output_num = 0, i, idx;

View File

@@ -14,6 +14,6 @@ typedef struct samplerate {
} up; } up;
} samplerate_t; } samplerate_t;
int init_samplerate(samplerate_t *state, double samplerate); int init_samplerate(samplerate_t *state, double low_samplerate, double high_samplerate);
int samplerate_downsample(samplerate_t *state, sample_t *samples, int input_num); int samplerate_downsample(samplerate_t *state, sample_t *samples, int input_num);
int samplerate_upsample(samplerate_t *state, sample_t *input, int input_num, sample_t *output); int samplerate_upsample(samplerate_t *state, sample_t *input, int input_num, sample_t *output);

View File

@@ -114,7 +114,7 @@ int sender_create(sender_t *sender, int kanal, double sendefrequenz, double empf
} }
} }
rc = init_samplerate(&sender->srstate, samplerate); rc = init_samplerate(&sender->srstate, 8000.0, (double)samplerate);
if (rc < 0) { if (rc < 0) {
PDEBUG(DSENDER, DEBUG_ERROR, "Failed to init sample rate conversion!\n"); PDEBUG(DSENDER, DEBUG_ERROR, "Failed to init sample rate conversion!\n");
goto error; goto error;