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 */
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));
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])
return 0;
rc = init_samplerate(&call.srstate, samplerate);
rc = init_samplerate(&call.srstate, 8000.0, (double)samplerate);
if (rc < 0) {
PDEBUG(DSENDER, DEBUG_ERROR, "Failed to init sample rate conversion!\n");
goto error;

View File

@ -25,24 +25,22 @@
#include "sample.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));
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->down.lp, 3300.0, samplerate, 2);
filter_lowpass_init(&state->up.lp, 3300.0, high_samplerate, 2);
filter_lowpass_init(&state->down.lp, 3300.0, high_samplerate, 2);
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 output_num = 0, i, idx;
@ -96,7 +94,7 @@ int samplerate_downsample(samplerate_t *state, sample_t *samples, int input_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 output_num = 0, i, idx;

View File

@ -14,6 +14,6 @@ typedef struct samplerate {
} up;
} 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_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) {
PDEBUG(DSENDER, DEBUG_ERROR, "Failed to init sample rate conversion!\n");
goto error;