kyma•tweaky . Share . DiscussFFTWienerNRProc

This sound is a takeoff on the FFTSpectralProcessor?... But it illustrates just how incredibly effective the Wiener noise removal can be.

Instead of doing any limiting inside the Frequency Domain, I'm simply taking the magnitude of each spectral component and the maximum of that level or the user settable noise floor threshold. Then what I want to do is multiply both real and imaginary components of the spectral amplitude by the factor (1-n^2/(s+n)^2). But I don't have a divide routine. So instead I approximate this division with the ArcTangent? of R/L. By setting the left channel equal to this threshold limited amplitude, and the right channel to that threshold, we are forming the quantity ArcTan?(Threshold/(Max(Threshold,Signal+Noise))).

The ArcTan? is approximately equal to R/L when R is equal to and smaller than L. It's range is from 0 to 0.25 between ratios of 0 and 1. Hence I scale the ArcTan? by 12dB (= 4x) before going into the multiplier which squares this ratio. Then I subtract that squared quantity from 1 to get the final noise reduction attenuation factor.

So this is only an approximation (by virtue of the ArcTangent?, instead of the direct ratio) of Wiener preprocessing. The limiting to a minimum of Threshold is needed to prevent the quantity (1-n^2/(s+n)^2) from becoming negative. When (s+n) <= n there is no point to having any but zero gain.

Just to show how effective this process is, I have added a white noise generator to the input mix. Go ahead and feed some sound into this (stereo) process and have a listen to the result. You can also bypass all processing to hear the original signal, and you can toggle just the "sidechain" which is my way of synthesizing what portion of the sound is being removed.

The results are really quite stunning! This is the basis for almost all noise-removers that you find out there for cleaning up recordings. This does not remove impulses like crackles and clicks. But it very effectively removes the random background hiss.

In this case, there is only one threshold applied to all frequency bins. A more sophisticated noise removal would allow a separate threshold for every frequency bin. This could be accomplished by recording and averaging some portion of the noise in a signal-free trailer, pushing the result into a wavetable and then using its amplitude spectrum as the threshold. This could all be done using recirculant delay lines.

A slight twist on strict Wiener processing occurs in my version by means of the recirculant delay line after calculating the spectral attenuation. This is the same recirculant delay used in the FFT Spectral Enhancer, having a roughly 50 ms time constant. The use of this delay line for averaging the attenuation is that it reduces the "gurgles" that might otherwise occur as signals fluctuate around the threshold level.

[ A Hint... I'm using FFT's with 256 elements. Hence the (white) noise per frequency band will be divided by this amount for both real and imaginary components. Their combination will generally be Sqrt(2) times larger in the audible result (= square root of real noise + imaginary noise). Hence the (white) noise ought to be roughly 45 dB below the level you specify in the VCS (AmpLow? dB). That is about the Threshold you could expect to set for pretty good noise removal. Of course any signal below this level gets thrown out too....

For Pink noise this calculation is probably too stingy at high frequencies and too liberal at lower frequencies. The worst possible noise is white, and that's what I'm adding to the input sound here.]

-- DavidMcClain - 24 Mar 2004

In this case we can simplify the innards a bit by taking advantage of the property of "saturating arithmetic" inside the DSP's.

Since the ratio we want is limited to the range 0 to 1, having anything greater than 1 is okay too. When we multiply that value greater than 0.25 inside the ArcTangent? by 4 (= 12 dB) we end up with a number greater than 1. The DSP saturates at 1 for us. So we don't need to do the Max calculation at all. This new Sound file contains the additional simplified version...

I also simplified all the Bypass/Side stuff. It can all be done creatively inside the FFT's and we don't really need all that extra stuff at the output ports...

-- DavidMcClain - 25 Mar 2004

I just added another example of the use of this Wiener NR to remove extraneous noises from a recording of a voice. Just mono here, called "Jungle Remover". I have input sources equal to a woman reciting the Cephalophage speech, along with white noise and the "Indoor Jungle".

I also added a Graphic EQ on the output to regain some of the lost high frequency contrast in her voice, and an output gain amplifier to restore the output levels to more reasonable listening levels.

You can hear for yourself how effective this Sound can be for cleaning up recordings and focusing on the main content. You can hear the flamingos every now and then, when she is speaking and the birds happen to fall into the same spectral bands. But still it works quite well.

-- DavidMcClain - 25 Mar 2004

Attachment: Action: Size: Date: Who: Comment:
FFTWienerNRProc.kym action 68188 25 Mar 2004 - 01:15 DavidMcClain  

----- Revision r1.1 - 25 Mar 2004 - 00:12 GMT - DavidMcClain
Copyright © 1999-2014 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding kyma•tweaky? Send feedback.