Пример #1
0
dsp32_t dsp32_op_ln(dsp32_t number)
{
    S64 res;
    extern S64 dsp32_op_ln_raw(dsp32_t num);

    res = dsp32_op_ln_raw(number);

    if (res < ((S64) DSP_Q_MIN(DSP32_QA, DSP32_QB)))
        return DSP_Q_MIN(DSP32_QA, DSP32_QB);

    return (dsp32_t) res;
}
Пример #2
0
dsp16_t dsp16_op_ln(dsp16_t number)
{
    S32 res;
    extern S32 dsp16_op_ln_raw(dsp16_t num);

    res = dsp16_op_ln_raw(number);

    if (res < ((S32) DSP_Q_MIN(DSP16_QA, DSP16_QB)))
        return DSP_Q_MIN(DSP16_QA, DSP16_QB);

    return (dsp16_t) res;
}
Пример #3
0
dsp32_t dsp32_op_log10(dsp32_t number)
{
  S64 res;
  const S64 cst_ln2 = (S64) ((1./CST_LN_10)*(1LL << DSP32_QB));
  extern S64 dsp32_op_ln_raw(dsp32_t num);

  res = dsp32_op_ln_raw(number);

  if (res == DSP_Q_MIN(DSP32_QA, DSP32_QB) || res < ((S64) -0x8000000000000000LL)/cst_ln2)
    return DSP_Q_MIN(DSP32_QA, DSP32_QB);

  res = (res*cst_ln2) >> DSP32_QB;

  if (res < ((S64) DSP_Q_MIN(DSP32_QA, DSP32_QB)))
    return (dsp32_t) DSP_Q_MIN(DSP32_QA, DSP32_QB);

  return (dsp32_t) res;
}
Пример #4
0
dsp16_t dsp16_op_log10(dsp16_t number)
{
  S32 res;
  const S32 cst_ln2 = (S32) DSP_Q(32-DSP16_QB, DSP16_QB, 1./CST_LN_10);
  extern S32 dsp16_op_ln_raw(dsp16_t num);

  res = dsp16_op_ln_raw(number);

  if (res == DSP_Q_MIN(DSP16_QA, DSP16_QB) || res < ((S32) 0x80000000)/cst_ln2)
    return DSP_Q_MIN(DSP16_QA, DSP16_QB);

  res = (res*cst_ln2) >> DSP16_QB;

  if (res < ((S32) DSP_Q_MIN(DSP16_QA, DSP16_QB)))
    return (dsp16_t) DSP_Q_MIN(DSP16_QA, DSP16_QB);

  return (dsp16_t) res;
}
dsp32_t dsp32_vect_max(dsp32_t *vect1, int size)
{
  typedef dsp32_t (*max_end_kernel_opti_t)(dsp32_t *, dsp32_t);
  static const max_end_kernel_opti_t max_end_kernel_opti[4] = {
    dsp32_vect_max_end_kernel_x0,
    dsp32_vect_max_end_kernel_x1,
    dsp32_vect_max_end_kernel_x2,
    dsp32_vect_max_end_kernel_x3
  };
  int n;
  dsp32_t max = (dsp32_t) DSP_Q_MIN(DSP32_QA, DSP32_QB);

  n = dsp32_vect_max_kernel_ext(vect1, size, &max);

  // Jump on different functions depending on the length of the vectors to compute
  return max_end_kernel_opti[size&0x3](&vect1[n], max);
}
Пример #6
0
//! This function is used to get a Q formatted number
int dsp_debug_read_q(int a, int b)
{
  int i = 0;
  int zeros = 1;
  int q_num;
  char c;
  int integer = 0, decimal = 0, sign = 1;
  int _10log10;
  char data[32], *pdata;
  S64 temp;

  while(i < sizeof(data))
  {
    c = dsp_debug_read_fct();
    data[i++] = c;
    if ((c < '0' || c > '9') && (c != '.' && c != ',' && c != '-'))
      break;
  }
  // Take care of the sign
  pdata = data;
  if (*pdata == '-')
  {
    sign = -1;
    pdata++;
  }

  if ((integer = dsp_debug_parse_int(pdata)) == -1)
    integer = 0;

  // If overflow
  if (integer >= (1 << (a-1)))
  {
    if (sign == 1)
      return DSP_Q_MAX(a, b);
    else
      return DSP_Q_MIN(a, b);
  }

  // Switch to decimal data
  for(i=0; (pdata[i] >= '0' && pdata[i] <= '9') || pdata[i] <= '-'; i++);

  if (pdata[i] == '.' || pdata[i] == ',')
  {
    // Count the number of zeros before the first plain number
    for(; pdata[i+1] == '0'; i++, zeros *= 10);
    if ((decimal = dsp_debug_parse_int(&pdata[i+1])) == -1)
      decimal = 0;
  }

  // decimal/(10^(log10(decimal)+1))
  // Calculation of the integer part of log10
  _10log10 = 1;
  while(_10log10 <= decimal)
    _10log10 *= 10;
  _10log10 *= zeros;

  temp = decimal;
  temp <<= b;
  temp /= _10log10;

  q_num = temp + (integer << b);
  q_num *= sign;

  return q_num;
}