A search on the web was unsatisfactory. I only found rather primitive circuits and hence decided to roll my own. This is the 2nd version with a reduced compontent-count and better stability.
No warranty: This circuit comes with no warranty of any kind. If it fries your computer, burns down your house and empties you bank-account, that is not my problem.
This circuit assumes the PWM output uses an open-collector/open-drain design at around 25kHz, as is standard for PWM-controlled PC fans. The voltage the open-collector PWM driver sees is about 3V, which is in line with the suggestions from the PWM signal spec. The LC low-pass filter does the conversion from PWM to voltage. A standard LM324 then drives a PNP transistor that drives the fan. The pull-up resistor at the the output of the LM324 is needed, because the LM324 cannot reach the positive voltage rail. The 330R resistor needs to be a 0.5W type, the rest is non-critical.
For the unused amplifiers, tie their output to the negative input and the positive input to GND. You could in theory also use the LM358 (dual version) or even the LM321 (single version), but at least from my supplier they are more expensive than the LM324. You could also use OpAmps like the TLC271 (slow mode).
On the bottom, there is an optional circuit for adjusting the floor-point, i.e. the minimal voltage the fan sees. Without it, at 0% PWM-on, the fan will get close to 0V. With it, it can be adjusted in the range 0V....12V. This is useful if your PWM output delivers a floor-point where your fan does not start.
Maximum rated fan current with an adequate heatsink is around 0.5A at 12V. Above that the OpAmp drive strength is not large enough anymore and cooling the BD140 adequately becomes difficult. For more current, I recommend using a power P-FET like the IRF9540(N) (cheap, good general availability) as driver transistor. Cool it with a 5C/W heatsink, and you can support fans with up to a combined 3A at 12V. Note that this assumes the fans draw significantly less current at lower voltages. Normal fans do.
Do not omit the resistor at the FET-gate or you may get oscillations due to the capacitive load the FET represents.
In a sense, this whole circuit is a low-drop voltage regulator with a variable reference voltage. Low-drop voltage regulators need output filter capacitors for stability for similar reasons as this circuit does. The value of C_comp is pretty non-critical, a generic 100uF electrolyte capacitor is a good compromise and should work for all loads a BD140 or IRF9540 can support.
If you have the floor-point circuit, first adjust the amplification with PWM input open, and then tie the PWM input to GND and adjust the floor-point as desired.
Note that while the ICM7555 datasheet does not state any ESD immunity, the chip has upper and lower protection diodes at all pins (except pin 7, which just has a lower one, as an upper one would break the usability as open-drain output, but an open-drain output has high ESD resistance anyways) and should be pretty rugged against ESD. I assume the same is true for the other CMOS 555 variants.
The circuit is missing the traditional filter cap on pin 5. The datasheet for the ICM7555 says it is not needed. If you do not have a 3.3nF capacitor, use a 2.2nF and 1nF one in paralell, or a 4.7nF and 10nF one in series.