2バンドイコライザーの実装例
2バンドイコライザーとは入力音声の低音域と高音域を増幅するエフェクターです。
パラメーターとして下記がよく利用されます。
パラメーター | 意味 | だいたいの範囲 |
---|---|---|
低音周波数 | 増幅する低音域の周波数 | 50Hz~1kHz程度 |
低音ゲイン | 低音域の増幅量 | -15~15dB |
高周波数 | 増幅する高音域の周波数 | 50Hz~1kHz程度 |
高音ゲイン | 高音域の増幅量 | -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 |
void EQ2band(float inL[], float inR[], float outL[], float outR[], int wavelength) { // inL[]、inR[]、outL[]、outR[]はそれぞれ入力信号と出力信号のバッファ(左右) // wavelenghtはバッファのサイズ、サンプリング周波数は44100Hzとする // エフェクターのパラメーター float lowfreq = 400.0f; // 低音域の周波数。50Hz~1kHz程度 float lowgain = 2.0f; // 低音域のゲイン(増幅値)。-15~15dB程度 float highfreq = 4000.0f; // 高音域の周波数。1kHz~12kHz程度 float highgain = 2.0f; // 高音域のゲイン(増幅値)。-15~15dB程度 // 内部変数 CMyFilter lowL, lowR; CMyFilter highL, highR; // フィルタークラス(https://www.utsbox.com/?page_id=728 より) // 低音域を持ち上げる(ローシェルフ)フィルタ設定(左右分) lowL.LowShelf(lowfreq, 1.0f/sqrt(2.0f),lowgain); lowR.LowShelf(lowfreq, 1.0f / sqrt(2.0f), lowgain); // 高音域を持ち上げる(ローシェルフ)フィルタ設定(左右分) highL.HighShelf(highfreq, 1.0f / sqrt(2.0f), highgain); highR.HighShelf(highfreq, 1.0f / sqrt(2.0f), highgain); // 入力信号にエフェクトをかける for (int i = 0; i < wavelength; i++) { // 入力信号にフィルタをかける outL[i] = highL.Process(lowL.Process(inL[i])); outR[i] = highR.Process(lowR.Process(inL[i])); } } |
質問はコメント欄や掲示板、Twitterでいただけばとおもいます。
他のエフェクター実装例はこちらにもあります。 → エフェクターの簡単な実装例
■掲示板
■Twitterアカウント:@vstcpp URL:https://twitter.com/vstcpp