Characterization of the amount of modulation in a signal We have used the ICRA babble noise to generate an 8-talker babble. As a background - babble noise is used as a substitute for competing talkers as babble noise lacks lexical content, but contains the same envelope and frequency content as 'real' speech. Babble noise is, therefore, less distracting for listeners and hence it's a more direct, 'peripheral' type of masker. Lexical masking occurs more centrally.

Anyway - we are interested in whether the masking effects we see are due to the slowly varying part of the babble noise (the envelope) or the frequency content.

Now, because we used an 8-talker babble using asynchronous, random starting points, the amount of modulation in the masker is less, as all the 8 babble noises are randomly added. Hence, it becomes more of a static type of noise, and  listening in the gaps is hardly possible. The latter is especially important - are there gaps present in the noise, and if yes, how long are they? Likely there are no true gaps anymore, but only stretches of noise where relatively little noise is present, so shallow gaps in the noise.   

Now, I wish to compare the characteristics of the single-talker original noise and our 8-talker babble in terms of:


amount (number/density) of gaps present in the noise
the gap duration
and amplitude of the gaps (modulation depth)


I think a good starting point is to determine the envelope of the fluctuating noise using a Hilbert transform. But then, how do I go about analyzing the envelope in terms of the two parameters, namely gap-duration and amplitude? I have added the envelope of a shorty stretch of the original single-talker babble below (x-axis label is seconds):

  

FWIW: 


I'm used to do my signal analysis in Matlab;
Noise files were software-corrected for rms for overall sound level;
Noise was played back in a sound-proof booth and we will record the signals back with a KEMAR manikin to include the head shadow effect.
As far as the equivalent of an "envelope detector", consider using a moving average of the absolute value (as it would be simple to implement, if you like the approach more elaborate filters could be used). This is how you would do that in Matlab:

M = 10
out = filter(ones(M,1), 1, waveform)


Where M is the number of samples that you want to actually do the moving average over. Note that you will be making a distinction between what you consider the frequency components of your signal vs the frequency components of the envelope as this algorithm seeks to distinguish the two, with the envelope being a low frequency component. 

To determine gap duration, you can simply set a threshold on the envelope based on what you decide to be a gap or not and then create a bipolar two level signal (+1 or -1) to measure the duration of the gaps:

gapTest = abs(out- threshold)


As for setting the threshold itself, I would be tempted to use an "N-Sigma" appraoch, where the threshold is determined based on the standard deviation of the data (so would scale automatically and be consistent across sets).

And the following will report the length as "durations" and quantity of gaps as "count" (note that I did it such that leading and trailing gaps are ignored but you may decide to do that differently):

# find edges
x = diff(gapTest)

# ignore leading gaps (as they are partial)
fall = find(x == -1)
x2 = x(fall(1):end)

#find gaps and duration
rise = find(x2 == 1)
fall = find(x2 == -1)

#ignore trailing gaps (as they are partial)
len = min(length(rise), length(fall))
durations = rise(1:len) - fall(1:len)
count = length(durations)


You will need to test the above for all cases and modify accordingly. 

As far as the equivalent of a "mod depth" consider using the mean of the data above your threshold compared to the mean of the data below your threshold.