The code looks very nice and noise processor is reusable. That's great and I have an idea that I could try using it for.
I've noticed this spot:
float* fmData = fm.getSize() > 0 ? fm.getData() : nullptr;
Usually I deal with optional FM like this
So a single template function is used and compiler can generate the desired version and eliminate conditional check in either of them.
Regarding output sign, we'll have to wait for @mars to comment about this invertion, but I assume that it gets done in hardware. It would make sense to let firmware invert it on devices with such behavior to restore correct sign, especially if DC coupled output is used.