Recovering a voice from a noisy recording
The TIPE is a year-long research project presented at the French engineering entrance exams. Our question was simple: how can we restore a voice from a noisy recording with the best possible quality?
Image notes: 1. Signal spectrum 2. Magnitude 3. Frequency 4. FilteredContext
Admission to the leading French engineering schools depends on national competitive exams taken at the end of two years of preparatory classes. One of their components is the TIPE (Travail d’Initiative Personnelle Encadré, a supervised personal research project), carried out over a full year and presented orally to the jury.
Our year’s theme was “Transition, transformation, conversion.” We chose to work on turning a degraded recording back into intelligible speech, approaching the problem from both the analog and the digital side.
Problem statement
How can we restore a voice from a noisy recording with the best possible quality, and which family of methods is actually suited to the problem?
Objectives & constraints
- Keep the voice band, roughly 340 to 3,400 Hz, and reject everything else.
- Compare classical filtering with a spectral method on the same recordings.
- Remove the artifacts introduced by the processing itself.
- Run the chosen method in real time on a live microphone feed.
Team & role
My teammate, Vincent Sfeir, worked on the analog side: filter circuits. I designed, implemented and compared the digital methods, all coded from scratch in Python, then built the real-time version.
Methodology & approach
1 · Digital filters
I first designed band-pass filters that keep the voice band and cut the rest.
| Filter | Design | Specification |
|---|---|---|
| FIR | Windowed-sinc design. I implemented five window functions and selected Blackman for its −57 dB side lobes. | 340–3,400 Hz pass-band, 50 Hz transition band, −60 dB stop-band. |
| IIR | 2nd-order Butterworth prototype transformed into a band-pass filter, then discretized with the bilinear transform and frequency pre-warping. | 4th-order coefficients derived by hand. |
Both work, but they share a limit: noise that falls inside the voice band stays. FIR filters are stable and easy to design but need many coefficients; IIR filters need fewer but can become unstable.
2 · Spectral subtraction
The second method estimates the noise spectrum from a noise-only sample, then subtracts it frame by frame using a short-time Fourier transform (STFT), before rebuilding the signal with the inverse transform. It runs in O(N), against O(N × M) for filtering.
3 · Real time
Finally, I adapted spectral subtraction to run live. The program records a few seconds of background noise through the microphone with PyAudio, then cleans the incoming audio in blocks of 1,024 samples as the person speaks.
Technical challenges
The raw spectral-subtraction output suffered from a well-known artifact called musical noise: short, artificial tones caused by holes in the spectrum, often more annoying than the original noise. I corrected it in three steps:
- Averaging. Subtract the mean noise spectrum instead of the instantaneous one.
- Over-subtraction. Scale the noise estimate by a gain. I tested values of 1 and 2 and kept 1.7.
- Spectral floor. Never go below a fraction of the input spectrum. I tested 1% and 10% and kept 3%.
Results & findings
With the final parameters (gain 1.7, floor 3%), the noise floor between words and above 1 kHz drops sharply while the voice peaks remain.


Key takeaways
Classic filters, digital or analog, are not suited to this problem. Spectral subtraction is, as long as the noise is known and stationary. It cannot separate two complex signals such as a voice over music, which points toward machine-learning methods.