
Signal Processing Libraries for FAUST Julius Smith CCRMA, Stanford University Linux Audio Conference 2012 (LAC-12) April 14, 2012 Julius Smith LAC-12 – 1 / 30 Overview effect.lib filter.lib oscillator.lib Conclusion Overview Julius Smith LAC-12 – 2 / 30 FAUST Signal Processing Libraries Overview oscillator.lib — signal sources effect.lib • filter.lib filter.lib — general-purpose digital filters oscillator.lib • Conclusion effect.lib — digital audio effects • Julius Smith LAC-12 – 3 / 30 Highlights of Additions Since LAC-08 Overview oscillator.lib effect.lib • filter.lib Filter-Based Sinusoid Generators oscillator.lib ◦ Alias-Suppressed Classic Waveform Generators Conclusion ◦ filter.lib • Ladder/Lattice Digital Filters ◦ Audio Filter Banks ◦ effect.lib • Biquad-Based Moog VCFs ◦ Phasing/Flanging/Compression ◦ Artificial Reverberation ◦ Julius Smith LAC-12 – 4 / 30 Overview effect.lib filter.lib oscillator.lib Conclusion effect.lib Julius Smith LAC-12 – 5 / 30 Moog Voltage Controlled Filters (VCF) Overview moog vcf 2b = ideal Moog VCF transfer function factored effect.lib • • Moog VCF into second-order “biquad” sections • phasing/flanging • reverberation Static frequency response is more accurate than filter.lib ◦ moog vcf (which has an unwanted one-sample delay in oscillator.lib its feedback path) Conclusion Coefficient formulas are more complex when one or both ◦ parameters are varied moog vcf 2bn = same but using normalized ladder biquads • Super-robust to time-varying resonant-frequency ◦ changes (no pops!) See FAUST example vcf wah pedals.dsp ◦ Julius Smith LAC-12 – 6 / 30 Moog VCF Moog VCF See FAUST example vcf wah pedals.dsp moog vcf(res,fr) analog-form Moog VCF res = corner-resonance amount [0-1] fr = corner-resonance frequency in Hz moog vcf 2b(res,fr) Moog VCF implemented as two biquads (tf2) moog vcf 2bn(res,fr) two protected, normalized-ladder biquads (tf2np) Julius Smith LAC-12 – 7 / 30 Phasing and Flanging Phasing and Flanging See FAUST example phaser flanger.dsp vibrato2 mono(...) modulated allpass-chain (see effect.lib for usage) phaser2 mono(...) phasing based on 2nd-order allpasses (see effect.lib for phaser2 stereo(...) stereo phaser based on 2nd-order allpass chains flanger mono(...) mono flanger flanger stereo(...) stereo flanger Julius Smith LAC-12 – 8 / 30 Artificial Reverberation (effect.lib) Overview General Feedback Delay Network (FDN) Reverberation effect.lib • • Moog VCF • phasing/flanging See FAUST example reverb designer.dsp • reverberation filter.lib oscillator.lib Zita-Rev1 Reverb (FDN+Schroeder) by Fons Adriaensen Conclusion • (ported to FAUST) See FAUST example zita rev1.dsp Julius Smith LAC-12 – 9 / 30 Overview effect.lib filter.lib oscillator.lib Conclusion filter.lib Julius Smith LAC-12 – 10 / 30 Ladder/Lattice Digital Filters (filter.lib) Overview Ladder and lattice digital filters have superior numerical effect.lib • filter.lib properties • ladder/lattice • normalized ladder Arbitrary Order (thanks to pattern matching in FAUST) • filter banks • oscillator.lib Arbitrary (Stable) Poles and Zeros Conclusion • All Four Major Types: • Kelly-Lochbaum Ladder Filter ◦ One-Multiply Lattice Filter ◦ Two-Multiply Lattice Filter ◦ Normalized Ladder Filter ◦ Julius Smith LAC-12 – 11 / 30 Normalized Ladder Digital Filters (filter.lib) Overview Advantages of the Normalized Ladder Filter Structure: effect.lib filter.lib Signal Power Invariant wrt Coefficient Variation • ladder/lattice • • normalized ladder • filter banks Extreme Modulation is Safe oscillator.lib ⇒ Super-Solid Biquad (sweep it as fast as you want!): Conclusion • tf2snp() “transfer function, 2nd-order, s-plane, normalized, protected” See FAUST example vcf wah pedals.dsp • Julius Smith LAC-12 – 12 / 30 Ladder and Lattice Digital Filters Lattice/Ladder Filters iir lat2(bcoeffs,acoeffs) two-multiply lattice digital filter iir kl(bcoeffs,acoeffs) Kelly-Lochbaum ladder digital filter iir lat1(bcoeffs,acoeffs) one-multiply lattice digital filter iir nl(bcoeffs,acoeffs) normalized ladder digital filter tf2np(b0,b1,b2,a1,a2) biquad based on stabilized second-order normalized ladder filter nlf2(f,r) second-order normalized ladder digital filter special API Julius Smith LAC-12 – 13 / 30 Block Diagrams Overview effect.lib import("filter.lib"); filter.lib • ladder/lattice bcoeffs = (1,2,3); • normalized ladder • filter banks acoeffs = (0.1,0.2); oscillator.lib Conclusion process = impulse <: iir(bcoeffs,acoeffs), iir_lat2(bcoeffs,acoeffs), iir_kl(bcoeffs,acoeffs), iir_lat1(bcoeffs,acoeffs) :> _; Julius Smith LAC-12 – 14 / 30 Audio Filter Banks (filter.lib) Overview ∆ effect.lib “Analyzer” = Power-Complementary Band-Division • filter.lib (e.g., for Spectral Display) • ladder/lattice • normalized ladder • filter banks See FAUST example spectral level.dsp oscillator.lib Conclusion ∆ “Filterbank = Allpass-Complementary Band-Division • (Bands Summable Without Notch Formation) See FAUST example graphic eq.dsp Filterbanks in filter.lib are implemented as analyzers in • cascade with delay equalizers that convert the (power-complementary) analyzer to an (allpass-complementary) filter bank Julius Smith LAC-12 – 15 / 30 Overview effect.lib filter.lib oscillator.lib Conclusion oscillator.lib Julius Smith LAC-12 – 16 / 30 oscillator.lib Overview Reference implementations of elementary signal generators: effect.lib filter.lib sinusoids (filter-based) oscillator.lib • • sinusoids sawtooth (bandlimited) • oscb • • oscr • oscs pulse-train = saw minus delayed saw • oscw ◦ • virtual analog square = 50% duty-cycle pulse-train • sawN ◦ • sawtooth examples triangle = (leakily) integrated square • pink noise ◦ Conclusion impulse-train = differentiated saw ◦ (all alias-suppressed) ◦ pink-noise (1/f noise) • Julius Smith LAC-12 – 17 / 30 Sinusoid Generators in oscillator.lib Overview “biquad” two-pole filter section effect.lib oscb filter.lib (impulse response) oscillator.lib oscr 2D vector rotation • sinusoids (second-order normalized ladder) • oscb • oscr provides sine and cosine outputs • oscs oscrs sine output of oscr • oscw • virtual analog oscrc cosine output of oscr • sawN • sawtooth examples oscs state variable osc., cosine output • pink noise (modified coupled form resonator) Conclusion oscw digital waveguide oscillator oscws sine output of oscw oscwc cosine output of oscw Julius Smith LAC-12 – 18 / 30 Block Diagrams Overview Inspect the following test program: effect.lib filter.lib oscillator.lib • sinusoids import("oscillator.lib"); • oscb • oscr • oscs freq = 100; • oscw • virtual analog • sawN process = oscb(freq), • sawtooth examples oscrs(freq), • pink noise Conclusion oscs(freq), oscws(freq); Julius Smith LAC-12 – 19 / 30 Sinusoidal Oscillator oscb Overview oscb (impulsed direct-form biquad) effect.lib filter.lib One multiply and two adds per sample of output oscillator.lib • • sinusoids Amplitude varies strongly with frequency • oscb • • oscr • oscs Numerically poor toward freq=0 (“dc”) • oscw • • virtual analog Nice choice for high, fixed frequencies • sawN • • sawtooth examples • pink noise Conclusion Julius Smith LAC-12 – 20 / 30 Sinusoidal Oscillator oscr Overview oscr (2D vector rotation) effect.lib filter.lib Four multiplies and two adds per sample oscillator.lib • • sinusoids Amplitude is invariant wrt frequency • oscb • • oscr • oscs Good down to dc • oscw • • virtual analog In-phase (cosine) and phase-quadrature (sine) outputs • sawN • • sawtooth examples • pink noise Amplitude drifts over long durations at most frequencies • Conclusion (coefficients are roundings of s = sin(2*PI*freq/SR) 2 2 and c = cos(2*PI*freq/SR), so s + c = 1) 6 Nice for rapidly varying frequencies • Julius Smith LAC-12 – 21 / 30 Sinusoidal Oscillator oscs Overview oscs (digitized “state variable filter”) effect.lib filter.lib “Magic Circle Algorithm” in computer graphics oscillator.lib • • sinusoids Two multiplies and two additions per output sample • oscb • • oscr • oscs Amplitude varies much less with frequency than oscr • oscw • • virtual analog Good down to dc • sawN • • sawtooth examples • pink noise No long-term amplitude drift Conclusion • In-phase and quadrature components available at low • frequencies (exact at dc) Nice lower-cost replacement for oscr when amplitude can • vary slightly with frequency, and exact phase-quadrature outputs are not needed Julius Smith LAC-12 – 22 / 30 Sinusoidal Oscillator oscw Overview oscw (2nd-order digital waveguide oscillator) effect.lib filter.lib One multiply and three additions per sample (fixed frequency) oscillator.lib • • sinusoids Two multiplies and three additions when frequency is changing • oscb • • oscr • oscs Same good properties as oscr, except • oscw • • virtual analog No long-term amplitude drift • sawN ◦ • sawtooth examples Numerical difficulty below 10 Hz or so (not for LFOs) • pink noise ◦ Conclusion One of the two state variables is not normalized (higher ◦ dynamic range) Nice lower-cost replacement for oscr when state-variable • dynamic range can be accommodated (e.g., in VLSI) Julius Smith LAC-12 – 23 / 30 Virtual Analog Waveforms in oscillator.lib Overview imptrain(freq) periodic impulse train effect.lib squarewave(freq) zero-mean square wave filter.lib sawtooth(freq) alias-suppressed sawtooth oscillator.lib sawN(N,freq) order N anti-aliased saw • sinusoids • oscb • oscr sawtooth and sawN based on “Differentiated Polynomial • oscs • • oscw Waveform” (DPW) method for aliasing suppression • virtual analog • sawN sawN uses a differentiated polynomial of order N • sawtooth examples • • pink noise Increase N to reduce aliasing further Conclusion
Details
-
File Typepdf
-
Upload Time-
-
Content LanguagesEnglish
-
Upload UserAnonymous/Not logged-in
-
File Pages30 Page
-
File Size-