Over the past couple days I have spent hours deliberating over the code and, honestly, I give up.
I removed the median filter library, because I found it to be doing precisely jack. Or - probably more accurately - I can't get it to work. In the previous posted code thisMedian was just reading effectively straight from the ISR without any filtering happening. I also removed the RPM calculation for simplicity, to lower calculations, and instead called the neopixels based on the timing directly.
I thought I had the smoothing/timing situation sorted, but it turns out the timing is just too narrow at higher revs to filter out spurious results. The problem is, ultimately, the arduino has no idea what a spurious result is as they just come too thick and fast for averaging out the numbers to work. I found alot of "averages" would be averages of the spurious readings, rendering the new averages moot...
I tried using an array to average, both of the timing output itself and the RPM calcuation, and if Im using about 10 indices, its simply not accurate enough. If I use more than that, the program crashes. If i use 10, and then average every second array-average, it also crashes.
Frankly I'm at my wit's end with this project and I'm spending too much time thinking about it. To add insult to injury, my old sketch with pulsein() for some reason doesn't work reliably anymore despite no hardware changes (well I added a jumper between pins 3 and 8 and changed the headlight input from pin 8 to pin 10 but so what?). I have an idea to get revs from the can-bus, so I think I might give that a go instead and scrap the IGT wire. It seems to simply be too noisy for any reliable RPM reading. I've tried using an OBD reader that communicates over I2C before the pulsin() sketch, and it was way too slow and actually surprisingly innaccurate.
Thanks for the help everyone. I may revisit this at a later stage but for now I'm putting this project to sleep.