Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
pulp::signal::VocoderT< SampleType > Class Template Reference

A classic channel vocoder: analysis bank → envelopes → matched synthesis bank. More...

#include <vocoder.hpp>

Public Types

using CarrierSource = VocoderCarrier
using InternalWave = VocoderWave

Public Member Functions

 VocoderT ()
void prepare (double sample_rate)
 Fixes the sample rate, recomputes every coefficient, and clears state.
void reset ()
int latency_samples () const
 0 for every configuration. See this file's latency note.
void set_band_count (int n)
 Band count, 10 .
void set_band_range_hz (double f_lo, double f_hi)
 Analysis and synthesis span.
void set_carrier_source (CarrierSource source)
CarrierSource carrier_source () const
void set_internal_wave (InternalWave wave)
void set_internal_pulse_width (SampleType w01)
void set_internal_pitch_hz (SampleType hz)
 The internal carrier's frequency.
double internal_pitch_hz () const
void set_noise_mix (SampleType m01)
void set_attack_ms (SampleType ms)
 Follower attack as a 10→90 % time in ms, floored per band.
void set_release_ms (SampleType ms)
 Follower release as a 10→90 % time in ms, floored per band.
void set_unvoiced_sensitivity (SampleType s01)
void set_sibilance_mix (SampleType m01)
void set_formant_shift_semitones (SampleType st)
 Formant shift in semitones, converted to a fractional band-index offset through the bank's own ratio, so the control means the same thing at every band count and every span.
void set_formant_freeze (bool on)
 Latches the band levels.
bool formant_freeze () const
void set_output_trim_db (SampleType db)
void set_dry_wet (SampleType w01)
 0 = the (DC-blocked) modulator passes through, 1 = fully vocoded.
void process (SampleType modulator, SampleType carrier_ext, SampleType &out_dry)
int band_count () const
double band_ratio () const
double band_q () const
double section_q () const
double bands_per_octave () const
double shift_bands () const
double band_center_hz (int k) const
double attack_eff_ms (int k) const
double release_eff_ms (int k) const
double analysis_band (int k) const
 The 4th-order analysis output for band k on the most recent sample — the filter's own signal, before rectification.
double band_envelope (int k) const
 The live follower output for band k, ignoring freeze and shift.
double synthesis_gain (int k) const
 The level actually applied to synthesis band k — post-freeze, post-shift.
double unvoiced () const
 The smoothed voicing decision: 0 fully voiced, 1 fully unvoiced.
double zcr_hz () const
 Measured zero-crossing rate of the modulator, Hz.
double zcr_window_ms () const
 Effective ZCR window length in ms.

Static Public Attributes

static constexpr int kMaxBands = 20
 Storage cap.
static constexpr int kMinBands = 10
static constexpr std::size_t kBandSlots = static_cast<std::size_t>(kMaxBands)
static constexpr double kDcBlockHz = 10.0
 DC-blocker corner for both the modulator and the carrier path, Hz.
static constexpr double kMaxSampleRate = 192000.0
 Highest sample rate the fixed ZCR window is sized for.
static constexpr double kCascadeBWFactor = 0.6435942529055827
 Bandwidth factor for two identical cascaded 2nd-order bandpass sections.
static constexpr double kPreEmphasis = 0.95
 Pre-emphasis coefficient, y[n] = x[n] − a·x[n−1], applied to the modulator only.
static constexpr double kRippleCycles = 2.0
 Release floor, in cycles of each band's own centre frequency.
static constexpr double kAttackCycles = 0.5
 Attack floor, same units and the same honest gap.
static constexpr double kZcrLo = 1500.0
 Zero-crossing rate mapped to [0, 1] between these edges.
static constexpr double kZcrHi = 4500.0
 [design parameter] default 4500 Hz, range 3000 .. 6000 Hz.
static constexpr double kZcrWindowMs = 20.0
 Sliding-window length for the crossing count.
static constexpr double kSibilanceCornerHz = 3500.0
 What counts as sibilance.
static constexpr double kUvEnter = 0.6
 Schmitt thresholds on the raw decision.
static constexpr double kUvLeave = 0.4
static constexpr double kSensSpan = 0.5
 How far unvoiced_sensitivity can bias the raw decision.
static constexpr double kUvSmoothMs = 8.0
 One-pole smoothing on the decision, as a 10→90 % time to match the follower convention this file uses everywhere.
static constexpr double kEnergyEpsilon = 1e-12
 Guards the high-frequency energy ratio's divide when every band is silent.
