Here's a start:
int minimum ;
int maximum ;
unsigned long start_time ;
void read_rate ()
{
start_time = millis () ;
int value = read () ;
minimum = maximum = value ;
while (millis () - start_time < 500)
{
value = read () ;
// now deal with maintaining minimum and maximum
..
}
..
}