filter design in JUCE

Mechboy·2025년 7월 12일

DSP

목록 보기
4/6

JUCE에서 필터설계

Biquad filter 기반 모델링

  • JUCE에서는 기본적으로 Audio EQ Cookbook 의 Biquad filter formula를 기반으로 계산이 됨
H(z)=b0+b1z1+b2z2a0+a1z1+a2z2H(z) = \frac{b_0 + b_1 z^{-1} + b_2 z^{-2}}{a_0 + a_1 z^{-1} + a_2 z^{-2}}
  • 해당 필터 계수 설계에 쓰이는 파라미터는 아래와 같음

1.FsF_s : 필터를 구성하는 오디오 시스템의 샘플링 레이트
2.F0F_0 : cut off frequeny이기도 하지만 band pass나 notch filter에서는 center frequency로 정의됨
3. dBgaindBgain : peaking이나 shelving filter 에서만 사용
4. QQ : Quality factor로 공진정도를 설계하게 되는데 1에 가까울수록 시스템이 발진하는 형태로 나타나게 됨.
5. BWBW : center 주파수 기준으로 3dB값을 가지게 되는 주파수 값의 차이

  • 즉 필터 특성에 따라서 위의 파라미터 계수가 결정되고 나서 아래의 중간 변수를 계산해주면 필터를 구성 할 수 있는계수를 얻을 수 있음

1. 디지털 주파수 계산

ω0=2πf0Fs\omega_0 = 2\pi \cdot \frac{f_0}{F_s}

2. 삼각함수 단축 표현

cosω0,sinω0\cos \omega_0, \quad \sin \omega_0

3. Alpha 계산 방식

케이스에 따라 ( \alpha )는 다음 중 하나로 계산됩니다:

  • (case: Q)
α=sinω02Q\alpha = \frac{\sin \omega_0}{2Q}
  • (case: BW)
α=sinω0sinh(log22BWω0sinω0)\alpha = \sin \omega_0 \cdot \sinh \left( \frac{\log 2}{2} \cdot \text{BW} \cdot \frac{\omega_0}{\sin \omega_0} \right)
  • (case: S)
α=sinω02(A+1A)(1S1)+2\alpha = \frac{\sin \omega_0}{2} \cdot \sqrt{ \left( A + \frac{1}{A} \right) \left( \frac{1}{S} - 1 \right) + 2 }

LPF (Low-Pass Filter)

H(s)=1s2+sQ+1H(s) = \frac{1}{s^2 + \frac{s}{Q} + 1}

디지털 biquad 계수

b0=1cosω02b1=1cosω0b2=1cosω02a0=1+αa1=2cosω0a2=1α\begin{aligned} b_0 &= \frac{1 - \cos \omega_0}{2} \\ b_1 &= 1 - \cos \omega_0 \\ b_2 &= \frac{1 - \cos \omega_0}{2} \\ a_0 &= 1 + \alpha \\ a_1 &= -2 \cos \omega_0 \\ a_2 &= 1 - \alpha \end{aligned}

HPF (High-Pass Filter)

H(s)=s2s2+sQ+1H(s) = \frac{s^2}{s^2 + \frac{s}{Q} + 1}

디지털 biquad 계수

b0=1+cosω02b1=(1+cosω0)b2=1+cosω02a0=1+αa1=2cosω0a2=1α\begin{aligned} b_0 &= \frac{1 + \cos \omega_0}{2} \\ b_1 &= -(1 + \cos \omega_0) \\ b_2 &= \frac{1 + \cos \omega_0}{2} \\ a_0 &= 1 + \alpha \\ a_1 &= -2 \cos \omega_0 \\ a_2 &= 1 - \alpha \end{aligned}

BPF (Band-Pass Filter)

H(s)=ss2+sQ+1H(s) = \frac{s}{s^2 + \frac{s}{Q} + 1}

디지털 biquad 계수

b0=sinω02=Qαb1=0b2=sinω02=Qαa0=1+αa1=2cosω0a2=1α\begin{aligned} b_0 &= \frac{\sin \omega_0}{2} = Q \alpha \\ b_1 &= 0 \\ b_2 &= -\frac{\sin \omega_0}{2} = -Q \alpha \\ a_0 &= 1 + \alpha \\ a_1 &= -2 \cos \omega_0 \\ a_2 &= 1 - \alpha \end{aligned}

Notch (Band Stop Filter)

H(s)=s2+1s2+sQ+1H(s) = \frac{s^2 + 1}{s^2 + \frac{s}{Q} + 1}

디지털 biquad 계수

b0=1b1=2cosω0b2=1a0=1+αa1=2cosω0a2=1α\begin{aligned} b_0 &= 1 \\ b_1 &= -2 \cos \omega_0 \\ b_2 &= 1 \\ a_0 &= 1 + \alpha \\ a_1 &= -2 \cos \omega_0 \\ a_2 &= 1 - \alpha \end{aligned}

4. Juce에서 설정방법

1. 대략적인 적용 순서

//1. Filter 선언
juce::dsp::LadderFilter<float> LadderFilter;

void Oscillator::setSampleRate(double input_rate){
    sampleRate = input_rate;

//2. Sampling rate 설정
    juce::dsp::ProcessSpec spec;
    spec.sampleRate = sampleRate;
    spec.maximumBlockSize = 512;  // 실제 사용 시 getNextAudioBlock에 맞춰서 변경
    spec.numChannels = 2;

    LadderFilter.prepare(spec);

//3. 필터계수 설정
    cutoffFreq = freq;
    Qfactor = Q_num;
    LadderFilter.setCutoffFrequencyHz(freq);
    LadderFilter.setResonance(Q_num);

//4. 오디오 처리 구현 
    juce::dsp::AudioBlock<float> block(buffer);
    juce::dsp::ProcessContextReplacing<float> context(block);

    LadderFilter.process(context);  // 필터 적용

출처
1. https://www.w3.org/TR/audio-eq-cookbook/#formulae

profile
imageprocessing and Data science

0개의 댓글