Tom Grandgent
2004-Aug-06 15:01 UTC
[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@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@xiph.org' containing only the word 'unsubscribe' in the body. No subject is needed. Unsubscribe messages sent to the list will be ignored/filtered.