static constexpr double kUnvoicedNoise = 0.9
 How much noise a fully unvoiced decision substitutes into the carrier.
static constexpr std::uint32_t kNoiseSeed = 0x9E3779B9u
 Noise seed.
static constexpr double kDefaultPitchHz = 110.0
 Internal carrier pitch, Hz.
static constexpr double kMinPitchHz = 20.0
static constexpr double kMaxPitchHz = 2000.0
static constexpr double kOutputHeadroomTrim = 0.5
 Static trim on the summed synthesis bank.
static constexpr double kWorstCaseGain = 2.0
 The pre-trim reconstruction bound Forge's registry cites.
static constexpr double kFreqLoMinHz = 60.0
static constexpr double kFreqLoMaxHz = 400.0
static constexpr double kFreqHiMinHz = 3000.0
static constexpr double kFreqHiMaxHz = 12000.0
static constexpr double kAttackMinMs = 0.1
static constexpr double kAttackMaxMs = 50.0
static constexpr double kReleaseMinMs = 2.0
static constexpr double kReleaseMaxMs = 200.0
static constexpr double kPulseWidthMin = 0.05
static constexpr double kPulseWidthMax = 0.95
static constexpr double kFormantShiftMinSt = -24.0
static constexpr double kFormantShiftMaxSt = 24.0
static constexpr double kOutputTrimMinDb = -24.0
static constexpr double kOutputTrimMaxDb = 12.0

Detailed Description

template<typename SampleType = float>
class pulp::signal::VocoderT< SampleType >

A classic channel vocoder: analysis bank → envelopes → matched synthesis bank.

Mono in, mono out, one sample at a time.

Member Typedef Documentation

◆ CarrierSource

template<typename SampleType = float>
using pulp::signal::VocoderT< SampleType >::CarrierSource = VocoderCarrier

◆ InternalWave

template<typename SampleType = float>
using pulp::signal::VocoderT< SampleType >::InternalWave = VocoderWave

Constructor & Destructor Documentation

◆ VocoderT()

template<typename SampleType = float>
pulp::signal::VocoderT< SampleType >::VocoderT ( )
inline

Member Function Documentation

◆ analysis_band()

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::analysis_band ( int k) const
inline

The 4th-order analysis output for band k on the most recent sample — the filter's own signal, before rectification.

◆ attack_eff_ms()

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::attack_eff_ms ( int k) const
inline

◆ band_center_hz()

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::band_center_hz ( int k) const
inline

◆ band_count()

template<typename SampleType = float>
int pulp::signal::VocoderT< SampleType >::band_count ( ) const
inline

◆ band_envelope()

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::band_envelope ( int k) const
inline

The live follower output for band k, ignoring freeze and shift.

◆ band_q()

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::band_q ( ) const
inline

◆ band_ratio()

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::band_ratio ( ) const
inline

◆ bands_per_octave()

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::bands_per_octave ( ) const
inline

◆ carrier_source()

template<typename SampleType = float>
CarrierSource pulp::signal::VocoderT< SampleType >::carrier_source ( ) const
inline

◆ formant_freeze()

template<typename SampleType = float>
bool pulp::signal::VocoderT< SampleType >::formant_freeze ( ) const
inline

◆ internal_pitch_hz()

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::internal_pitch_hz ( ) const
inline

◆ latency_samples()

template<typename SampleType = float>
int pulp::signal::VocoderT< SampleType >::latency_samples ( ) const
inline

0 for every configuration. See this file's latency note.

◆ prepare()

template<typename SampleType = float>
void pulp::signal::VocoderT< SampleType >::prepare ( double sample_rate)
inline

Fixes the sample rate, recomputes every coefficient, and clears state.

◆ process()

template<typename SampleType = float>
void pulp::signal::VocoderT< SampleType >::process ( SampleType modulator,
SampleType carrier_ext,
SampleType & out_dry )
inline

◆ release_eff_ms()

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::release_eff_ms ( int k) const
inline

◆ reset()

template<typename SampleType = float>
void pulp::signal::VocoderT< SampleType >::reset ( )
inline

◆ section_q()

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::section_q ( ) const
inline

◆ set_attack_ms()

template<typename SampleType = float>
void pulp::signal::VocoderT< SampleType >::set_attack_ms ( SampleType ms)
inline

Follower attack as a 10→90 % time in ms, floored per band.

◆ set_band_count()

