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; }
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; }
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; }
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); }
//! 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; }