Как работать с форматом Q15? Как вообще тип данных float преобразовать в Q15. Можете привести пример?

141
22 июля 2021, 01:10

Как вообще тип данных 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;
        }
    }
Answer 1

Судя по тому, что я прочитал, должно быть как-то так:

int16_t ftoq15(float f)
{
  bool neg = f < 0;
  if (neg) f = -f;
  f = f * 32768 + .5;
  return (int)f | (neg ? 1 << 15 : 0);
}

Никаких тестовых данных ты не привёл, так что я ничего не проверял.

Answer 2

Q15 значит, что это число с фиксированной точкой, с 15 битами после точки.

Чтобы из float сделать Q15, надо умножить его на 215 и округлить:

y = lround(x * 0x1p15f)

Обратное преобразование:

x = y / 0x1p15f
READ ALSO
Столкнулся с проблемой cannot find symbol

Столкнулся с проблемой cannot find symbol

Я новичок в Java поэтому не судите строгоЯ пытался потренироваться но столкнулся с проблемой что компилятор не понимает символ

241
Поиск совпадений эл-та массива с ключом hashmap

Поиск совпадений эл-та массива с ключом hashmap

Я написал метод, на вход которого приходит путь к папке, где лежат файлы, имена которых будем сравнивать с ключами HashMap, а так же массив имен...

300
Hibernate: использование StaticMetamodel

Hibernate: использование StaticMetamodel

Установка и настройка

281
Ошибка при запуске Apache Tomcat в Windows 10, (Непредвиденное появление: Files\Java\jdk-12.0.2&ldquo;&rdquo;) как можно исправить? [закрыт]

Ошибка при запуске Apache Tomcat в Windows 10, (Непредвиденное появление: Files\Java\jdk-12.0.2“”) как можно исправить? [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

132