Как вообще тип данных float преобразовать в Q15 в данном коде? Можете привести пример? Нужно вычислять что то, но не знаю как именно. Спасибо.
void compexp(short CT, short CS, short ET, short ES) {
//void compexp(0x7333, 0x7333, 0x7333, 0x7333) {
float tav = 0.01;
float at = 0.03;
float rt = 0.003;
// int delay = 150;
int xrms = 0;
int g = 1;
DATA buffer[150] = {0};
int i;
for (i = 0; i < W_LEN; ++i) {
rin[i] = buf_in_right_1[i];
lin[i] = buf_in_left_1[i];
}
for(i = 0; i < W_LEN; ++i) {
xrms = (1 -tav) * xrms + tav * pow(rin[i], 2);
float X = 10 * log(xrms);
float G = min(0, CS * (CT - X), ES * (ET - X));
int f = pow (10, G / 20);
float coeff;
if (f < g) {
coeff = at;
} else {
coeff = rt;
}
g = (1 - coeff) * g + coeff * f;
buf_out_right_1[i] = g * buffer[149];
buf_out_left_1[i] = g * buffer[149];
buffer[0] = buf_in_left_1[i];
}
}
while (1) {
if (effect_flag == EFFECT_FLAG) {
compexp(1, 0.5, 1, -0.5);
buf_out_left_1 = buf_in_left_1;
buf_out_right_1 = buf_in_right_1;
effect_flag = NO_EFFECT_FLAG;
}
}
Судя по тому, что я прочитал, должно быть как-то так:
int16_t ftoq15(float f)
{
bool neg = f < 0;
if (neg) f = -f;
f = f * 32768 + .5;
return (int)f | (neg ? 1 << 15 : 0);
}
Никаких тестовых данных ты не привёл, так что я ничего не проверял.
Q15 значит, что это число с фиксированной точкой, с 15 битами после точки.
Чтобы из float
сделать Q15, надо умножить его на 215 и округлить:
y = lround(x * 0x1p15f)
Обратное преобразование:
x = y / 0x1p15f
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Я новичок в Java поэтому не судите строгоЯ пытался потренироваться но столкнулся с проблемой что компилятор не понимает символ
Я написал метод, на вход которого приходит путь к папке, где лежат файлы, имена которых будем сравнивать с ключами HashMap, а так же массив имен...
Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском