You might also want to try using the bias functionality:
// You'll need to replace pow and log, I have template versions which call appropriate
// functions such as ::powf versus ::pow etc.
template< typename T > inline
const T Bias( const T b, const T x )
{
return( Pow(T(x), Log(T(b))/Log(T(0.5))) );
}
What you do with this is put it on the output of the noise function and set it to say '0.4f', "then" do your step function. It is fairly difficult to explain without pictures but a .4 value will make the overall image more "peaked" and move the high detail data "down" but it won't loose such detail it will simply end up being "blurred" around the cutoff point you use in the step function. (I.e. step function is basically the "if( v>=a ) output=color0 else output=color1;")
The key item is to play with your noise function values first. What is the step size between each level of noise for instance? Using high (>0.5f) stepping means each level of noise has a greater effect on the overall "shape" of the result, low values and added detail moves towards pixel level detail (or noise if you let it go too far). The additive nature between levels of noise can also have a lot of impact, and with high scale you usually use a lower blend and vice-a-versa.
I would highly suggest looking at the book "Texturing and Modelling: A Procedural Approach" as it goes through a great many ways to mess with a pure noise output and make it do things you wouldn't expect it was capable of doing. The book supplies a number of useful functions such as the bias function I posted above and with a full library of such functions, chaining things together to make some very amazing outputs becomes quite a bit more simplified than if you just keep poking at code in various ways. (You can of course always "flatten" all the math later if you get the perfect setup.) Another suggested area of research would be the functions in Renderman Shading Language as most of them exist because of the guys in the suggested book they form a basic language of working with and modifying various items such as noise. (I.e. step, pulse, etc.)
Manipulating Perlin noise is an art form. I've been using it since the 80's and can make it do a hell of a lot of different things but I think in terms of my library of functions first and how you could bias/gain/step/pulse etc the noise to fit a desired output. Without a similar vocabulary of helper functions I'm a bit limited in how I can describe things without sounding completely obtuse.