I have done fft-analysis on both speech and noise, and since their frequency bands with centralized power are close to each other, I cannot simply apply a bandpass filter. Is there another way to remove the noise from the speech signal with knowledge of the noise itself? (No, subtraction does not work)
The signal seems non-stationary, at least less stationary than the noise, and the noise is of relatively lower amplitude. Hence, a class of methods resides in performing one or several non-stationary transformations (time-frequency, time-scale, or spectrograms and wavelets). They can concentrate useful signals on a little amount of coefficients. Then, thresholding or shrinkage techniques, reducing low-coefficients and preserving higher ones can be interesting.
Free softwares like audacity have build-in functions. For more techniques, you can check for instance:
- VOICEBOX: Speech Processing Toolbox for MATLAB, esp. Spectral noise subtraction.
More advanced techniques, termed "source separation", are for instance described by:
- Spectrally profile the noise in non-voiced segments of the audio. You can select a suitable segment by yourself. I don't know the details of what kind of statistics are collected at this step.
- In the complete audio, reduce the magnitude of the frequency bins depending on the noise profile. I don't know the details of this step either.
Such processing creates artifacts and the programs use different tricks such as spectral smoothing to reduce them. Different material may benefit from using a different FFT size.