static int set_auto_gain(sensor_t *sensor, int enable, float gain_db, float gain_db_ceiling) { uint8_t reg; int ret = cambus_readb(sensor->slv_addr, BANK_SEL, ®); ret |= cambus_writeb(sensor->slv_addr, BANK_SEL, reg | BANK_SEL_SENSOR); ret |= cambus_readb(sensor->slv_addr, COM8, ®); ret |= cambus_writeb(sensor->slv_addr, COM8, (reg & (~COM8_AGC_EN)) | ((enable != 0) ? COM8_AGC_EN : 0)); if ((enable == 0) && (!isnanf(gain_db)) && (!isinff(gain_db))) { float gain = IM_MAX(IM_MIN(fast_expf((gain_db / 20.0) * fast_log(10.0)), 32.0), 1.0); int gain_temp = fast_roundf(fast_log2(IM_MAX(gain / 2.0, 1.0))); int gain_hi = 0xF >> (4 - gain_temp); int gain_lo = IM_MIN(fast_roundf(((gain / (1 << gain_temp)) - 1.0) * 16.0), 15); ret |= cambus_writeb(sensor->slv_addr, GAIN, (gain_hi << 4) | (gain_lo << 0)); } else if ((enable != 0) && (!isnanf(gain_db_ceiling)) && (!isinff(gain_db_ceiling))) {
static int set_auto_gain(sensor_t *sensor, int enable, float gain_db, float gain_db_ceiling) { uint8_t reg; int ret = cambus_readb(sensor->slv_addr, REG_COM8, ®); ret |= cambus_writeb(sensor->slv_addr, REG_COM8, (reg & (~REG_COM8_AGC)) | ((enable != 0) ? REG_COM8_AGC : 0)); if ((enable == 0) && (!isnanf(gain_db)) && (!isinf(gain_db))) { float gain = IM_MAX(IM_MIN(fast_expf((gain_db / 20.0) * fast_log(10.0)), 128.0), 1.0); int gain_temp = fast_roundf(fast_log2(IM_MAX(gain / 2.0, 1.0))); int gain_hi = 0x3F >> (6 - gain_temp); int gain_lo = IM_MIN(fast_roundf(((gain / (1 << gain_temp)) - 1.0) * 16.0), 15); ret |= cambus_writeb(sensor->slv_addr, REG_GAIN, ((gain_hi & 0x0F) << 4) | (gain_lo << 0)); ret |= cambus_readb(sensor->slv_addr, REG_VREF, ®); ret |= cambus_writeb(sensor->slv_addr, REG_VREF, ((gain_hi & 0x30) << 2) | (reg & 0x3F)); } else if ((enable != 0) && (!isnanf(gain_db_ceiling)) && (!isinf(gain_db_ceiling))) {
static void mfcc_slopes_dump2(RecurAudioBinner *ab){ int i; int wsize = ab->window_size / ab->value_size; TemporalPPM *ppm = temporal_ppm_alloc(ab->n_bins, wsize, "mfcc", 0, PGM_DUMP_GREY, NULL); GstFFTF32Complex *f = calloc(sizeof(float), ab->window_size + 2); for (i = 0; i <= wsize; i++){ f[i].r = 1.0f; f[i].i = 1.0f; float *row = recur_bin_complex(ab, f); for (int j = 0; j < ab->n_bins; j++){ row[j] = fast_expf(row[j]); } temporal_ppm_add_row(ppm, row); f[i].r = 0.0f; f[i].i = 0.0f; } free(f); temporal_ppm_free(ppm); }
void imlib_illuminvar(image_t *img) // http://ai.stanford.edu/~alireza/publication/cic15.pdf { switch(img->bpp) { case IMAGE_BPP_BINARY: { break; } case IMAGE_BPP_GRAYSCALE: { break; } case IMAGE_BPP_RGB565: { for (int y = 0, yy = img->h; y < yy; y++) { uint16_t *row_ptr = IMAGE_COMPUTE_RGB565_PIXEL_ROW_PTR(img, y); for (int x = 0, xx = img->w; x < xx; x++) { int pixel = IMAGE_GET_RGB565_PIXEL_FAST(row_ptr, x); #ifdef IMLIB_ENABLE_INVARIANT_TABLE int rgb565 = invariant_table[pixel]; #else float r_lin = xyz_table[COLOR_RGB565_TO_R8(pixel)] + 1.0; float g_lin = xyz_table[COLOR_RGB565_TO_G8(pixel)] + 1.0; float b_lin = xyz_table[COLOR_RGB565_TO_B8(pixel)] + 1.0; float r_lin_sharp = (r_lin * 0.9968f) + (g_lin * 0.0228f) + (b_lin * 0.0015f); float g_lin_sharp = (r_lin * -0.0071f) + (g_lin * 0.9933f) + (b_lin * 0.0146f); float b_lin_sharp = (r_lin * 0.0103f) + (g_lin * -0.0161f) + (b_lin * 0.9839f); float lin_sharp_avg = r_lin_sharp * g_lin_sharp * b_lin_sharp; lin_sharp_avg = (lin_sharp_avg > 0.0f) ? fast_cbrtf(lin_sharp_avg) : 0.0f; float r_lin_sharp_div = 0.0f; float g_lin_sharp_div = 0.0f; float b_lin_sharp_div = 0.0f; if (lin_sharp_avg > 0.0f) { lin_sharp_avg = 1.0f / lin_sharp_avg; r_lin_sharp_div = r_lin_sharp * lin_sharp_avg; g_lin_sharp_div = g_lin_sharp * lin_sharp_avg; b_lin_sharp_div = b_lin_sharp * lin_sharp_avg; } float r_lin_sharp_div_log = (r_lin_sharp_div > 0.0f) ? fast_log(r_lin_sharp_div) : 0.0f; float g_lin_sharp_div_log = (g_lin_sharp_div > 0.0f) ? fast_log(g_lin_sharp_div) : 0.0f; float b_lin_sharp_div_log = (b_lin_sharp_div > 0.0f) ? fast_log(b_lin_sharp_div) : 0.0f; float chi_x = (r_lin_sharp_div_log * 0.7071f) + (g_lin_sharp_div_log * -0.7071f) + (b_lin_sharp_div_log * 0.0000f); float chi_y = (r_lin_sharp_div_log * 0.4082f) + (g_lin_sharp_div_log * 0.4082f) + (b_lin_sharp_div_log * -0.8164f); float e_t_x = 0.9326f; float e_t_y = -0.3609f; float p_th_00 = e_t_x * e_t_x; float p_th_01 = e_t_x * e_t_y; float p_th_10 = e_t_y * e_t_x; float p_th_11 = e_t_y * e_t_y; float x_th_x = (p_th_00 * chi_x) + (p_th_01 * chi_y); float x_th_y = (p_th_10 * chi_x) + (p_th_11 * chi_y); float r_chi = (x_th_x * 0.7071f) + (x_th_y * 0.4082f); float g_chi = (x_th_x * -0.7071f) + (x_th_y * 0.4082f); float b_chi = (x_th_x * 0.0000f) + (x_th_y * -0.8164f); float r_chi_invariant = fast_expf(r_chi); float g_chi_invariant = fast_expf(g_chi); float b_chi_invariant = fast_expf(b_chi); float chi_invariant_sum = r_chi_invariant + g_chi_invariant + b_chi_invariant; float r_chi_invariant_m = 0.0f; float g_chi_invariant_m = 0.0f; float b_chi_invariant_m = 0.0f; if (chi_invariant_sum > 0.0f) { chi_invariant_sum = 1.0f / chi_invariant_sum; r_chi_invariant_m = r_chi_invariant * chi_invariant_sum; g_chi_invariant_m = g_chi_invariant * chi_invariant_sum; b_chi_invariant_m = b_chi_invariant * chi_invariant_sum; } int r_chi_invariant_m_int = IM_MAX(IM_MIN(r_chi_invariant_m * 255.0f, COLOR_R8_MAX), COLOR_R8_MIN); int g_chi_invariant_m_int = IM_MAX(IM_MIN(g_chi_invariant_m * 255.0f, COLOR_G8_MAX), COLOR_G8_MIN); int b_chi_invariant_m_int = IM_MAX(IM_MIN(b_chi_invariant_m * 255.0f, COLOR_B8_MAX), COLOR_B8_MIN); int rgb565 = COLOR_R8_G8_B8_TO_RGB565(r_chi_invariant_m_int, g_chi_invariant_m_int, b_chi_invariant_m_int); #endif IMAGE_PUT_RGB565_PIXEL_FAST(row_ptr, x, rgb565); } } break; } default: { break; } } }