Signal processing
Acoustic transmission chain for communication in constrained environments.
CESI · Signal processing

- Constraint
- A microphone as the only transmitter
- Modulation
- FSK, two frequencies
- Validation
- Numerical modelling in Python
- Deliveries
- 4 milestones, from theory to prototype
Key points
- Full chain: coding, modulation, noisy channel, filtering, decision
- Frequency-shift keying, chosen for its robustness to noise
- Band-pass filtering to isolate the useful band from ambient noise
- Validated by numerical modelling before any hardware build
How it works
- 1
What a wave is
Starting point: amplitude, frequency, phase. Three quantities, and therefore three ways of carrying information inside a sound. Choosing which one is the project's first decision, and it depends entirely on what the channel will damage.
- 2
Coding bits as frequencies
FSK modulation assigns a frequency to each binary state: a low tone for 0, a high tone for 1. That choice is not arbitrary. Ambient noise varies amplitude constantly, and amplitude modulation would lose its bits to it, whereas it far more rarely shifts a frequency.
- 3
Crossing the channel
Between microphone and ear, the signal picks up everything lying around: background noise, reverberation, attenuation. That is what the model lets you add deliberately, in chosen amounts, to see at what level transmission stops working.
- 4
Filter before deciding
A band-pass filter keeps only the slice of spectrum where our two tones live and discards the rest. Studying the frequency response is exactly for that: knowing what a filter passes and what it cuts, before relying on it.
- 5
Deciding bit by bit
On each interval, the energy present around the two frequencies is compared and a call is made: whichever dominates gives the bit. A simple decision, reliable only because everything before it did its job.
Try it yourself
The full chain, top to bottom. Raise the noise until bits get lost, then switch the filter off.
- 1 · Bits to send
- 2 · FSK modulated
- 3 · After the channel, then filtered
- 4 · Decided bits
Message received without error.
The detector used here is the simplest possible: it counts zero crossings to estimate frequency. That is exactly what makes the filter essential: a more elaborate detector correlating the signal against both tones would already reject out-of-band noise and gain far less from filtering. Raise the noise until transmission breaks, then untick the filter at the same level.
Context
A scenario: an agent is locked in a room with only a microphone to send a message. The task is to design the full transmission chain that makes it possible, then model it numerically to show it holds up. The premise is fictional; the questions it raises are not: this is exactly what you solve to push data through a channel you do not control.
Why frequency rather than amplitude
This is the project's structural decision, and it follows from the channel. Sound carries information through three quantities, but a noisy channel does not damage them equally.
- Amplitude is what noise disturbs most: background noise adds directly to the signal level
- Phase is precise but fragile: the slightest reverberation shifts it, and a closed room produces plenty
- Frequency survives: an echo arrives later and quieter, but it arrives at the same frequency
- Hence FSK: two well-separated tones, where you look for which dominates rather than measuring a level
Modelling rather than tinkering
The whole chain was written in Python before existing as hardware. The point is not convenience: it is being able to vary one thing at a time. Fix the noise level, change the filter width, count the lost bits. With a real build you would never know whether the improvement came from the filter or from a quieter corridor that day.
What I took away
- The choice of a modulation follows from the channel, not from what is easy to compute
- A filter is designed from a frequency response, not by ear
- Modelling lets you isolate one variable, which a real setup never allows
- The same reflex served me again on the PTZ camera: measure before optimising