template<typename SampleType = float>
void pulp::signal::VocoderT< SampleType >::set_band_count ( int n)
inline

Band count, 10 .

. 20. Re-derives the whole bank; allocation-free, and it moves only the active loop bound.

◆ set_band_range_hz()

template<typename SampleType = float>
void pulp::signal::VocoderT< SampleType >::set_band_range_hz ( double f_lo,
double f_hi )
inline

Analysis and synthesis span.

f_hi is additionally held above f_lo so the geometric ratio stays greater than 1.

◆ set_carrier_source()

template<typename SampleType = float>
void pulp::signal::VocoderT< SampleType >::set_carrier_source ( CarrierSource source)
inline

◆ set_dry_wet()

template<typename SampleType = float>
void pulp::signal::VocoderT< SampleType >::set_dry_wet ( SampleType w01)
inline

0 = the (DC-blocked) modulator passes through, 1 = fully vocoded.

The spec contradicts itself here: this setter is in its declared class API, while its node-wiring note says dry/wet lives in node code and not in this template. Resolved in favour of the declared API — a node that wants to own the crossfade simply leaves this at 1.0, whereas a caller of a class that dropped a declared method has no recourse. Note that the out_dry parameter of process is unrelated: it means "before the node's chorus", not "the dry signal".

◆ set_formant_freeze()

template<typename SampleType = float>
void pulp::signal::VocoderT< SampleType >::set_formant_freeze ( bool on)
inline

Latches the band levels.

The latch is a value copy taken on the rising edge inside process, so it is deterministic and needs no randomness. Followers keep running while frozen; their output is simply ignored.

◆ set_formant_shift_semitones()

template<typename SampleType = float>
void pulp::signal::VocoderT< SampleType >::set_formant_shift_semitones ( SampleType st)
inline

Formant shift in semitones, converted to a fractional band-index offset through the bank's own ratio, so the control means the same thing at every band count and every span.

◆ set_internal_pitch_hz()

template<typename SampleType = float>
void pulp::signal::VocoderT< SampleType >::set_internal_pitch_hz ( SampleType hz)
inline

The internal carrier's frequency.

See kDefaultPitchHz for why this exists when the spec has no such control.

◆ set_internal_pulse_width()

template<typename SampleType = float>
void pulp::signal::VocoderT< SampleType >::set_internal_pulse_width ( SampleType w01)
inline

◆ set_internal_wave()

template<typename SampleType = float>
void pulp::signal::VocoderT< SampleType >::set_internal_wave ( InternalWave wave)
inline

◆ set_noise_mix()

template<typename SampleType = float>
void pulp::signal::VocoderT< SampleType >::set_noise_mix ( SampleType m01)
inline

◆ set_output_trim_db()

template<typename SampleType = float>
void pulp::signal::VocoderT< SampleType >::set_output_trim_db ( SampleType db)
inline

◆ set_release_ms()

template<typename SampleType = float>
void pulp::signal::VocoderT< SampleType >::set_release_ms ( SampleType ms)
inline

Follower release as a 10→90 % time in ms, floored per band.

◆ set_sibilance_mix()

template<typename SampleType = float>
void pulp::signal::VocoderT< SampleType >::set_sibilance_mix ( SampleType m01)
inline

◆ set_unvoiced_sensitivity()

template<typename SampleType = float>
void pulp::signal::VocoderT< SampleType >::set_unvoiced_sensitivity ( SampleType s01)
inline

◆ shift_bands()

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::shift_bands ( ) const
inline

◆ synthesis_gain()

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::synthesis_gain ( int k) const
inline

The level actually applied to synthesis band k — post-freeze, post-shift.

This is env'[k].

◆ unvoiced()

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::unvoiced ( ) const
inline

The smoothed voicing decision: 0 fully voiced, 1 fully unvoiced.

◆ zcr_hz()

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::zcr_hz ( ) const
inline

Measured zero-crossing rate of the modulator, Hz.

◆ zcr_window_ms()

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::zcr_window_ms ( ) const
inline

Effective ZCR window length in ms.

Equals kZcrWindowMs unless the sample rate exceeds kMaxSampleRate, in which case the fixed buffer shortens it and this reports the truth.

Member Data Documentation

◆ kAttackCycles

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kAttackCycles = 0.5
staticconstexpr

Attack floor, same units and the same honest gap.

[design parameter] default 0.5, range 0.25 .. 1.0.

◆ kAttackMaxMs

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kAttackMaxMs = 50.0
staticconstexpr

