Confused by oscilloscope - square wave signal to RPM

This should also be marked a volatile because it is updated in an ISR and read elsewhere, possibly asynchronously.

Since pulse is > 1 byte, you need to suspend interrupts, during the time you make a copy of it, in order to avoid reading it in a half updated state (non-atomic read operation).

The second part you have effectively done, however you are doing much more while interrupts are suspended than necessary.

EDIT

This would minimise the time interrupts are suspended:

noInterrupts();
unsigned long pulseCopy = pulse ;
interrupts();
  // This would be where you get 'thisMedian'
  // from the median filter.
  thisMedian = medianFilter.AddValue (pulseCopy);  // pulseCopy