Noise Removal: better spectral gating, not subtraction

I listened to the examples. I think my present experiments do better at removing the white noise behind the sinusoid, than spectral subtraction example. This is not to say we should not have a choice of algorithms for sophisticated users, but that opportunities for improving the existing algorithm are not exhausted.

I could give a longer explanation and some other interesting test cases. I would rather put it on the wiki page but I don’t think I am authorized.

I’ll say one thing: results in this test case depend very much on the frequency. Use Audacity 2.0.5, a sine wave of 5 * 44100 / 2048 = 107.666015625 hz, 30 seconds of the noise for profile, and noise removal settings of 48, 1, 0, 0.1 . The noise removal works very well in that case. (Turns out that frequency smoothing will reduce the signal too however.)

Why does 2.0.5 work poorly for other frequencies? A longer story. Do I know how to make it work well regardless of frequency, with the current approach of spectral gating? Yes. Does it sound better than the spectral subtraction example? In my opinion, yes, provided Sensitivity is a little above zero (less is needed, the longer the noise sample is).

I am reading the code for the noise coring proposal, which is doing something sophisticated I don’t fully understand yet.

I have also read the code for the patch implementing spectral subtraction. The fix is too simple and needs much work.

  1. There is an attempt to fix what Isolate does, but I am not sure it’s the right thing.
  2. As with the first implementation of Isolate, the interaction with attack and decay was not well thought out, with the result that there may be attack but there is zero decay.
  3. The noise removal threshold is in fact made useless by this change but the user interface was not changed.
  4. Not sure of the math, but I think
mGains[center][j] = (min - mNoiseSubtraction * mSensitivityFactor * mNoiseThreshold[j])/min;

would better be

mGains[center][j] = sqrt((min - mNoiseSubtraction * mSensitivityFactor * mNoiseThreshold[j])/min);

because mGains[center][j] will multiply FFT coefficients, but min and mNoiseThreshold[j] are power.


All that said, there may be a useful idea here, but as with spectral gating, I think the real solution to good removal of noise behind sounds is first to get better spectral data by using a non-rectangular windowing function. So what I am doing would benefit both.

I got Jerome Berger’s Noise Coring compiled on windows. It required a few modifications to compile for me.

any news on more methods for noise removal?

Id like to see spectral subtraction added, and interested in anything else what works well for voice recordings.
If I can do some code or anything to help, yell out :slight_smile: