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

Tongbiao Li tli at viack.com
Thu Sep 18 11:36:30 PDT 2003



That's might be speex_denoise() is trying to do already, based on the
fact that if noise is present in speech signal, the former gets
suppressed to a certain extend.  Also, I noticed after suppression, the
short, noisy attack - speex_denoise() have to be doing some kind of
profiling.

I've looked at a few offline denoise() solutions.  They all involve
profile building.

A real-time solution is needed for our particular domain.  Somehow,
during speech, we want to build the *profile*, and subtract it from the
subsequent signals.  My question is: anyone have any idea on the profile
of the *profiles", or the dynamically building of it, assuming just the
interaction from other internal organs of the PC, and no fans etc.
around?

Meanwhile, I guess the initial solution is force the customers run some
kind of wizard, before the running stage of our software, while
(secretly) building up the profile, hoping they do not adjust their gain
level etc later.  Any comments (experience) on this, from anyone ?

<p>-----Original Message-----
From: Tom Grandgent [mailto:tgrand at canvaslink.com] 
Sent: Thursday, September 18, 2003 11:25 AM
To: speex-dev at xiph.org
Subject: Re: [speex-dev] speex_denoise on non-microphone noise (static
?)

Hi,

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 
Speex.

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.. :)

Tom

<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.
--- >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