Post

AudioKit의 Convolution

AudioKit의 Convolution

Convolution

이 코드는 AudioKit과 SoundpipeAudioKit을 사용해 컨볼루션 리버브(Convolution Reverb) 효과를 구현한 예제입니다. 특히, 두 개의 다른 임펄스 응답(Impulse Response) 파일을 혼합하여 사용자 지정 리버브 환경을 만드는 것이 핵심입니다.


🔊 핵심 개념 요약

🔹 Convolution

  • Convolution Reverb실제 공간에서 녹음된 ‘임펄스 응답(Impulse Response)’과 입력 오디오 신호를 **곱셈-합산 연산(convolution)**하여, **실제 공간의 리버브를 시뮬레이션합니다.
  • 입력 오디오와 IR 파일을 합성(convolve)하여 현실적인 반향 효과를 구현합니다.

📌 간단 정리

용어 설명
Convolution 입력 신호와 임펄스 응답(IR)을 수학적으로 합성하여 실제 공간과 유사한 반향을 만드는 과정
Impulse Response (IR) 특정 공간에서 “짧고 강한 소리”(예: 박수)를 녹음한 오디오 파일. 공간의 잔향 특성을 포함
Ftable (Function Table) AudioKit과 같은 DSP 환경에서 사용하는 신호 데이터 테이블, 예: 샘플/파형/IR 등을 담은 배열

🎛️ Convolution 클래스 정의

1
// This module will perform partitioned convolution on an input signal using an ftable as an impulse response.
  • input signal: 마이크, 음원 등의 오디오 신호
  • ftable: 임펄스 응답 데이터를 담고 있는 파형 테이블, 흔히 .wav 파일에서 변환됨
  • partitioned convolution: IR을 여러 작은 조각으로 나눠 계산해 CPU 부하를 줄이고 지연(latency)을 줄이는 방식

🔉 예시로 이해하기

  • 당신이 플루트 소리를 건물 계단실에서 연주했다고 가정
  • 실제 계단실에서 녹음된 IR (Impulse Response) 파일: stairwell.wav
  • AudioKit의 Convolution은:

    입력된 플루트 소리를 stairwell.wav의 ftable과 합성해, 마치 그 계단실에서 직접 플루트를 연주한 것처럼 들리게 함


💡 왜 ftable을 쓰는가?

  • 오디오를 실시간 처리하기 위해선 미리 처리된 IR 데이터를 배열(테이블)로 변환하는 게 효율적
  • 이 테이블을 기반으로 빠르게 수학적 곱셈/합산 연산을 진행할 수 있음

🧱 구조 및 동작 흐름

1. 🔧 ConvolutionData

1
2
3
4
struct ConvolutionData {
  var dryWetMix: AUValue = 0.5
  var stairwellDishMix: AUValue = 0.5
}
  • dryWetMix: 원본 소리(player)와 리버브 처리된 소리(믹서 출력) 간 비율.
  • stairwellDishMix: 두 리버브 (stairwell, dish) 간 비율.

2. 🛠️ 임펄스 응답 파일 불러오기

1
2
let stairwellURL = ...
let dishURL = ...
  • 각각의 리버브 환경을 묘사하는 .wav 파일

    • stairwell.wav: 계단실과 같은 큰 공간 느낌
    • dish.wav: 금속성 또는 특이한 잔향 느낌

3. 🔄 Convolution 효과 구성

1
2
stairwellConvolution = Convolution(player, impulseResponseFileURL: stairwellURL, partitionLength: 8192)
dishConvolution = Convolution(player, impulseResponseFileURL: dishURL, partitionLength: 8192)
  • partitionLength: 처리 블록 크기. 값이 작을수록 지연은 줄지만 CPU 사용률이 증가
  • 두 개의 서로 다른 공간 리버브 효과 생성

4. 🔀 DryWetMixer 체인

1
2
3
stairwellDishMixer = DryWetMixer(stairwellConvolution, dishConvolution, balance: 0.5)
dryWetMixer = DryWetMixer(player, stairwellDishMixer, balance: 0.5)
engine.output = dryWetMixer
  • 리버브 A와 B를 섞은 결과 → 원본과 또 섞음
  • 최종 출력은 dryWetMixer
1
2
3
4
5
6
7
8
9
10
11
12
13
14
     [Player]
        │
 ┌─────┴─────┐
 ▼           ▼
Stairwell   Dish
  │           │
  └─────┬─────┘
        ▼
 stairwellDishMixer
        │
        ▼
   dryWetMixer (← player)
        │
     [Engine Output]

7. 🧪 리버브 활성화

1
2
stairwellConvolution.start()
dishConvolution.start()
  • AudioKit의 Node는 사용 전 .start() 필수

🧩 요약

요소 설명
player 오디오 재생용
Convolution IR 기반 리버브 처리
stairwellDishMixer 두 리버브를 섞는 믹서
dryWetMixer 원본과 리버브를 섞는 믹서
data 두 믹서의 balance를 실시간 제어

📌 활용 예시

  • 게임에서 공간 이동에 따른 잔향 효과
  • 음악에서 마이크 녹음 시 실제 공간 질감 추가
  • Foley 사운드 제작

This post is licensed under CC BY 4.0 by the author.