[speex-dev] speex_denoise on non-microphone noise (static ?)

Tom Grandgent tgrand at canvaslink.com
Thu Sep 18 11:25:15 PDT 2003


I'm not sure how speex_denoise() works, but my solution to this problem 
is fairly straightforward and works well in practice (in a simple VoIP 
program.)  Note that I am also an amateur and am making up some 
terminology here... but I've tested my approach on several noisy 
environments with low-quality mics and it does work well.

Problem: There's usually annoying noise present in a recorded signal, 
which can be attributed to interference from the PC and background noise 
in the user's environment (fan noise is common.)

Assumptions: The noise is regular with respect to time - that is, it's 
steady and ongoing.  It tends not to change significantly in frequency 
or amplitude over a long period of time.

Solution: Subtract it from the signal.  In order to do this, there are two 
steps required: 1) Build an average profile of the noise.  This is done 
infrequently and [currently] triggered by the user.  2) Subtract the 
profile from the signal.  This is done before encoding the signal with 

1) Building the profile: I build an "average profile" of the noise in the 
frequency domain.  So the user is prompted to be quiet for a few seconds, 
the noise is recorded, and it's run through the FFT.  The signal is 
averaged (in the frequency domain) over those few seconds to get a "general 
idea" of the noise characteristics.

2) Removing the noise: Before encoding some recorded sound with Speex, I 
run the sound through the FFT.  Then it's a simple matter to loop over the 
frequency spectrum and subtract the noise profile.  At this point it's 
also easy to do simple filtering, so I do a high-pass filter around 200Hz 
or so to get rid of unwanted bass.  Then, I do the inverse FFT to get the 
sound back into the time domain, and I encode it with Speex.  The noise 
is *greatly* reduced.  The difference can really be dramatic.

Drawbacks: Not all noise is regular over time, and this approach is a 
manual, non-adaptive process (for now anyway...)  One person I talk to 
has a monitor which causes annoying noise only when the screen is mostly 
white.  So sometimes I end up asking them to rebuild the profile.

Well, I'm not sure if this is helpful or not, but it works for me.. :)


<p>Tongbiao Li (tli at viack.com) wrote:
> The problem started with speech detection.  Speech sections are detected
> well.   However, once in a while non-speech sections are also marked as
> speech.  The root was finally traced down to microphone static noise.
> Then I pulled the microphone out. Our system still records noise.  To
> isolate the problem, I wrote a small app just to open the device and
> record raw samples, calls speex_denoise() and outputs both sample sets.
> The noise is still there, with level fluctuating with gain level, unless
> "All mute" is chosen.  
> In the case when NO microphone is plugged in, speex_denoise() smoothes
> the signal and produces smoother (and even amplifies the signal) speech
> like signals.  It seems that speex_denoise( ) is very sensitive to
> static noise.
> For regular speech COMBINED with microphone static (or more precisely,
> the static detected at the microphone plug, or noise from inside the PC
> ... someone help me out here), the noise samples do get suppressed
> compared to speech samples. 
> One observation: many noise sequences seem to have a signature of sharp
> spikes.
> Anyone have a solution of supressing this type of static?
> Thank you.

--- >8 ----
List archives:  http://www.xiph.org/archives/
Ogg project homepage: http://www.xiph.org/ogg/
To unsubscribe from this list, send a message to 'speex-dev-request at xiph.org'
containing only the word 'unsubscribe' in the body.  No subject is needed.
Unsubscribe messages sent to the list will be ignored/filtered.

More information about the Speex-dev mailing list