Speed up float converters a little, add a SC16Q11-nodc converter.

This commit is contained in:
Oliver Jowett 2017-01-27 12:31:34 +00:00
parent cde047aac3
commit b1a1771bb0

View file

@ -121,8 +121,8 @@ static void convert_uc8_generic(void *iq_data,
for (i = 0; i < nsamples; ++i) {
I = *in++;
Q = *in++;
fI = (I - 127.5) / 127.5;
fQ = (Q - 127.5) / 127.5;
fI = (I - 127.5f) / 127.5f;
fQ = (Q - 127.5f) / 127.5f;
// DC block
z1_I = fI * dc_a + z1_I * dc_b;
@ -137,7 +137,7 @@ static void convert_uc8_generic(void *iq_data,
float mag = sqrtf(magsq);
sum_power += magsq;
sum_level += mag;
*mag_data++ = (uint16_t)(mag * 65535.0 + 0.5);
*mag_data++ = (uint16_t)(mag * 65535.0f + 0.5f);
}
state->z1_I = z1_I;
@ -173,8 +173,8 @@ static void convert_sc16_generic(void *iq_data,
for (i = 0; i < nsamples; ++i) {
I = (int16_t)le16toh(*in++);
Q = (int16_t)le16toh(*in++);
fI = I / 32768.0;
fQ = Q / 32768.0;
fI = I / 32768.0f;
fQ = Q / 32768.0f;
// DC block
z1_I = fI * dc_a + z1_I * dc_b;
@ -189,7 +189,7 @@ static void convert_sc16_generic(void *iq_data,
float mag = sqrtf(magsq);
sum_power += magsq;
sum_level += mag;
*mag_data++ = (uint16_t)(mag * 65535.0 + 0.5);
*mag_data++ = (uint16_t)(mag * 65535.0f + 0.5f);
}
state->z1_I = z1_I;
@ -204,6 +204,46 @@ static void convert_sc16_generic(void *iq_data,
}
}
static void convert_sc16q11_nodc(void *iq_data,
uint16_t *mag_data,
unsigned nsamples,
struct converter_state *state,
double *out_mean_level,
double *out_mean_power)
{
uint16_t *in = iq_data;
unsigned i;
int16_t I, Q;
float fI, fQ, magsq;
float sum_level = 0, sum_power = 0;
MODES_NOTUSED(state);
for (i = 0; i < nsamples; ++i) {
I = (int16_t)le16toh(*in++);
Q = (int16_t)le16toh(*in++);
fI = I / 2048.0f;
fQ = Q / 2048.0f;
magsq = fI * fI + fQ * fQ;
if (magsq > 1)
magsq = 1;
float mag = sqrtf(magsq);
sum_power += magsq;
sum_level += mag;
*mag_data++ = (uint16_t)(mag * 65535.0f + 0.5f);
}
if (out_mean_level) {
*out_mean_level = sum_level / nsamples;
}
if (out_mean_power) {
*out_mean_power = sum_power / nsamples;
}
}
static void convert_sc16q11_generic(void *iq_data,
uint16_t *mag_data,
unsigned nsamples,
@ -225,8 +265,8 @@ static void convert_sc16q11_generic(void *iq_data,
for (i = 0; i < nsamples; ++i) {
I = (int16_t)le16toh(*in++);
Q = (int16_t)le16toh(*in++);
fI = I / 2048.0;
fQ = Q / 2048.0;
fI = I / 2048.0f;
fQ = Q / 2048.0f;
// DC block
z1_I = fI * dc_a + z1_I * dc_b;
@ -241,7 +281,7 @@ static void convert_sc16q11_generic(void *iq_data,
float mag = sqrtf(magsq);
sum_power += magsq;
sum_level += mag;
*mag_data++ = (uint16_t)(sqrtf(magsq) * 65535.0 + 0.5);
*mag_data++ = (uint16_t)(mag * 65535.0f + 0.5f);
}
state->z1_I = z1_I;
@ -266,6 +306,7 @@ static struct {
{ INPUT_UC8, 0, convert_uc8_nodc, "UC8, integer/table path" },
{ INPUT_UC8, 1, convert_uc8_generic, "UC8, float path" },
{ INPUT_SC16, 1, convert_sc16_generic, "SC16, float path" },
{ INPUT_SC16Q11, 0, convert_sc16q11_nodc, "SC16Q11, float path, no DC block" },
{ INPUT_SC16Q11, 1, convert_sc16q11_generic, "SC16Q11, float path" },
{ 0, 0, NULL, NULL }
};