First thing you should do is to eliminate low frequency noise. Assuming you use screen coordinates as a seed for PRNG you can simply do something like
vec2 coord=mod(gl_FragCoord.xy,4.0);
High frequency noise can then be eliminated with selective blur (based on depth, or even better depth and normal).
EDIT: Looking at your code...
Using texture instead of prng, very interesting approach. I wonder if it's more efficient.
Anyway, try replacing
vec3 fres = normalize((texture2D(randomSamples,texCoords*offset).xyz*2.0) - vec3(1.0));
with
vec2 rngCoords=mod(gl_FragCoord.xy,8.0)/8.0;
vec3 fres = normalize((texture2D(randomSamples,rngCoords*offset).xyz*2.0) - vec3(1.0));
that will remove low frequency noise, selective filter should be easy.
EDIT2: If AO is your only form of shading, I'd recommend trying
this method. It's slower but much less direction dependent.