Reading frequencies without filters
A much simpler solution than has been suggested by some is possible subject to your system meeting the constraints you specify.
You say you are sending one tone at a time. If so, and if you can &quot;square the signal up&quot; so it is presented to the MC (microcontroller) as a square wave and if there is not significant other noise then you can easily determine frequency by any of several methods.

Count number of cycles of signal in a finite period. You can do this several times and compare results. Resolution is ~= 1/(f.t)  eg at 400 Hz with 1 second counting you get about 1:400 accuracy. At 200 Hz with 3 second sample you get ~= 1:600 accuracy. The accuracy of measuring the time period matters and the accuracy of send frequency. As above, any noise will affect this simple method.
You don't say how many &quot;channels&quot; you want or how fast a data rate you want but if say you transmitted at from 1 Khz to 2 Khz in 100 Hz steps 1000, 1100, 1200 ...2000) you could get 11 channels. If you counted for 0.1 seconds you would get 1000, 110, 120 ... cycles with a difference between each of 10 counts. With an adequately accurate clock at each end you could easily resolve this. You could drop as low as 5 cycle differences and probably work OK. When you get down to about 2 cycle differences you have to look very carefully at how it all works to avoid errors.

Count period of one cycle or of N cycles. Again, your clock accuracy sets a limit. Also here the accuracy of setting zero crossings matters. In the presence of noise this method would also need multiple sends to allow comparison of results.

You don't say what you are trying to do and why - and they are an important part of the question. There are many ways of sending data over an audio channel - all are effectiovely &quot;modems&quot; but some are much faster and more error proof than others. Knowing more details would help the best &quot;modem&quot; method to be determined.