I changed it into CHANGE because i tried to read 3 positions of the signal, for example 500microsec, 1000microsec and 1500microsec, but that doesn´t work.
This doesn’t make sense.
You are attaching the interrupt handler, requesting that it be called whenever the pin goes from HIGH to LOW or from LOW to HIGH - in other words whenever there is a change.
attachInterrupt(0, IRQ, CHANGE); // both edges
In the IRQ function, you use digitalRead() to see what the change was, if it is important. If the return value is HIGH, the transition that triggered the interrupt was from LOW to HIGH (because the pin is now HIGH). If the return value is LOW, the transition that triggered the interrupt was from HIGH to LOW (because the pin is now LOW).
In the IRQ function, you should record WHEN the function was called, if the digitalRead value is HIGH (the trigger was the pin going from LOW to HIGH), then return.
If the digitalRead value is LOW (the trigger was the pin going from HIGH to LOW), then the time since the last call to IRQ tells you whether the pin was HIGH for the required duration, or not.
It is that duration, or true/false decision based on duration, that loop() should be paying attention to.
It is not clear what the code should do if the PPM signal is HIGH for the required duration, or what it should do if the PPM signal is NOT HIGH for the require duration.
The blinking/fading of the LEDs does not seem to relate to the length of the PPM HIGH pulse that I can see.