Choose a sampling rate
We know from sampling theory that the sampling rate must be at least twice the highest frequency component contained in the signal. With
the Goertzel, it is very beneficial to choose a sampling rate which is an integer multiple of the frequency of interest, if possible. Since we are dealing with two
frequencies, our sampling rate will ideally be an integer multiple of both. The least common multiple is 6250 Hz, which is 4
times the logic zero frequency, and three times the logic one frequency.
Choose a block size
As mentioned, we are using the Goertzel as a band-pass filter. Given that the SAME signal is pretty clean, and that we are not too sure about F_CPU,
we want our bandwidth to as large as it can be, without letting the two filters pass-bands over-lap.
This is accomplished by choosing a bandwidth equal to the difference between the two frequencies, which is 520.83 Hz.
The block size of a Goertzel filter is related to the sampling rate and the bandwidth...
 block_size = sample_rate / bandwidth
That gives us a Goertzel block size of 12.
Compute a coefficient
A DFT must compute a number of transcendental operations many, many times. One of the advantages of the Goertzel filter is that we can arrange to
compute a coefficient once, before applying the filter algorithm. The coefficient is computed as follows...
 k = size * frequency / rate
 w = 2 * pi / size * k
 coefficient = 2 * cos(w)
We get 0 as the logic zero coefficient, and -1 as the logic one coefficient.
These are integer values, which is very good, as we can dispense with floating point math in the filter loop.
These also means we can simplify the filters, by removing some operations and turning others into simple negation.
Construct the filter function
Now that we have the coefficients, we can begin to flesh out our filter functions. The
basic form of the filter function is...
 Q0 = coeff * Q1 - Q2 + sample
 Q2 = Q1
 Q1 = Q0
Note that Q1 and Q2 act as 'integrators', accumulating past results.
After passing a block of samples through the filter, we check the energy stored with the magnitude function...
 magnitude2 = Q12 + Q22 - Q1 * Q2 * coeff
Based on the magnitude, we can judge how strongly the target frequency was represented in the block of samples.
Before beginning the next block, we clear the two accumulators Q1 and Q2. If we did not, they would simply keep on accumulating energy,
growing larger without bound (well, at least until they overflowed).
Since our coefficients are zero and -1, we can simplify our filter functions somewhat...
 Low Tone Filter
 Q0 = - QL2 + sample
 QL2 = QL1
 QL1 = Q0
 Low Tone Magnitude
 low_magnitude2 = QL12 + QL22
 High Tone Filter
 Q0 = -QH1 - QH2 + sample
 QH2 = QH1
 QH1 = Q0
 High Tone Magnitude
 high_magnitude2 = QH12 + QH22 + QH1*QH2
So let's translate this into C right now...