Without seeing the code that the OP has so far produced, it is difficult to propose a tailored solution.
I would, however, not be so quick as the OP to rule out using an interrupt, and would favour something similar to the way that @Cattledog has already suggested, maybe where the interrupt service routine incorporates a bit of debouncing (for the case that the pulses are ragged) and maintains a counter. In the loop (or with a timer), periodically calculate the number of pulses received in unit time to determine the pulse rate. It should be very simple. If there are reasons why an interrupt based solution is incompatible with the existing code, then those issues have to be addressed.