q3.28 changes
This commit is contained in:
parent
009dd2e698
commit
481219341d
|
@ -73,12 +73,12 @@ void bqf_lowpass_config(double fs, double f0, double Q, bqf_coeff_t *coefficient
|
|||
a2 = a2 / a0;
|
||||
a0 = 1.0;
|
||||
|
||||
coefficients->b0 = fix16_from_dbl(b0);
|
||||
coefficients->b1 = fix16_from_dbl(b1);
|
||||
coefficients->b2 = fix16_from_dbl(b2);
|
||||
coefficients->a0 = fix16_from_dbl(a0);
|
||||
coefficients->a1 = fix16_from_dbl(a1);
|
||||
coefficients->a2 = fix16_from_dbl(a2);
|
||||
coefficients->b0 = fix3_28_from_dbl(b0);
|
||||
coefficients->b1 = fix3_28_from_dbl(b1);
|
||||
coefficients->b2 = fix3_28_from_dbl(b2);
|
||||
coefficients->a0 = fix3_28_from_dbl(a0);
|
||||
coefficients->a1 = fix3_28_from_dbl(a1);
|
||||
coefficients->a2 = fix3_28_from_dbl(a2);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -123,12 +123,12 @@ void bqf_highpass_config(double fs, double f0, double Q, bqf_coeff_t *coefficien
|
|||
a2 = a2 / a0;
|
||||
a0 = 1.0;
|
||||
|
||||
coefficients->b0 = fix16_from_dbl(b0);
|
||||
coefficients->b1 = fix16_from_dbl(b1);
|
||||
coefficients->b2 = fix16_from_dbl(b2);
|
||||
coefficients->a0 = fix16_from_dbl(a0);
|
||||
coefficients->a1 = fix16_from_dbl(a1);
|
||||
coefficients->a2 = fix16_from_dbl(a2);
|
||||
coefficients->b0 = fix3_28_from_dbl(b0);
|
||||
coefficients->b1 = fix3_28_from_dbl(b1);
|
||||
coefficients->b2 = fix3_28_from_dbl(b2);
|
||||
coefficients->a0 = fix3_28_from_dbl(a0);
|
||||
coefficients->a1 = fix3_28_from_dbl(a1);
|
||||
coefficients->a2 = fix3_28_from_dbl(a2);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -168,12 +168,12 @@ void bqf_bandpass_skirt_config(double fs, double f0, double Q, bqf_coeff_t *coef
|
|||
a2 = a2 / a0;
|
||||
a0 = 1.0;
|
||||
|
||||
coefficients->b0 = fix16_from_dbl(b0);
|
||||
coefficients->b1 = fix16_from_dbl(b1);
|
||||
coefficients->b2 = fix16_from_dbl(b2);
|
||||
coefficients->a0 = fix16_from_dbl(a0);
|
||||
coefficients->a1 = fix16_from_dbl(a1);
|
||||
coefficients->a2 = fix16_from_dbl(a2);
|
||||
coefficients->b0 = fix3_28_from_dbl(b0);
|
||||
coefficients->b1 = fix3_28_from_dbl(b1);
|
||||
coefficients->b2 = fix3_28_from_dbl(b2);
|
||||
coefficients->a0 = fix3_28_from_dbl(a0);
|
||||
coefficients->a1 = fix3_28_from_dbl(a1);
|
||||
coefficients->a2 = fix3_28_from_dbl(a2);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -213,12 +213,12 @@ void bqf_bandpass_peak_config(double fs, double f0, double Q, bqf_coeff_t *coeff
|
|||
a2 = a2 / a0;
|
||||
a0 = 1.0;
|
||||
|
||||
coefficients->b0 = fix16_from_dbl(b0);
|
||||
coefficients->b1 = fix16_from_dbl(b1);
|
||||
coefficients->b2 = fix16_from_dbl(b2);
|
||||
coefficients->a0 = fix16_from_dbl(a0);
|
||||
coefficients->a1 = fix16_from_dbl(a1);
|
||||
coefficients->a2 = fix16_from_dbl(a2);
|
||||
coefficients->b0 = fix3_28_from_dbl(b0);
|
||||
coefficients->b1 = fix3_28_from_dbl(b1);
|
||||
coefficients->b2 = fix3_28_from_dbl(b2);
|
||||
coefficients->a0 = fix3_28_from_dbl(a0);
|
||||
coefficients->a1 = fix3_28_from_dbl(a1);
|
||||
coefficients->a2 = fix3_28_from_dbl(a2);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -257,12 +257,12 @@ void bqf_notch_config(double fs, double f0, double Q, bqf_coeff_t *coefficients)
|
|||
a2 = a2 / a0;
|
||||
a0 = 1.0;
|
||||
|
||||
coefficients->b0 = fix16_from_dbl(b0);
|
||||
coefficients->b1 = fix16_from_dbl(b1);
|
||||
coefficients->b2 = fix16_from_dbl(b2);
|
||||
coefficients->a0 = fix16_from_dbl(a0);
|
||||
coefficients->a1 = fix16_from_dbl(a1);
|
||||
coefficients->a2 = fix16_from_dbl(a2);
|
||||
coefficients->b0 = fix3_28_from_dbl(b0);
|
||||
coefficients->b1 = fix3_28_from_dbl(b1);
|
||||
coefficients->b2 = fix3_28_from_dbl(b2);
|
||||
coefficients->a0 = fix3_28_from_dbl(a0);
|
||||
coefficients->a1 = fix3_28_from_dbl(a1);
|
||||
coefficients->a2 = fix3_28_from_dbl(a2);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -300,12 +300,12 @@ void bqf_allpass_config(double fs, double f0, double Q, bqf_coeff_t *coefficient
|
|||
a2 = a2 / a0;
|
||||
a0 = 1.0;
|
||||
|
||||
coefficients->b0 = fix16_from_dbl(b0);
|
||||
coefficients->b1 = fix16_from_dbl(b1);
|
||||
coefficients->b2 = fix16_from_dbl(b2);
|
||||
coefficients->a0 = fix16_from_dbl(a0);
|
||||
coefficients->a1 = fix16_from_dbl(a1);
|
||||
coefficients->a2 = fix16_from_dbl(a2);
|
||||
coefficients->b0 = fix3_28_from_dbl(b0);
|
||||
coefficients->b1 = fix3_28_from_dbl(b1);
|
||||
coefficients->b2 = fix3_28_from_dbl(b2);
|
||||
coefficients->a0 = fix3_28_from_dbl(a0);
|
||||
coefficients->a1 = fix3_28_from_dbl(a1);
|
||||
coefficients->a2 = fix3_28_from_dbl(a2);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -353,12 +353,12 @@ void bqf_peaking_config(double fs, double f0, double dBgain, double Q,
|
|||
a2 = a2 / a0;
|
||||
a0 = 1.0;
|
||||
|
||||
coefficients->b0 = fix16_from_dbl(b0);
|
||||
coefficients->b1 = fix16_from_dbl(b1);
|
||||
coefficients->b2 = fix16_from_dbl(b2);
|
||||
coefficients->a0 = fix16_from_dbl(a0);
|
||||
coefficients->a1 = fix16_from_dbl(a1);
|
||||
coefficients->a2 = fix16_from_dbl(a2);
|
||||
coefficients->b0 = fix3_28_from_dbl(b0);
|
||||
coefficients->b1 = fix3_28_from_dbl(b1);
|
||||
coefficients->b2 = fix3_28_from_dbl(b2);
|
||||
coefficients->a0 = fix3_28_from_dbl(a0);
|
||||
coefficients->a1 = fix3_28_from_dbl(a1);
|
||||
coefficients->a2 = fix3_28_from_dbl(a2);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -406,12 +406,12 @@ void bqf_lowshelf_config(double fs, double f0, double dBgain, double Q,
|
|||
a2 = a2 / a0;
|
||||
a0 = 1.0;
|
||||
|
||||
coefficients->b0 = fix16_from_dbl(b0);
|
||||
coefficients->b1 = fix16_from_dbl(b1);
|
||||
coefficients->b2 = fix16_from_dbl(b2);
|
||||
coefficients->a0 = fix16_from_dbl(a0);
|
||||
coefficients->a1 = fix16_from_dbl(a1);
|
||||
coefficients->a2 = fix16_from_dbl(a2);
|
||||
coefficients->b0 = fix3_28_from_dbl(b0);
|
||||
coefficients->b1 = fix3_28_from_dbl(b1);
|
||||
coefficients->b2 = fix3_28_from_dbl(b2);
|
||||
coefficients->a0 = fix3_28_from_dbl(a0);
|
||||
coefficients->a1 = fix3_28_from_dbl(a1);
|
||||
coefficients->a2 = fix3_28_from_dbl(a2);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -459,16 +459,16 @@ void bqf_highshelf_config(double fs, double f0, double dBgain, double Q,
|
|||
a2 = a2 / a0;
|
||||
a0 = 1.0;
|
||||
|
||||
coefficients->b0 = fix16_from_dbl(b0);
|
||||
coefficients->b1 = fix16_from_dbl(b1);
|
||||
coefficients->b2 = fix16_from_dbl(b2);
|
||||
coefficients->a0 = fix16_from_dbl(a0);
|
||||
coefficients->a1 = fix16_from_dbl(a1);
|
||||
coefficients->a2 = fix16_from_dbl(a2);
|
||||
coefficients->b0 = fix3_28_from_dbl(b0);
|
||||
coefficients->b1 = fix3_28_from_dbl(b1);
|
||||
coefficients->b2 = fix3_28_from_dbl(b2);
|
||||
coefficients->a0 = fix3_28_from_dbl(a0);
|
||||
coefficients->a1 = fix3_28_from_dbl(a1);
|
||||
coefficients->a2 = fix3_28_from_dbl(a2);
|
||||
}
|
||||
|
||||
fix16_t bqf_transform(fix16_t x, bqf_coeff_t *coefficients, bqf_mem_t *memory) {
|
||||
fix16_t y = fix16_mul(coefficients->b0, x) -
|
||||
fix3_28_t bqf_transform(fix3_28_t x, bqf_coeff_t *coefficients, bqf_mem_t *memory) {
|
||||
fix3_28_t y = fix16_mul(coefficients->b0, x) -
|
||||
fix16_mul(coefficients->a1, memory->y_1) +
|
||||
fix16_mul(coefficients->b1, memory->x_1) -
|
||||
fix16_mul(coefficients->a2, memory->y_2) +
|
||||
|
|
|
@ -26,19 +26,19 @@
|
|||
#include "fix16.h"
|
||||
|
||||
typedef struct _bqf_coeff_t {
|
||||
fix16_t a0;
|
||||
fix16_t a1;
|
||||
fix16_t a2;
|
||||
fix16_t b0;
|
||||
fix16_t b1;
|
||||
fix16_t b2;
|
||||
fix3_28_t a0;
|
||||
fix3_28_t a1;
|
||||
fix3_28_t a2;
|
||||
fix3_28_t b0;
|
||||
fix3_28_t b1;
|
||||
fix3_28_t b2;
|
||||
} bqf_coeff_t;
|
||||
|
||||
typedef struct _bqf_mem_t {
|
||||
fix16_t x_1;
|
||||
fix16_t x_2;
|
||||
fix16_t y_1;
|
||||
fix16_t y_2;
|
||||
fix3_28_t x_1;
|
||||
fix3_28_t x_2;
|
||||
fix3_28_t y_1;
|
||||
fix3_28_t y_2;
|
||||
} bqf_mem_t;
|
||||
|
||||
// In reality we do not have enough CPU resource to run 8 filtering
|
||||
|
@ -65,7 +65,7 @@ void bqf_peaking_config(double, double, double, double, bqf_coeff_t *);
|
|||
void bqf_lowshelf_config(double, double, double, double, bqf_coeff_t *);
|
||||
void bqf_highshelf_config(double, double, double, double, bqf_coeff_t *);
|
||||
|
||||
fix16_t bqf_transform(fix16_t, bqf_coeff_t *, bqf_mem_t *);
|
||||
fix3_28_t bqf_transform(fix3_28_t, bqf_coeff_t *, bqf_mem_t *);
|
||||
void bqf_memreset(bqf_mem_t *);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -179,12 +179,12 @@ void apply_filter_configuration(filter_configuration_tlv *filters) {
|
|||
uint32_t checksum = 0;
|
||||
for (int i = 0; i < sizeof(filter6) / 4; i++) checksum ^= ((uint32_t*) args)[i];
|
||||
if (checksum != bqf_filter_checksum[filter_stages]) {
|
||||
bqf_filters_left[filter_stages].a0 = fix16_from_dbl(1.0);
|
||||
bqf_filters_left[filter_stages].a1 = fix16_from_dbl(args->a1/args->a0);
|
||||
bqf_filters_left[filter_stages].a2 = fix16_from_dbl(args->a2/args->a0);
|
||||
bqf_filters_left[filter_stages].b0 = fix16_from_dbl(args->b0/args->a0);
|
||||
bqf_filters_left[filter_stages].b1 = fix16_from_dbl(args->b1/args->a0);
|
||||
bqf_filters_left[filter_stages].b2 = fix16_from_dbl(args->b2/args->a0);
|
||||
bqf_filters_left[filter_stages].a0 = fix3_28_from_dbl(1.0);
|
||||
bqf_filters_left[filter_stages].a1 = fix3_28_from_dbl(args->a1/args->a0);
|
||||
bqf_filters_left[filter_stages].a2 = fix3_28_from_dbl(args->a2/args->a0);
|
||||
bqf_filters_left[filter_stages].b0 = fix3_28_from_dbl(args->b0/args->a0);
|
||||
bqf_filters_left[filter_stages].b1 = fix3_28_from_dbl(args->b1/args->a0);
|
||||
bqf_filters_left[filter_stages].b2 = fix3_28_from_dbl(args->b2/args->a0);
|
||||
memcpy(&bqf_filters_right[filter_stages], &bqf_filters_left[filter_stages], sizeof(bqf_coeff_t));
|
||||
bqf_filter_checksum[filter_stages] = checksum;
|
||||
}
|
||||
|
@ -198,8 +198,8 @@ void apply_filter_configuration(filter_configuration_tlv *filters) {
|
|||
if (type_changed) {
|
||||
// The memory structure stores the last 2 input samples, we can replay them into
|
||||
// the new filter rather than starting again from scratch.
|
||||
fix16_t left[2] = { bqf_filters_mem_left[filter_stages].x_2, bqf_filters_mem_left[filter_stages].x_1 };
|
||||
fix16_t right[2] = { bqf_filters_mem_right[filter_stages].x_2, bqf_filters_mem_right[filter_stages].x_1 };
|
||||
fix3_28_t left[2] = { bqf_filters_mem_left[filter_stages].x_2, bqf_filters_mem_left[filter_stages].x_1 };
|
||||
fix3_28_t right[2] = { bqf_filters_mem_right[filter_stages].x_2, bqf_filters_mem_right[filter_stages].x_1 };
|
||||
|
||||
bqf_memreset(&bqf_filters_mem_left[filter_stages]);
|
||||
bqf_memreset(&bqf_filters_mem_right[filter_stages]);
|
||||
|
@ -305,7 +305,7 @@ bool apply_configuration(tlv_header *config) {
|
|||
#ifndef TEST_TARGET
|
||||
case PREPROCESSING_CONFIGURATION: {
|
||||
preprocessing_configuration_tlv* preprocessing_config = (preprocessing_configuration_tlv*) tlv;
|
||||
preprocessing.preamp = fix16_from_dbl(1.0 + preprocessing_config->preamp);
|
||||
preprocessing.preamp = fix3_28_from_dbl(1.0 + preprocessing_config->preamp);
|
||||
preprocessing.reverse_stereo = preprocessing_config->reverse_stereo;
|
||||
break;
|
||||
}
|
||||
|
@ -546,4 +546,4 @@ void apply_config_changes() {
|
|||
apply_configuration((tlv_header*) working_configuration[active_configuration]);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -60,17 +60,36 @@ fix16_t fix16_mul(fix16_t inArg0, fix16_t inArg1) {
|
|||
return inArg0 * inArg1;
|
||||
}
|
||||
#else
|
||||
fix16_t fix16_from_s16sample(int16_t a) {
|
||||
return a * fix16_lsb;
|
||||
|
||||
/// @brief Produces a fixed point number from a 16-bit signed integer, normalized to ]-1,1[.
|
||||
/// @param a Signed 16-bit integer.
|
||||
/// @return A fixed point number in Q3.28 format, with input normalized to ]-1,1[.
|
||||
fix3_28_t norm_fix3_28_from_s16sample(int16_t a) {
|
||||
/* So, we're using a Q3.28 fixed point system here, and we want the incoming
|
||||
audio signal to be represented as a number between -1 and 1. To do this,
|
||||
we need the 16-bit value to map to the 28-bit right-of-decimal field in
|
||||
our fixed point number. 28-16 = 12, so we shift the incoming value by
|
||||
that much to covert it to the desired Q3.28 format and do the normalization
|
||||
all in one go.
|
||||
*/
|
||||
return (fix3_28_t)a << 12;
|
||||
}
|
||||
|
||||
int16_t fix16_to_s16sample(fix16_t a) {
|
||||
/// @brief Convert fixed point samples into signed integer. Used to convert
|
||||
/// calculated sample to one that the DAC can understand.
|
||||
/// @param a
|
||||
/// @return Signed 16-bit integer.
|
||||
int16_t norm_fix3_28_to_s16sample(fix3_28_t a) {
|
||||
// Handle rounding up front, adding one can cause an overflow/underflow
|
||||
|
||||
// It's not clear exactly how this works, so we'll disable it for now.
|
||||
/*
|
||||
if (a < 0) {
|
||||
a -= (fix16_lsb >> 1);
|
||||
} else {
|
||||
a += (fix16_lsb >> 1);
|
||||
}
|
||||
*/
|
||||
|
||||
// Saturate the value if an overflow has occurred
|
||||
uint32_t upper = (a >> 30);
|
||||
|
@ -85,25 +104,31 @@ int16_t fix16_to_s16sample(fix16_t a) {
|
|||
return SHRT_MAX;
|
||||
}
|
||||
}
|
||||
return (a >> 15);
|
||||
/* When we converted the USB audio sample to a fixed point number, we applied
|
||||
a normalization, or a gain of 1/65536. To convert it back, we can undo that
|
||||
by shifting it back by the same amount we shifted it in the first place. */
|
||||
return (a >> 12);
|
||||
}
|
||||
|
||||
fix16_t fix16_from_dbl(double a) {
|
||||
|
||||
fix3_28_t fix3_28_from_dbl(double a) {
|
||||
double temp = a * fix16_one;
|
||||
temp += (double)((temp >= 0) ? 0.5f : -0.5f);
|
||||
return (fix16_t)temp;
|
||||
return (fix3_28_t)temp;
|
||||
}
|
||||
|
||||
double fix16_to_dbl(fix16_t a) {
|
||||
return (double)a / fix16_one;
|
||||
}
|
||||
|
||||
// We work in 64bits then shift the result to get
|
||||
// the bit representing 1 back into the correct position.
|
||||
// i.e. 1*1 == 1, so 20000000^2 >> 25 = 20000000
|
||||
fix16_t fix16_mul(fix16_t inArg0, fix16_t inArg1) {
|
||||
/// @brief Multiplies two fixed point numbers in Q3.28 format together.
|
||||
/// @param inArg0 Q3.28 format fixed point number.
|
||||
/// @param inArg1 Q3.28 format fixed point number.
|
||||
/// @return A Q3.28 fixed point number that represents the truncated result of inArg0 x inArg1.
|
||||
fix3_28_t fix16_mul(fix3_28_t inArg0, fix3_28_t inArg1) {
|
||||
const int64_t product = (int64_t)inArg0 * inArg1;
|
||||
fix16_t result = product >> 25;
|
||||
|
||||
/* Since we're expecting 2 Q3.28 numbers, the multiplication result should be a Q7.56 number.
|
||||
To bring this number back to the right order of magnitude, we need to shift
|
||||
it to the right by 28. */
|
||||
fix3_28_t result = product >> 28;
|
||||
|
||||
// Handle rounding where we are choppping off low order bits
|
||||
// Disabled for now, too much load. We get crackling when adjusting
|
||||
// the volume.
|
||||
|
|
|
@ -32,24 +32,29 @@ typedef double fix16_t;
|
|||
static const fix16_t fix16_zero = 0;
|
||||
static const fix16_t fix16_one = 1;
|
||||
#else
|
||||
// We normalize all values into the range -32..32 with 1 extra bit for overflows
|
||||
// and one bit for the sign. We allow fixed point values to overflow, but they
|
||||
// are clipped at the point they are written back to a s16sample.
|
||||
//
|
||||
// The reason for normalizing the samples is because the filter coefficients are
|
||||
// small (usually well within in the range -32..32), by normalizing everything the coefficients
|
||||
// get lots of additional bits of precision.
|
||||
typedef int32_t fix16_t;
|
||||
static const fix16_t fix16_lsb = 0x8000;
|
||||
static const fix16_t fix16_one = 0x002000000;
|
||||
static const fix16_t fix16_zero = 0x00000000;
|
||||
|
||||
/// @brief Fixed point math type, in format Q3.28. One sign bit, 3 bits for left-of-decimal
|
||||
///and 28 for right-of-decimal. This arrangment works because we normalize the incoming USB
|
||||
///audio data to ]-1,1[ before operating on it, to push as much of the precision in the signal
|
||||
///to the right of the decimal as possible.
|
||||
typedef int32_t fix3_28_t;
|
||||
|
||||
/// @brief Represents the number 1 in Q3.28. There are 3 bits and a sign bit to the left of the
|
||||
///decimal, so 1.0000 would be represented as 0b 0001 followed by 28 zeros.
|
||||
static const fix3_28_t fix16_one = 0x10000000;
|
||||
|
||||
/// @brief Represents zero in fixed point world.
|
||||
static const fix3_28_t fix16_zero = 0x00000000;
|
||||
|
||||
#endif
|
||||
|
||||
fix16_t fix16_from_s16sample(int16_t);
|
||||
int16_t fix16_to_s16sample(fix16_t);
|
||||
fix16_t fix16_from_dbl(double);
|
||||
double fix16_to_dbl(fix16_t);
|
||||
|
||||
fix16_t fix16_mul(fix16_t, fix16_t);
|
||||
fix3_28_t norm_fix3_28_from_s16sample(int16_t);
|
||||
|
||||
int16_t norm_fix3_28_to_s16sample(fix3_28_t);
|
||||
|
||||
fix3_28_t fix3_28_from_dbl(double);
|
||||
|
||||
fix3_28_t fix16_mul(fix3_28_t, fix3_28_t);
|
||||
|
||||
#endif
|
|
@ -143,12 +143,12 @@ static void _as_audio_packet(struct usb_endpoint *ep) {
|
|||
for (int j = 0; j < filter_stages; j++) {
|
||||
// Left channel filter
|
||||
for (int i = 0; i < samples; i += 2) {
|
||||
fix16_t x_f16 = fix16_mul(fix16_from_s16sample((int16_t) out[i]), preprocessing.preamp);
|
||||
fix3_28_t x_f16 = fix16_mul(norm_fix3_28_from_s16sample((int16_t) out[i]), preprocessing.preamp);
|
||||
|
||||
x_f16 = bqf_transform(x_f16, &bqf_filters_left[j],
|
||||
&bqf_filters_mem_left[j]);
|
||||
|
||||
out[i] = (int32_t) fix16_to_s16sample(x_f16);
|
||||
out[i] = (int32_t) norm_fix3_28_to_s16sample(x_f16);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -189,12 +189,12 @@ void core1_entry() {
|
|||
|
||||
for (int j = 0; j < filter_stages; j++) {
|
||||
for (int i = 1; i < samples; i += 2) {
|
||||
fix16_t x_f16 = fix16_mul(fix16_from_s16sample((int16_t) out[i]), preprocessing.preamp);
|
||||
fix3_28_t x_f16 = fix16_mul(norm_fix3_28_from_s16sample((int16_t) out[i]), preprocessing.preamp);
|
||||
|
||||
x_f16 = bqf_transform(x_f16, &bqf_filters_right[j],
|
||||
&bqf_filters_mem_right[j]);
|
||||
|
||||
out[i] = (int16_t) fix16_to_s16sample(x_f16);
|
||||
out[i] = (int16_t) norm_fix3_28_to_s16sample(x_f16);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -773,8 +773,8 @@ static bool do_set_current(struct usb_setup_packet *setup) {
|
|||
}
|
||||
|
||||
static void _tf_send_control_in_ack(__unused struct usb_endpoint *endpoint, __unused struct usb_transfer *transfer) {
|
||||
assert(endpoint == &usb_control_in);
|
||||
assert(transfer == &_control_in_transfer);
|
||||
//assert(endpoint == &usb_control_in);
|
||||
//assert(transfer == &_control_in_transfer);
|
||||
usb_debug("_tf_setup_control_ack\n");
|
||||
static struct usb_transfer _control_out_transfer;
|
||||
usb_start_empty_transfer(usb_get_control_out_endpoint(), &_control_out_transfer, 0);
|
||||
|
|
|
@ -109,7 +109,7 @@ typedef struct _audio_device_config {
|
|||
} audio_device_config;
|
||||
|
||||
typedef struct _preprocessing_config {
|
||||
fix16_t preamp;
|
||||
fix3_28_t preamp;
|
||||
int reverse_stereo;
|
||||
} preprocessing_config;
|
||||
|
||||
|
|
Loading…
Reference in New Issue