0
$\begingroup$

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

hilbert

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.
$\endgroup$
  • 1
    $\begingroup$ ok I found your profile amusing and you question has piqued my interest. Why use a Hilbert Transform to get the envelope? I would be tempted to do absolute value and low pass filter (you would need to decide what your "video bandwidth" is in any event in determining between "envelope" and actual waveform content. Gap duration would then be done with a simple threshold detection where you convert your envelope to a bipolar signal based on a decided threshold of what you call a gap or not. $\endgroup$ – Dan Boschen Nov 18 '18 at 12:38
  • $\begingroup$ I don't see yet how you can associate the equivalent of a "modulation depth" as this is not actually an AM modulated signal but perhaps a historgram of the related distributions would give you the comparative data you are looking for? Along with peak to average and peak to minimum metrics? $\endgroup$ – Dan Boschen Nov 18 '18 at 12:40
  • $\begingroup$ @DanBoschen thanks for your words. I'm a simple biologist and I always feel like entering a daunting hornets nest entering the realm of physicists. The Hilbert, honestly, I chose as it's a commonly used transform in auditory sciences, plus, not unimportantly, it's easy to implement in matlab. That thresholding method sounds what I'm after and any elaboration on that would me more than appreciated. $\endgroup$ – AliceD Nov 18 '18 at 12:46
  • $\begingroup$ It is indeed not a regular sine-modulated signal. That's what makes it difficult for me. Otherwise standard methods would work. $\endgroup$ – AliceD Nov 18 '18 at 12:47
  • 1
    $\begingroup$ Got it. So your generally looking for some metrics to compare the two cases? Very helpful your plot that you added, I was just going to ask for that. Can you also add an envelope of the 8 talker model? $\endgroup$ – Dan Boschen Nov 18 '18 at 12:49
1
$\begingroup$

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.

$\endgroup$
  • $\begingroup$ Thanks! +1 I'll look into this for sure, many thanks. $\endgroup$ – AliceD Nov 18 '18 at 14:09

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.