The 'BPM' and the 'phase...' are float variables. You should avoid them to keep it fast.
I think the compiler will help you and pre-calculate the value, but you better use only integers in the loop().
Printing text to the serial monitor makes it slow, even with a high baudrate.
You don't have a limit of how many text is printed, the Serial.print() is in the loop() and the loop() runs free at maximum speed.
Remove those Serial.print() and check the speed.
Where can I find the source code and usage of the beatsin16() function ?