示例#1
0
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;
}
示例#3
0
文件: sig_tone.c 项目: yallo/plcify
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(&amp[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;
}