◆ kAttackMinMs

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kAttackMinMs = 0.1
staticconstexpr

◆ kBandSlots

template<typename SampleType = float>
std::size_t pulp::signal::VocoderT< SampleType >::kBandSlots = static_cast<std::size_t>(kMaxBands)
staticconstexpr

◆ kCascadeBWFactor

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kCascadeBWFactor = 0.6435942529055827
staticconstexpr

Bandwidth factor for two identical cascaded 2nd-order bandpass sections.

Derived identity, not a citation. For n identical cascaded sections, |H|^n = 1/√2 at the cascade's −3 dB edges gives 1 + x² = 2^(1/n) where x = Q_section·(ω/ω_c − ω_c/ω), so the cascade's −3 dB bandwidth is narrower than one section's by √(2^(1/n) − 1). For n = 2: √(√2 − 1) = 0.6435942.... Each section therefore runs at Q_section = kCascadeBWFactor · Q_band, i.e. deliberately broader than the target, so that the cascade lands on it. The acceptance suite recomputes this from √(√2 − 1) rather than trusting the literal.

◆ kDcBlockHz

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kDcBlockHz = 10.0
staticconstexpr

DC-blocker corner for both the modulator and the carrier path, Hz.

Not cosmetic: DcBlocker's own default pole puts the corner near 38 Hz at 48 kHz, which is inside the bank — it costs band 0 4.5 % at the 120 Hz default and 16 % at the 60 Hz the parameter table allows. The corner has to sit well below kFreqLoMinHz, and it has to be specified in Hz rather than as a pole so it means the same thing at every sample rate. [design parameter] default 10 Hz, range 2 .. 30 Hz.

◆ kDefaultPitchHz

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kDefaultPitchHz = 110.0
staticconstexpr

Internal carrier pitch, Hz.

Not in the spec, and it has to be. The spec gives the internal oscillator a wave and a pulse width but no frequency — neither in the class API nor in the baked-params table — while saying pitch "is set by the host/MIDI upstream". There is no upstream to set it through, and the module cannot make a sound without one, so this is added with a default and a range and reported as a spec gap. [design parameter] default 110 Hz (A2), range 20 .. 2000 Hz.

◆ kEnergyEpsilon

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kEnergyEpsilon = 1e-12
staticconstexpr

Guards the high-frequency energy ratio's divide when every band is silent.

Any value far below the quietest meaningful band envelope works; range 1e-15 .. 1e-9.

◆ kFormantShiftMaxSt

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kFormantShiftMaxSt = 24.0
staticconstexpr

◆ kFormantShiftMinSt

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kFormantShiftMinSt = -24.0
staticconstexpr

◆ kFreqHiMaxHz

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kFreqHiMaxHz = 12000.0
staticconstexpr

◆ kFreqHiMinHz

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kFreqHiMinHz = 3000.0
staticconstexpr

◆ kFreqLoMaxHz

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kFreqLoMaxHz = 400.0
staticconstexpr

◆ kFreqLoMinHz

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kFreqLoMinHz = 60.0
staticconstexpr

◆ kMaxBands

template<typename SampleType = float>
int pulp::signal::VocoderT< SampleType >::kMaxBands = 20
staticconstexpr

Storage cap.

Equals the band_count maximum, so it is not an independent tunable: the array is sized for the widest bank the parameter allows and set_band_count moves only the loop bound.

◆ kMaxPitchHz

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kMaxPitchHz = 2000.0
staticconstexpr

◆ kMaxSampleRate

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kMaxSampleRate = 192000.0
staticconstexpr

Highest sample rate the fixed ZCR window is sized for.

A higher rate still runs; the window simply saturates at kZcrMaxSamples, which shortens it in milliseconds — reported by zcr_window_ms() rather than silently assumed. [design parameter] default 192 kHz, range 48–768 kHz.

◆ kMinBands

template<typename SampleType = float>
int pulp::signal::VocoderT< SampleType >::kMinBands = 10
staticconstexpr

◆ kMinPitchHz

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kMinPitchHz = 20.0
staticconstexpr

◆ kNoiseSeed

template<typename SampleType = float>
std::uint32_t pulp::signal::VocoderT< SampleType >::kNoiseSeed = 0x9E3779B9u
staticconstexpr

Noise seed.

Any non-zero 32-bit value works — Xorshift32 has a fixed point at zero — so the range is the whole non-zero uint32 space. Per series law 2 it is a build-time constant, never automated, never macro-exposed, never randomised at run time. [design parameter] default 0x9E3779B9.

