Skip to contents

Detects f0 samples that fall in a low-energy region of their token, where pitch estimates are least reliable — voicing onsets and offsets, devoiced or breathy segments, and creaky utterance-final tails. Intensity is an independent cue from f0: a smoothly drifting mis-tracked tail at a vowel edge need not trip the rate-of-change check in flag_pitch_jumps(), but it will sit in an intensity dip. The flag is therefore most useful (a) on its own, to surface unreliable edge frames, and (b) alongside a jump flag, where co-occurring low intensity raises confidence that the jump is a tracking error rather than a real pitch event.

Usage

flag_low_intensity(
  data,
  f0 = "f0",
  token = "token",
  intensity = "intensity",
  intensity_drop = 15
)

Arguments

data

A long-format data frame with one row per f0 sample.

f0

Column name of f0 in Hz. Default "f0".

token

Column name of token ID. Default "token".

intensity

Column name of intensity in dB. Default "intensity".

intensity_drop

Flag voiced samples whose intensity is more than this many dB below the token's peak intensity. Default 15.

Value

The input data frame with one appended logical column, flag_low_intensity, TRUE for low-energy voiced samples.

Details

For each token the function takes the peak intensity across that token's voiced samples and flags every voiced sample whose intensity is more than intensity_drop dB below that peak. The comparison is relative-to-peak (not an absolute dB threshold), so it transfers across recordings regardless of microphone distance or gain. Unvoiced samples (f0 is NA or 0) and samples with missing intensity are never flagged, and tokens with no voiced sample are left unflagged.

Low intensity does not by itself mean the f0 is wrong — a softly but modally produced frame tracks fine — so this is an advisory, inspect-don't-delete signal, consistent with the rest of the Inspect tab.

See also

Examples

df <- data.frame(
  token     = rep("t1", 5),
  f0        = c(120, 122, 121, 119, 118),
  intensity = c(40, 62, 64, 63, 41)   # quiet at the edges
)
flag_low_intensity(df, intensity_drop = 15)$flag_low_intensity
#> [1]  TRUE FALSE FALSE FALSE  TRUE