A small rundown on visual/audible artefacts and their causes so that they can be better identified.
Low frequency PWM dimming :
LEDs can be dimmed in two ways, either by lowering the drive current, that’s analog dimming, or by rapidly turning the LED ON and Off, that’s PWM dimming.
PWM dimming can be visible when the switching frequency is too low, below 100~300Hz depending on people, even when not clearly visible it can be uncomfortable. The solutions are to use higher frequency PWM or analog dimming.
PWM dimming can produce audible noise when the switching frequency is in the audible range, up to 16~20kHz. The components that generates the noise are usually MLCCs (multilayer ceramic capacitors) and sometimes inductors (coils). The solutions are to not use noise generating components, use >16~20kHz PWM or analog dimming.
Regulator instability :
Due to various reasons, the regulator can be unstable, for example not enough input/output capacitance, inadequate compensation (for the regulator feedback loop or constant current regulation feedback loop).
In the case of the Nov-mu (or others FF model before the new 2022 drivers) mentionned by @tiry31 above, it is not enough input capacitance, in combination with higher impedance/DCIR (lower current/older) cells, the output can be unstable and oscillate, when the oscillations frequency is in the audible range and large enough, the MLCCs and/or inductor generates audible noise.
This usually happens at medium to high output, rarely at low output. The oscillations being nearly always at highish frequencies this will not generate visual artefacts.
Solution : hardware fix.
Regulator low switching frequency :
To save power, a boost/buck regulator can decrease its switching frequency at light loads, from 200-2500kHz it can go as low as tens of Hz at extremely low output.
In the audible range the MLCCs/inductor can generate audible noise, although high frequency regulators that are able to do very short pulses will usually not make the MLCC generate noise, boost converters seem worse than buck in that regard.
At too low frequency it can be visible.
Solutions are mostly hardware : not use a light load efficiency mode (but then high current draw at low output), add a resistor load in parallel to the LED to prevent the switching frequency going too low (for flickering), use an Ultrasonic mode when the IC is capable…
Low frequency PWM control signal passing to the output :
This is the effect mentionned by @ToyKeeper above.
With analog dimming, the constant current regulator will usually be controlled by a voltage signal, a certain voltage will produce a certain current, half of that voltage half of that current… etc.
A microcontroller being digital must convert the digital signal to analog, ideally with a Digital to Analog Converter (DAC), but when there is no DAC or we want more resolution then a PWM signal that is smoothed out with a Low Pass Filter (LFP) can be used, this is what most flashlight driver do. The result is an ”analog” signal with a ripple voltage, for example with the Noctigon linear driver values at 4kHz (before dynamic PWM)
(Nevermind the voltage, I put 100V so that we can reason in %)
The ripple voltage at low duty cycle is about 8%, which translates to 8% current ripple.
With dynamic PWM the maximum frequency is 16kHz :
Ripple is reduced to ~2%
But for low lows, the resolution is increased and the PWM frequency decreases to 61Hz (? with 16bits for 2ch ?) At minimum :
Not enough filtering anymore (400ish % ripple) because the pulses are too spaced out and at 61Hz this will look quite flickery.
One solution (hardware) is too increase the strength of the LPF, for example by 10times :
Now the ripple is about 40%, which at low output might be sufficiently low to not be visible. The side effect is that the rise/fall time is longer, if you noticed it took about 10ms before to reach the target voltage/current, now it takes 100ms. This mostly affects strobe modes as they are now not able to turn the LED ON and OFF quick enough.
Electronic noise at very low sense voltages:
A constant current driver will regulate the current by sensing the voltage across a current sense resisor, with Ohm’s law Vsense=Iout×Rsense.
Still using the Noctigon linear drivers example Rsense=10mR, (max) Vsense=50mV, thus Iout=Vsense/Rsense=50/10=5A.
This Vsense is compared with an Operational Amplifier to the control signal, also 50mV, that’s how we control the output. At these voltages all is well, but as we reduce the control signal to dim the light to very low output, the sense and control voltages becomes proportionally very low and around 100-50uV (500-1000 times lower) circuit noise starts to become relatively important and so the output will be noisy, more so in noisier boost/buck drivers. This looks kind of like Anduril candle mode.