#define STEP_SIZE           400

U0 LowPassFilterDemo()
{
    F64   y, y1, t, dt;
    CDC  *dc = DCAlias;

    WinBorder;
    WinMax;
    DocClear;

    dc->color = BLUE;
    GrLine(dc, 0, 0, 0, STEP_SIZE);
    GrLine(dc, 0, STEP_SIZE, GR_WIDTH / 2, STEP_SIZE);
    GrLine(dc, GR_WIDTH / 2, STEP_SIZE, GR_WIDTH / 2, 0);
    GrLine(dc, GR_WIDTH / 2, 0, GR_WIDTH, 0);
    PressAKey;

    dc->color = CYAN;
    t = 0;
    y = 0.0;
    while (t < GR_WIDTH)
    {
        dt = 1.0;
        if (t < GR_WIDTH / 2)
            y1 = STEP_SIZE - STEP_SIZE * Exp(-0.01 * t);
        else
            y1 = STEP_SIZE * Exp(-0.01 * (t - GR_WIDTH / 2));
        GrLine(dc, t, y, t + dt, y1);
        y = y1;
        t += dt;
    }
    PressAKey;

    dc->color = BLACK;
    t = 0;
    y = 0.0;
    while (t < GR_WIDTH)
    {
        dt = 1.0;
        if (t < GR_WIDTH / 2)
            y1 = 0.99 * y + .01 * STEP_SIZE;
        else
            y1 = 0.99 * y;
        GrLine(dc, t, y, t + dt, y1);
        y = y1;
        t += dt;
    }
    PressAKey;

    dc->color = RED;
    t = 0;
    y = 0.0;
    while (t < GR_WIDTH)
    {
        dt = Rand / 10;
        if (t < GR_WIDTH / 2)
            y1 = LowPass1(.01, y, STEP_SIZE, dt);
        else
            y1 = LowPass1(.01, y, 0, dt);
        GrLine(dc, t, y, t + dt, y1);
        y = y1;
        t += dt;
    }
    PressAKey;

    dc->color = GREEN;
    t = 0;
    y = 0.0;
    while (t < GR_WIDTH)
    {
        dt = Rand / 10;
        if (t < GR_WIDTH / 2)
            y1 = LowPass1(.1, y, STEP_SIZE, dt);
        else
            y1 = LowPass1(.1, y, 0, dt);
        GrLine(dc, t, y, t + dt, y1);
        y = y1;
        t += dt;
    }
    PressAKey;

    DCDel(dc);
    DCFill;
}

LowPassFilterDemo;