グラフィックイコライザーの実装例
グラフィックイコライザーとは入力音声の各周波の数帯域を増減させ、音を整えるエフェクターです。
パラメーターとしては各周波数ごとの増幅量(ゲイン)が利用されます。
各周波数の割り当ては100Hzあたりから、オクターブごとに割り当ててるものが多いです。
パラメーター | 意味 | だいたいの範囲 |
---|---|---|
100Hzゲイン | 100hz付近の増幅量 | -15~15dB |
200Hzゲイン | 200hz付近の増幅量 | -15~15dB |
400Hzゲイン | 400hz付近の増幅量 | -15~15dB |
800Hzゲイン | 800hz付近の増幅量 | -15~15dB |
1,600Hzゲイン | 1,600hz付近の増幅量 | -15~15dB |
3,200Hzゲイン | 3,200hz付近の増幅量 | -15~15dB |
6,400Hzゲイン | 6,400hz付近の増幅量 | -15~15dB |
12,800Hzゲイン | 12,800hz付近の増幅量 | -15~15dB |
実装は入力信号をピーキングフィルタを順番に通すだけです。
フィルタは「簡単なデジタルフィルタのサンプルコード」を使用しています。
あくまで実装例ですのでいい音質のものがほしい場合は、ご自身で試行錯誤いただくようお願いします。
【実装イメージ】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
void GraphicEQ(float inL[], float inR[], float outL[], float outR[], int wavelength) { // inL[]、inR[]、outL[]、outR[]はそれぞれ入力信号と出力信号のバッファ(左右) // wavelenghtはバッファのサイズ、サンプリング周波数は44100Hzとする // エフェクターのパラメーター static float gain100Hz = 1.0f; // 周波数 100Hz付近のゲイン(増幅値)。-15~15dB程度 static float gain200Hz = 2.0f; // 周波数 200Hz付近のゲイン(増幅値)。-15~15dB程度 static float gain400Hz = 2.0f; // 周波数 400Hz付近のゲイン(増幅値)。-15~15dB程度 static float gain800Hz = -3.0f; // 周波数 800Hz付近のゲイン(増幅値)。-15~15dB程度 static float gain1600Hz = 0.0f; // 周波数 1,600Hz付近のゲイン(増幅値)。-15~15dB程度 static float gain3200Hz = 2.0f; // 周波数 3,200Hz付近のゲイン(増幅値)。-15~15dB程度 static float gain6400Hz = 2.0f; // 周波数 6,400Hz付近のゲイン(増幅値)。-15~15dB程度 static float gain12800Hz = 0.0f; // 周波数12,800Hz付近のゲイン(増幅値)。-15~15dB程度 // 内部変数 // 各周波数用のフィルタークラス (https://www.utsbox.com/?page_id=728 より) static CMyFilter f100L, f200L, f400L, f800L, f1600L, f3200L, f6400L, f12800L; static CMyFilter f100R, f200R, f400R, f800R, f1600R, f3200R, f6400R, f12800R; // 各周波数を持ち上げる(ピーキング)フィルタを設定 (左分) f100L.Peaking(100.0f, 1.0f, gain100Hz); f200L.Peaking(200.0f, 1.0f, gain200Hz); f400L.Peaking(400.0f, 1.0f, gain400Hz); f800L.Peaking(800.0f, 1.0f, gain800Hz); f1600L.Peaking(1600.0f, 1.0f, gain1600Hz); f3200L.Peaking(3200.0f, 1.0f, gain3200Hz); f6400L.Peaking(6400.0f, 1.0f, gain6400Hz); f12800L.Peaking(12800.0f, 1.0f, gain12800Hz); // 各周波数を持ち上げる(ピーキング)フィルタを設定 (右分) f100R.Peaking(100.0f, 1.0f, gain100Hz); f200R.Peaking(200.0f, 1.0f, gain200Hz); f400R.Peaking(400.0f, 1.0f, gain400Hz); f800R.Peaking(800.0f, 1.0f, gain800Hz); f1600R.Peaking(1600.0f, 1.0f, gain1600Hz); f3200R.Peaking(3200.0f, 1.0f, gain3200Hz); f6400R.Peaking(6400.0f, 1.0f, gain6400Hz); f12800R.Peaking(12800.0f, 1.0f, gain12800Hz); // 入力信号と正弦波を掛け合わせる for (int i = 0; i < wavelength; i++) { // 入力信号にフィルタを直列にかける(左分) float tmpL = inL[i]; tmpL = f100L.Process(tmpL); tmpL = f200L.Process(tmpL); tmpL = f400L.Process(tmpL); tmpL = f800L.Process(tmpL); tmpL = f1600L.Process(tmpL); tmpL = f3200L.Process(tmpL); tmpL = f6400L.Process(tmpL); tmpL = f12800L.Process(tmpL); // 入力信号にフィルタを直列にかける(右分) float tmpR = inR[i]; tmpR = f100R.Process(tmpR); tmpR = f200R.Process(tmpR); tmpR = f400R.Process(tmpR); tmpR = f800R.Process(tmpR); tmpR = f1600R.Process(tmpR); tmpR = f3200R.Process(tmpR); tmpR = f6400R.Process(tmpR); tmpR = f12800R.Process(tmpR); // フィルタをかけた信号を出力する outL[i] = tmpL; outR[i] = tmpR; } } |
上記はあくまで実装例です。
質問はコメント欄や掲示板、Twitterでいただけばとおもいます。
他のエフェクター実装例はこちらにもあります。 → エフェクターの簡単な実装例
■掲示板
■Twitterアカウント:@vstcpp URL:https://twitter.com/vstcpp