A more-or-less generic MDegrain call seems to provide a pretty good start (see code below). You could add CNR2 or some other function prior to MDegrain2 to work more on the chroma noise.
Here is the result of this script:
Code:
SetMemoryMax(768)
Loadplugin("C:\Program Files\AviSynth 2.5\plugins\MVTools\mvtools2.dll")
Loadplugin("C:\Program Files\AviSynth 2.5\plugins\Film Restoration\Script_and_Plugins\removegrain.dll")
SetMTMode(5,6)
source=AVISource("E:\fs.avi").AssumeTFF().ConvertToYV12(interlaced=false).killaudio()
SetMTMode(2)
output=MDegrainProg(source,16,4,0)
return output
#-------------------------------------
#Denoising function, progressive video
function MDegrainProg(clip source, int "blksize", int "overlap", int "dct")
{
overlap=default(overlap,0) # overlap value (0 to 4 for blksize=8)
dct=default(dct,0) # use dct=1 for clip with light flicker
preNR = source.fft3dfilter(sigma=4,interlaced=false)
preNR_super = preNR.MSuper(pel=2, sharp=1)
src_super = source.MSuper(pel=2, sharp=1,levels=1)
backward_vec2 = MAnalyse(preNR_super,isb = true, delta = 2, blksize=blksize, overlap=overlap, dct=dct)
backward_vec1 = MAnalyse(preNR_super,isb = true, delta = 1, blksize=blksize, overlap=overlap, dct=dct)
forward_vec1 = MAnalyse(preNR_super,isb = false, delta = 1, blksize=blksize, overlap=overlap, dct=dct)
forward_vec2 = MAnalyse(preNR_super,isb = false, delta = 2, blksize=blksize, overlap=overlap, dct=dct)
MDegrain2(source,src_super, backward_vec1,forward_vec1,backward_vec2,forward_vec2,thSAD=800)
}