◆ kOutputHeadroomTrim

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kOutputHeadroomTrim = 0.5
staticconstexpr

Static trim on the summed synthesis bank.

Overlapping constant-Q bands sum with partial coherence; this is the fixed allowance for it. [design parameter] default 0.5 (−6.02 dB), range 0.35 .. 0.7.

◆ kOutputTrimMaxDb

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kOutputTrimMaxDb = 12.0
staticconstexpr

◆ kOutputTrimMinDb

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kOutputTrimMinDb = -24.0
staticconstexpr

◆ kPreEmphasis

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kPreEmphasis = 0.95
staticconstexpr

Pre-emphasis coefficient, y[n] = x[n] − a·x[n−1], applied to the modulator only.

Speech rolls off about −6 dB/oct, so without this the upper bands see almost nothing and consonants never earn a fair envelope level. [design parameter] default 0.95, range 0.0 (off) .. 0.97.

◆ kPulseWidthMax

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kPulseWidthMax = 0.95
staticconstexpr

◆ kPulseWidthMin

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kPulseWidthMin = 0.05
staticconstexpr

◆ kReleaseMaxMs

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kReleaseMaxMs = 200.0
staticconstexpr

◆ kReleaseMinMs

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kReleaseMinMs = 2.0
staticconstexpr

◆ kRippleCycles

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kRippleCycles = 2.0
staticconstexpr

Release floor, in cycles of each band's own centre frequency.

The mechanism is textbook — a rectified sinusoid at f_c ripples at 2·f_c — but the count is an original engineering choice with no citable constant behind it (honest gap), which is why it ships as a named parameter rather than as a number inside a formula. [design parameter] default 2.0, range 1.0 .. 4.0.

◆ kSensSpan

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kSensSpan = 0.5
staticconstexpr

How far unvoiced_sensitivity can bias the raw decision.

[design parameter] default 0.5, range 0.3 .. 0.7.

◆ kSibilanceCornerHz

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kSibilanceCornerHz = 3500.0
staticconstexpr

What counts as sibilance.

Single-sourced deliberately: the same corner decides which bands feed the high-frequency energy ratio, which bands take noise substitution under an external carrier, and where the direct sibilance path starts. Three definitions of "high" would drift apart. [design parameter] default 3500 Hz, range 2500 .. 5000 Hz.

◆ kUnvoicedNoise

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kUnvoicedNoise = 0.9
staticconstexpr

How much noise a fully unvoiced decision substitutes into the carrier.

[design parameter] default 0.9, range 0.5 .. 1.0.

◆ kUvEnter

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kUvEnter = 0.6
staticconstexpr

Schmitt thresholds on the raw decision.

kUvEnter > kUvLeave always. [design parameter] defaults 0.6 / 0.4, ranges 0.55 .. 0.75 and 0.25 .. 0.45.

◆ kUvLeave

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kUvLeave = 0.4
staticconstexpr

◆ kUvSmoothMs

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kUvSmoothMs = 8.0
staticconstexpr

One-pole smoothing on the decision, as a 10→90 % time to match the follower convention this file uses everywhere.

[design parameter] default 8 ms, range 2 .. 30 ms.

◆ kWorstCaseGain

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kWorstCaseGain = 2.0
staticconstexpr

The pre-trim reconstruction bound Forge's registry cites.

Fixed by the filterbank topology (constant-Q sections, up to kMaxBands overlapping) rather than by a knob, and asserted by the acceptance suite at every band count — never estimated (series law 8).

◆ kZcrHi

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kZcrHi = 4500.0
staticconstexpr

[design parameter] default 4500 Hz, range 3000 .. 6000 Hz.

◆ kZcrLo

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kZcrLo = 1500.0
staticconstexpr

Zero-crossing rate mapped to [0, 1] between these edges.

Voiced speech crosses slowly; fricatives cross fast. The cue is Flanagan's; the edges are tuned design parameters (honest gap — no citable threshold exists). [design parameter] default 1500 Hz, range 800 .. 2000 Hz.

◆ kZcrWindowMs

template<typename SampleType = float>
double pulp::signal::VocoderT< SampleType >::kZcrWindowMs = 20.0
staticconstexpr

Sliding-window length for the crossing count.

[design parameter] default 20 ms, range 10 .. 40 ms.


The documentation for this class was generated from the following file:
  • /home/runner/work/pulp/pulp/core/signal/include/pulp/signal/vocoder.hpp