static void apply_tns_filter(float *out, float *in, int order, int direction,
                             float *tns_coefs, int ltp_used, int w, int filt,
                             int start_i, int len)
{
    int i, j, inc, start = start_i;
    float tmp[TNS_MAX_ORDER+1];
    if (direction) {
        inc = -1;
        start = (start + len) - 1;
    } else {
        inc = 1;
    }
    if (!ltp_used) {    /* AR filter */
        for (i = 0; i < len; i++, start += inc)
            out[i] = in[start];
            for (j = 1; j <= FFMIN(i, order); j++)
                out[i] += tns_coefs[j]*in[start - j*inc];
    } else {            /* MA filter */
        for (i = 0; i < len; i++, start += inc) {
            tmp[0] = out[i] = in[start];
            for (j = 1; j <= FFMIN(i, order); j++)
                out[i] += tmp[j]*tns_coefs[j];
            for (j = order; j > 0; j--)
                tmp[j] = tmp[j - 1];
        }
    }
}