static void postprocessing(gsm0610_state_t *s, int16_t amp[]) { int k; int16_t msr; int16_t tmp; msr = s->msr; for (k = 0; k < GSM0610_FRAME_LEN; k++) { tmp = gsm_mult_r(msr, 28180); /* De-emphasis */ msr = saturated_add16(amp[k], tmp); /* Truncation and upscaling */ amp[k] = (int16_t) (saturated_add16(msr, msr) & 0xFFF8); } /*endfor*/ s->msr = msr; }
int main(int argc, char *argv[]) { printf("Testing 16 bit saturation\n"); if (saturate16(10000) != 10000 || saturate16(-10000) != -10000 || saturate16(32767) != 32767 || saturate16(-32768) != -32768 || saturate16(32768) != 32767 || saturate16(-32769) != -32768) { printf("Test failed.\n"); exit(2); } printf("Testing 15 bit saturation\n"); if (saturate15(10000) != 10000 || saturate15(-10000) != -10000 || saturate15(16383) != 16383 || saturate15(-16384) != -16384 || saturate15(16384) != 16383 || saturate15(-16385) != -16384) { printf("Test failed.\n"); exit(2); } printf("Testing 16 bit unsigned saturation\n"); if (saturateu16(10000) != 10000 || saturateu16(32767) != 32767 || saturateu16(65535) != 65535 || saturateu16(65536) != 65535) { printf("Test failed.\n"); exit(2); } printf("Testing 8 bit unsigned saturation\n"); if (saturateu8(100) != 100 || saturateu8(127) != 127 || saturateu8(255) != 255 || saturateu8(256) != 255) { printf("Test failed.\n"); exit(2); } printf("Testing 16 bit saturation from float\n"); if (fsaturatef(10000.0f) != 10000 || fsaturatef(-10000.0f) != -10000 || fsaturatef(32767.0f) != 32767 || fsaturatef(-32768.0f) != -32768 || fsaturatef(32768.0f) != 32767 || fsaturatef(-32769.0f) != -32768) { printf("Test failed.\n"); exit(2); } printf("Testing 16 bit saturation from double\n"); if (fsaturate(10000.0) != 10000 || fsaturate(-10000.0) != -10000 || fsaturate(32767.0) != 32767 || fsaturate(-32768.0) != -32768 || fsaturate(32768.0) != 32767 || fsaturate(-32769.0) != -32768) { printf("Test failed.\n"); exit(2); } printf("Testing 16 bit fast saturation from float\n"); if (ffastsaturatef(10000.0f) != 10000 || ffastsaturatef(-10000.0f) != -10000 || ffastsaturatef(32767.0f) != 32767 || ffastsaturatef(-32768.0f) != -32768 || ffastsaturatef(32768.0f) != 32767 || ffastsaturatef(-32769.0f) != -32768) { printf("Test failed.\n"); exit(2); } printf("Testing 16 bit fast saturation from double\n"); if (ffastsaturate(10000.0) != 10000 || ffastsaturate(-10000.0) != -10000 || ffastsaturate(32767.0) != 32767 || ffastsaturate(-32768.0) != -32768 || ffastsaturate(32768.0) != 32767 || ffastsaturate(-32769.0) != -32768) { printf("Test failed.\n"); exit(2); } printf("Testing 16 bit float saturation from float\n"); if (ffsaturatef(10000.0f) != 10000.0f || ffsaturatef(-10000.0f) != -10000.0f || ffsaturatef(32767.0f) != 32767.0f || ffsaturatef(-32768.0f) != -32768.0f || ffsaturatef(32768.0f) != 32767.0f || ffsaturatef(-32769.0f) != -32768.0f) { printf("Test failed.\n"); exit(2); } printf("Testing 16 bit double saturation from double\n"); if (ffsaturate(10000.0) != 10000.0 || ffsaturate(-10000.0) != -10000.0 || ffsaturate(32767.0) != 32767.0 || ffsaturate(-32768.0) != -32768.0 || ffsaturate(32768.0) != 32767.0 || ffsaturate(-32769.0) != -32768.0) { printf("Test failed.\n"); exit(2); } printf("Testing 16 bit add\n"); if (saturated_add16(10000, 10000) != 20000 || saturated_add16(10000, -10000) != 0 || saturated_add16(-10000, 10000) != 0 || saturated_add16(-10000, -10000) != -20000 || saturated_add16(-30000, -30000) != INT16_MIN || saturated_add16(30000, 30000) != INT16_MAX) { printf("Test failed.\n"); exit(2); } printf("Testing 32 bit add\n"); if (saturated_add32(10000, 10000) != 20000 || saturated_add32(10000, -10000) != 0 || saturated_add32(-10000, 10000) != 0 || saturated_add32(-10000, -10000) != -20000 || saturated_add32(-2000000000, -2000000000) != INT32_MIN || saturated_add32(2000000000, 2000000000) != INT32_MAX) { printf("Test failed.\n"); exit(2); } printf("Testing 16 bit subtract\n"); if (saturated_sub16(10000, 10000) != 0 || saturated_sub16(10000, -10000) != 20000 || saturated_sub16(-10000, 10000) != -20000 || saturated_sub16(-10000, -10000) != 0 || saturated_sub16(-30000, 30000) != INT16_MIN || saturated_sub16(30000, -30000) != INT16_MAX) { printf("Test failed.\n"); exit(2); } printf("Testing 32 bit subtract\n"); if (saturated_sub32(10000, 10000) != 0 || saturated_sub32(10000, -10000) != 20000 || saturated_sub32(-10000, 10000) != -20000 || saturated_sub32(-10000, -10000) != 0 || saturated_sub32(-2000000000, 2000000000) != INT32_MIN || saturated_sub32(2000000000, -2000000000) != INT32_MAX) { printf("Test failed.\n"); exit(2); } printf("Testing 16 x 16 => 16 bit multiply\n"); if (saturated_mul16(100, 100) != 0 || saturated_mul16(255, 255) != 1 || saturated_mul16(32767, -32768) != -32767 || saturated_mul16(-32768, 32767) != -32767 || saturated_mul16(32767, 32767) != 32766 || saturated_mul16(-32768, -32768) != 32767) { printf("Test failed.\n"); exit(2); } printf("Testing 16 x 16 => 32 bit multiply\n"); if (saturated_mul16_32(100, 100) != 20000 || saturated_mul16_32(-100, 100) != -20000 || saturated_mul16_32(32767, -32768) != -2147418112 || saturated_mul16_32(-32768, 32767) != -2147418112 || saturated_mul16_32(32767, 32767) != 2147352578 || saturated_mul16_32(-32768, -32768) != -2147483648) { printf("Test failed.\n"); exit(2); } printf("Testing 16 bit absolute\n"); if (saturated_abs16(10000) != 10000 || saturated_abs16(-10000) != 10000 || saturated_abs16(32767) != 32767 || saturated_abs16(-32768) != 32767) { printf("Test failed.\n"); exit(2); } printf("Tests passed.\n"); return 0; }
SPAN_DECLARE(int) sig_tone_tx(sig_tone_tx_state_t *s, int16_t amp[], int len) { int i; int j; int k; int n; int16_t tone; int need_update; int high_low; for (i = 0; i < len; i += n) { if (s->current_tx_timeout) { if (s->current_tx_timeout <= len - i) { n = s->current_tx_timeout; need_update = TRUE; } else { n = len - i; need_update = FALSE; } s->current_tx_timeout -= n; } else { n = len - i; need_update = FALSE; } if (!(s->current_tx_tone & SIG_TONE_TX_PASSTHROUGH)) vec_zeroi16(&[i], n); /*endif*/ if ((s->current_tx_tone & (SIG_TONE_1_PRESENT | SIG_TONE_2_PRESENT))) { /* Are we in the early phase (high tone energy level), or the sustaining phase (low tone energy level) of tone generation? */ /* This doesn't try to get the high/low timing precise, as there is no value in doing so. It works block by block, and the blocks are normally quite short. */ if (s->high_low_timer > 0) { if (n > s->high_low_timer) n = s->high_low_timer; s->high_low_timer -= n; high_low = 0; } else { high_low = 1; } /*endif*/ for (k = 0; k < s->desc->tones; k++) { if ((s->current_tx_tone & tone_present_bits[k]) && s->phase_rate[k]) { for (j = i; j < i + n; j++) { tone = dds_mod(&s->phase_acc[k], s->phase_rate[k], s->tone_scaling[k][high_low], 0); amp[j] = saturated_add16(amp[j], tone); } /*endfor*/ } /*endif*/ } } /*endif*/ if (need_update && s->sig_update) s->sig_update(s->user_data, SIG_TONE_TX_UPDATE_REQUEST, 0, 0); /*endif*/ } /*endfor*/ return len; }