These functions compute a single octave of noise.
To layer noise into something like Fractional Brownian Motion (FBM), you can invoke one of these functions multiple times.
Let's say I have a noise function like EvaluateNoise(float x, float y)
The number of octaves determines how many times I call that function. The frequency determines a scaling value I apply to my x,y values before calling it. In addition to this we'll usually have persistence and lacunarity parameters, determining how the amplitude should diminish and frequency increase as we drop down the octaves. Something like...
float EvaluateFBM(float x, float y,
float amplitude, float frequency,
int octaveCount, float persistence, float lacunarity) {
float value = 0;
for (int i = 0; i < octaveCount; i++) {
value += amplitude * EvaluateNoise(x * frequency, y * frequency);
amplitude *= persistence;
frequency *= lacunarity;
}
return value;
}
Persistence (also called gain) is a value in the range (0, 1) that controls how quickly the later octaves "die out". Something around 0.5 is pretty conventional here.
Lacunarity is a value greater than 1 that controls how much finer a scale each subsequent octave should use. Something around 2.0 is a conventional choice.
You may also want to apply an offset to x/y/z at each octave to decorrelate the layers, so you don't see repeated features constructively interfering when you're close to zero.
You can modify this function in various ways to get things like turbulence or ridge noise, IQ Noise, Swiss or Jordan Turbulence, or other custom terrain styles.