Arc System Works Co., Ltd.                           .
SIG Audio
Audio Digital Signal Processing 1 : EQ




 リアルタイムオーディオ信号処理入門
                      -第1回:イコライザーをつくってみる-


                              アークシステムワークス株式会社
                                 技術開発部長(CTO)
                                    増野 宏之
                                masuno@arcsy.co.jp


Hiroyuki Masuno                                          Page 1
Arc System Works Co., Ltd.                  .
SIG Audio
Audio Digital Signal Processing 1 : EQ




                                自己紹介(その1)
  • 増野 宏之 (Hiroyuki Masuno)
         –   アークシステムワークス株式会社所属
         –   技術開発部長(CTO)
         –   1964年10月8日生まれ, そろそろ48歳(年男)
         –   ゲーム業界26年目
               • プログラマー/オーディオエンジン開発
               • 海外渉外各種交渉業務
               • 法務部部長+宴会担当

Hiroyuki Masuno                                 Page 2
Arc System Works Co., Ltd.                             .
SIG Audio
Audio Digital Signal Processing 1 : EQ




                                自己紹介(その2)
  • コンタクト情報
         – 電子メール :
               • masuno@arcsy.co.jp (会社)
               • webmaster@artemis-ica.com (個人)
         – Facebook :
           http://www.facebook.com/hiroyuki.masuno.7
         – Twitter : @HiroyukiMasuno
         – LinkedIn : Hiroyuki Masuno
         – 3DS/PSN等すべて実名登録
         – ノーガード戦法

Hiroyuki Masuno                                            Page 3
Arc System Works Co., Ltd.                      .
SIG Audio
Audio Digital Signal Processing 1 : EQ




                                 講演上の注意点
  • A4-DSP Engine Xbox360版の実装を
    ベースに解説
         – XAPO等の書式はWindows版とほぼ同じ
         – 内部オーディオバッファ構造は以下のとおり。
               •   サンプリング周波数は48KHz
               •   波形形式はIEEE754 浮動小数点(-1.0f~1.0f)形式
               •   1オーディオフレーム = 1パケット = 256サンプル
               •   更新間隔= 256/48000 = 約5.3ミリ秒
               •   オーディオフレームレート = 187.5Hz

Hiroyuki Masuno                                     Page 4
Arc System Works Co., Ltd.                 .
SIG Audio
Audio Digital Signal Processing 1 : EQ




                                セッションの流れ
  1.      オーディオ信号処理とは何か、その重要性
  2.      イコライザーの基本理論(フィルター)
  3.      XAudio2上での設計と実装
  4.      EQ実演(NAX Music Player(PSVITA))
  5.      ゲーム業界震撼のカミングアウト(笑)
  6.      質疑応答(時間があれば)




Hiroyuki Masuno                                Page 5
Arc System Works Co., Ltd.                    .
SIG Audio
Audio Digital Signal Processing 1 : EQ




                                         昔話
  • 音が専用ハードで再生されていたのは昔。
         – ファミコン(矩形波x2・三角波x1・ノイズx1)
         – 0x4000-0x400F番地のレジスタに値を書き込
           んで発音させていた。
         – CPU速度: 6502Aの1.79MHz
               • オーディオ機能はCPU直結
               • 6502A+DAC=リコーRP2A03


Hiroyuki Masuno                                   Page 6
Arc System Works Co., Ltd.                       .
SIG Audio
Audio Digital Signal Processing 1 : EQ




    オーディオ信号処理の重要性(1)
  • 計算資源の爆発的な増加
         – ファミコン(1983年)(俺=19歳)
               • MOS Technology 6502A, 1.79MHz
               • 8ビット
         – 最新鋭のPC (2012年)(俺=48歳)
               •   Intel Core-i7 3770K
               •   最大3.9GHz, 4コア, 8ハードウェアスレッド
               •   64ビット
               •   単純なクロック周波数比較でも2,000倍

Hiroyuki Masuno                                      Page 7
Arc System Works Co., Ltd.               .
SIG Audio
Audio Digital Signal Processing 1 : EQ




    オーディオ信号処理の重要性(2)
  • メインCPUやDSPがオーディオ処理を担当する時
    代になった。
         – オーディオパイプラインの誕生
         – 今では、比較的重い処理のひとつ。
         – 効率的なオーディオパイプライン設計のために、リ
           アルタイムオーディオ信号処理技術を学ぶ必要性が
           生じた。
               • 日本語で書かれた参考書はあまり多くない。
               • ゲームの場合、重要となる高速化に関する書籍はほぼゼロと
                 いう悲しい状態。高速化→表現力の向上
Hiroyuki Masuno                              Page 8
Arc System Works Co., Ltd.                                              .
SIG Audio
Audio Digital Signal Processing 1 : EQ




                                     参考書の紹介
                                         • C言語ではじめる音のプログラミング
                                           -サウンドエフェクトの信号処理-
                                          –   著者:青木 直史
                                          –   出版社: オーム社 (2008/12)
                                          –   ISBN-10: 4274206505
                                          –   ISBN-13: 978-4274206504
                                          –   2,730円




Hiroyuki Masuno                                                             Page 9
Arc System Works Co., Ltd.               .
SIG Audio
Audio Digital Signal Processing 1 : EQ




                   オーディオ信号処理とは
  • 入力バッファに蓄積されたオーディオ信号波
    形になんらかの数値演算を行い出力バッファ
    に書き出す処理のこと。たとえば・・・
         – 信号を一定時間(0.2~1秒程度)遅らせて重ねる
               • デジタルディレイ
         – 信号の遅延時間を小刻みに変化させる
               • コーラス
         – 信号を極端に増幅し、波形を飽和させる
               • ディストーション
Hiroyuki Masuno                              Page 10
Arc System Works Co., Ltd.                           .
SIG Audio
Audio Digital Signal Processing 1 : EQ




             オーディオ信号処理とは(2)
  • 実は、入力バッファも出力バッファも必須では
    ないし、必ずしも波形を加工する必要もない。
         – 入力バッファがない例
               • 内部処理で波形を作り出す
                      – WG (Wave Generator)
         – 入力波形を加工せずに出力波形にコピーする
               • 最大波高値を検出する
                      – VUメーター
               • もっとも確からしいBPM値を検出する
                      – リアルタイムBPM解析(A4-BPM/A4-VMA)
Hiroyuki Masuno                                          Page 11
Arc System Works Co., Ltd.                            .
SIG Audio
Audio Digital Signal Processing 1 : EQ




         今回の講演における信号処理
  • 第1回目の今回に関しては、入力波形になんらかの
    演算をして出力波形に書き出す、一般的なエフェク
    ターに関する説明を行う。
  • WindowsにおけるXAudio2では、XAPOとして
    規定されている。
         – XAPO: XAudio Audio Processing Object

      入力波形                          →    演算処理   →   出力波形


Hiroyuki Masuno                                           Page 12
Arc System Works Co., Ltd.                                      .
SIG Audio
Audio Digital Signal Processing 1 : EQ




                         一番簡単な処理の例
  • アッテネーター(減衰器)(Attenuator)
         – 入力された波形を半分の音量にして出力する
         – [半分の音量]→[外部から変えることができるように書
           き直す]→[ボリューム調整APO]の出来上がり



      入力波形                        →        演算処理          →   出力波形
       fIn                               fOut=fIn*0.5f        fOut


Hiroyuki Masuno                                                     Page 13
Arc System Works Co., Ltd.                                                                          .
SIG Audio
Audio Digital Signal Processing 1 : EQ




                             XAPOのヘッダー
  #pragma       once
  // XAPOベースクラス
  #include <ATGAPOBase.h>
  // クラスを作るときのおまじない
  class declspec(uuid("{5EB8D611-FF96-429d-8365-2DDF89A7C1CD}"))           CA4FXAPOATT : public
        ATG::CSampleXAPOBase<CA4FXAPOATT, A4FXAPOATTPARAMSTATS>
  {
    public:
    // コンストラクター
    CA4FXAPOATT();
    // デストラクター
    ~CA4FXAPOATT();
    // FXAPOロックプロセッサー (Xbox360の場合, 48KHz, 16bit, 256samplesが1パケットであることは自明なので、特にこのプロセス
        WAVEFORMATEX情報を取得する必要はない)
    HRESULT LockForProcess(UINT32 InputLockedParameterCount, const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS*
        pInputLockedParameters, UINT32 OutputLockedParameterCount, const
        XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS* pOutputLockedParameters);
    // FXAPOアンロックプロセッサー (Xbox360の場合不要)
    void        UnlockForProcess();
    private:
    // ATGAPOBaseクラスからの継承メソッド
    // シグナルプロセッサー (これが本体)
    void DoProcess(const A4FXAPOATTPARAMSTATS&, FLOAT32* __restrict pData, UINT32 cFrames, UINT32
        cChannels);
    // RPCマニピュレーター (FXAPOの場合、調整可能な変数を大域変数におくので特に不要)
    void OnSetParameters(const A4FXAPOATTPARAMSTATS& params);
  };



Hiroyuki Masuno                                                                                         Page 14
Arc System Works Co., Ltd.                                      .
SIG Audio
Audio Digital Signal Processing 1 : EQ




                             XAPOのヘッダー
  • 実際に必要なもの(A4FXAPOATT.h)
         – コンストラクター
            • CA4FXAPOATT();
         – デストラクター
            • ~CA4FXAPOATT();
         – ロックプロセッサー(360では不要)
            • HRESULT LockForProcess(UINT32 InputLockedParameterCount,
              const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS*
              pInputLockedParameters, UINT32
              OutputLockedParameterCount, const
              XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS*
              pOutputLockedParameters);
         – シグナルプロセッサー
            • void DoProcess(const A4FXAPOATTPARAMSTATS&, FLOAT32*
              __restrict pData, UINT32 cFrames, UINT32 cChannels);
         – RPCマニピュレーター(FXAPOでは不要)
            • void OnSetParameters(const A4FXAPOATTPARAMSTATS&
              params);

Hiroyuki Masuno                                                     Page 15
Arc System Works Co., Ltd.                                                          .
SIG Audio
Audio Digital Signal Processing 1 : EQ




           シグナルプロセッサーの処理
  void        CA4FXAPOATT::DoProcess(const A4FXAPOATTPARAMSTATS &, FLOAT32 *__restrict
        pData, UINT32 cFrames, UINT32 cChannels)
  {
    // Locals
    int       indexC, indexS;
    int       indexAccess;
    int       numSamples, numChannels;
    float     fIn, fOut;
    // 1パケットあたりのサンプル数とチャンネル数を設定
    numSamples          =          (int)cFrames;
    numChannels         =          (int)cChannels;
    // 処理
    for (indexC = 0 ; indexC < numChannels ; indexC++)
    {
      for (indexS = 0 ; indexS < numSamples ; indexS++)
      {
        indexAccess = indexS * numChannels + indexC;
        fIn = pData[indexAccess];
        fOut = fIn * 0.5f;
        pData[indexAccess] = fOut;
      }
    }
  }

Hiroyuki Masuno                                                                         Page 16
Arc System Works Co., Ltd.                        .
SIG Audio
Audio Digital Signal Processing 1 : EQ




                             実際の処理の部分
  for (indexC = 0 ; indexC < numChannels ; indexC++)
   {
    for (indexS = 0 ; indexS < numSamples ; indexS++)
    {
      // アクセス位置を計算(ステレオの場合LRLRLR…で並んでいる)
      indexAccess = indexS * numChannels + indexC;
      fIn = pData[indexAccess];
      fOut = fIn * 0.5f;   //    半分の音量にする
      pData[indexAccess] = fOut;
    }
   }
  }

Hiroyuki Masuno                                       Page 17
Arc System Works Co., Ltd.               .
SIG Audio
Audio Digital Signal Processing 1 : EQ




                             イコライザーを作る




Hiroyuki Masuno                              Page 18
Arc System Works Co., Ltd.                  .
SIG Audio
Audio Digital Signal Processing 1 : EQ




                         イコライザーとは何か
  • 波形信号の周波数特性を変更する音響機器
  • エフェクターの一種(XAPOで設計可能)
  • グラフィックイコライザー
         –   中央周波数一定
         –   調整できる帯域の幅も一定
         –   ゲインのみ変更できる
         –   多数(5~31程度)の周波数領域(バンド)が調整できる。
  • パラメトリックイコライザー
         – 上記の3要素(中央周波数・帯域幅・ゲイン)すべてを変更できる
         – 調整できるバンドの数は少ない(3~5程度)


Hiroyuki Masuno                                 Page 19
Arc System Works Co., Ltd.               .
SIG Audio
Audio Digital Signal Processing 1 : EQ




                  イコライザー設計方法(1)
  • Linear Phase法
         – FFT(フーリエ変換)を使う
               • 入力波形をFFTして周波数領域に直交変換
               • 各周波数ビン利得を変更
               • iFFTして時間領域に逆変換
         – 特徴
               • 位相情報は保持される
               • iFFT変換後、窓のつなぎ目で、波形を綺麗に繋ご
                 うとすると、最低でも1,024サンプルFFT + 75%
                 オーバーラップ程度の演算が必要となるため重い。
Hiroyuki Masuno                              Page 20
Arc System Works Co., Ltd.                                 .
SIG Audio
Audio Digital Signal Processing 1 : EQ




                  イコライザー設計方法(2)
  • 双2次フィルター法(Biquad Filter)
         – IIR(無限インパルス応答)フィルターを使う
               • RBJ Audio-EQ-Cookbook あまりにも有名
               • http://www.musicdsp.org/files/Audio-EQ-
                 Cookbook.txt
         – 特徴
               • 時間軸側の計算式があるのでFFT不要で高速
               • 位相情報は保持されない
               • バンドパスフィルターの性能はLinear法に劣る
Hiroyuki Masuno                                                Page 21
Arc System Works Co., Ltd.                                        .
SIG Audio
Audio Digital Signal Processing 1 : EQ




                今回設計するイコライザー
  • 10バンドのグラフィックイコライザー
         – ゲーム内組み込み用に簡素化
         – 37.5, 75, 150, 300, 600, 1.2K, 2.4K, 4.8K, 9.6K, 19.2Kの10バンド
           (Xbox360)
         – 31.5, 63, 125, 250, 500, 1K, 2K, 4K, 8K, 16Kの10バンド
           (Windows, PSVITA)
         – 31.5Hz領域[LF]はLPF (Xbox360, Low Shelf)
         – 16KHz領域[HF]はHPF (Xbox360, High Shelf)
         – 中央の8バンド[MF1-8]はBPF
         – 帯域幅:中央周波数の2/3の値にする
               • 37.5(25), 75(50), 150(100), 300(200)⁄
         – ゲイン調整幅 +/- 18.0dBで0.1dB刻み

Hiroyuki Masuno                                                       Page 22
Arc System Works Co., Ltd.                          .
SIG Audio
Audio Digital Signal Processing 1 : EQ




                                         処理フロー
              事前パラメーター計算
                    ↓
               入力側から読み込み
                    ↓
     LF,MF1-MF8,HFの順に10段のフィルターを通す
        バンド増幅値が0.0dBの場合は計算しない
                                            ↓
                                         出力側に書き出し
Hiroyuki Masuno                                         Page 23
Arc System Works Co., Ltd.                        .
SIG Audio
Audio Digital Signal Processing 1 : EQ




               高速化のための定数化(1)
  • ゲイン調整用の乗数は事前計算
         – Vテーブル
         – -18.0dB(0.125f)~+18.0dB(8.000f)まで
               • 0.1dB刻みなので361段階
  • 三角関数は計算しない
         – K = tan(pi * Fc / Fs) [LF,HF]
         – K = tan(pi * Fw / Fs) [MF]
         – D = -cos(2 * pi * Fc / Fs) [MF only]
               • Fs : サンプリング周波数48,000
               • Fc : 中央周波数(一定)
               • Fw : ゲイン調整幅(一定)

Hiroyuki Masuno                                       Page 24
Arc System Works Co., Ltd.                          .
SIG Audio
Audio Digital Signal Processing 1 : EQ




               高速化のための定数化(2)
  • Vテーブル
  const double FXAPO_PGEQ3_BAND_GAIN_TABLE[361] =
  {
   0.1250000000000000, // -18.0dB
   0.1264524300377400, // -17.9dB
   0.1279217364995970, // -17.8dB
   0.1294081154801720, // -17.7dB
   0.1309117653525780, // -17.6dB
   ......
   ......
   ......
   7.6387328312833300, // +17.6dB
   7.7274906313987600, // +17.7dB
   7.8172797474739700, // +17.8dB
   7.9081121628231700, // +17.9dB
   8.0000000000000000, // +18.0dB
  };

Hiroyuki Masuno                                         Page 25
Arc System Works Co., Ltd.                                                                   .
SIG Audio
Audio Digital Signal Processing 1 : EQ




               高速化のための定数化(3)
  • Kテーブル
  const double FXAPO_PGEQ3_BAND_FILTER_CONSTANT_K[10] =
  {
   0.0024543741889439,                   //LF    k   =   tan(PI   *    37.5   /   48000.0)
   0.0032725040294712,                   //MF1   k   =   tan(PI   *    50.0   /   48000.0)
   0.0065450781520340,                   //MF2   k   =   tan(PI   *   100.0   /   48000.0)
   0.0130907170848351,                   //MF3   k   =   tan(PI   *   200.0   /   48000.0)
   0.0261859215691869,                   //MF4   k   =   tan(PI   *   400.0   /   48000.0)
   0.0524077792830412,                   //MF5   k   =   tan(PI   *   800.0   /   48000.0)
   0.1051042352656760,                   //MF6   k   =   tan(PI   * 1600.0    /   48000.0)
   0.2125565616700220,                   //MF7   k   =   tan(PI   * 3200.0    /   48000.0)
   0.4452286853085360,                   //MF8   k   =   tan(PI   * 6400.0    /   48000.0)
   3.0776835371752500,                   //HF    k   =   tan(PI   * 19200.0   /   48000.0)
  };


Hiroyuki Masuno                                                                                  Page 26
Arc System Works Co., Ltd.                                                                .
SIG Audio
Audio Digital Signal Processing 1 : EQ




               高速化のための定数化(4)
  • Dテーブル
  const double FXAPO_PGEQ3_BAND_FILTER_CONSTANT_D[10] =
  {
    0.0,               //                LF    Do not apply
   -0.9999518089593280,//                MF1   d = -cos(2PI   *     75.0   /   48000.0)
   -0.9998072404820650,//                MF2   d = -cos(2PI   *    150.0   /   48000.0)
   -0.9992290362407230,//                MF3   d = -cos(2PI   *    300.0   /   48000.0)
   -0.9969173337331280,//                MF4   d = -cos(2PI   *    600.0   /   48000.0)
   -0.9876883405951380,//                MF5   d = -cos(2PI   *   1200.0   /   48000.0)
   -0.9510565162951540,//                MF6   d = -cos(2PI   *   2400.0   /   48000.0)
   -0.8090169943749470,//                MF7   d = -cos(2PI   *   4800.0   /   48000.0)
   -0.3090169943749470,//                MF8   d = -cos(2PI   *   9600.0   /   48000.0)
    0.0,               //                HF    Do not apply
  };




Hiroyuki Masuno                                                                               Page 27
Arc System Works Co., Ltd.                                                                      .
SIG Audio
Audio Digital Signal Processing 1 : EQ




            事前パラメータ計算(aa,dd)
  double       d, k, v;
  // フィルタパラメータdとkを定数表から引く、またvはm_dBandGainと等価となる
  d = FXAPO_PGEQ3_BAND_FILTER_CONSTANT_D[indexB];
  k = FXAPO_PGEQ3_BAND_FILTER_CONSTANT_K[indexB];
  v = m_dBandGain[indexB];
  // フィルターパラメータh2は共通処理
  h2[indexB] = (v - 1.0) / 2.0;
  // フィルタパラメータaa,ddを計算する
  // 0 -- LF : ローシェルフフィルタ
  if (0 == indexB)
  {
    if (v > 1.0) {aa[indexB] = (k - 1.0) / (k + 1.0);}     //Boost:   a = (K - 1) / (K + 1)
    else         {aa[indexB] = (k - v) / (k + v);}         //Cut:     a = (K - v) / (K + v)
  }
  // 1~8 -- MF : バンドパスフィルタ (MF1~MF8の8種類ある)
  else if (indexB >= 1 && indexB <= 8)
  {
    if (v > 1.0) {aa[indexB] = (k - 1.0) / (k + 1.0);}     //Boost:   a = (K - 1) / (K + 1)
    else         {aa[indexB] = (k - v) / (k + v);}         //Cut:     a = (K - v) / (K + v)
    dd[indexB] = d * (1.0 - aa[indexB]);                   //Cross:   d = D * (1 - a)
  }
  // 9 -- HF : ハイシェルフフィルタ
  else
  {
  if (v > 1.0) {aa[indexB] = (k - 1.0) / (k + 1.0);}       //Boost:   a = (K - 1) / (K + 1)
  else {aa[indexB] = ((v * k) - 1.0) / ((v * k) + 1.0);}   //Cut:     a = (VK - 1) / (VK + 1)
  }


Hiroyuki Masuno                                                                                     Page 28
Arc System Works Co., Ltd.                               .
SIG Audio
Audio Digital Signal Processing 1 : EQ




                   フィルター処理 (LF/HF)
  // シェルフフィルタ
  // iC:チャンネル番号(0—L, 1—R)
  // iB:バンドID(0—LF, 9—HF)
  // dWave:処理波形の波高値
  // xhn = w - (a - z(prev))
  // w = h2 * (w + ((xhn * a) + z(prev))) + w
  // z(next) = xhn

  {
   xhn[iB]   = dWave - (aa[iB] * z0[iC][iB]);
   dWave     = h2[iB] * (dWave + ((xhn[iB] * aa[iB]) +
               z0[iC][iB])) + dWave;
   z0[iC][iB]= xhn[iB];
  }


Hiroyuki Masuno                                              Page 29
Arc System Works Co., Ltd.                                  .
SIG Audio
Audio Digital Signal Processing 1 : EQ




                  フィルター処理 (MF1-8)
  // MF : バンドパスフィルタ (MF1~MF8)
  // yn1 = (-a * w) + (d * x1) + x2 - (d * y1) + (a * y2)
  // yn0 = h2 * (w - yn1) + w
  {
   yn1[iB] = (-aa[iB] * dWave) + (dd[iB] * x1[iC][iB]) +
             x2[iC][iB] - (dd[iB] * y1[iC][iB]) +
             (aa[iB] * y2[iC][iB]);
   yn0[iB] = h2[iB] * (dWave - yn1[iB]) + dWave;
   // Cross
   x2[iC][iB] = x1[iC][iB];
   x1[iC][iB] = dWave;
   y2[iC][iB] = y1[iC][iB];
   y1[iC][iB] = yn1[iB];
   // IIR Update original sample
   dWave = yn0[iB];
  }


Hiroyuki Masuno                                                 Page 30
Arc System Works Co., Ltd.                      .
SIG Audio
Audio Digital Signal Processing 1 : EQ




                     NAX Music Player
                      Paragraphic EQ


                                         デモ実演

Hiroyuki Masuno                                     Page 31
Arc System Works Co., Ltd.                                             .
SIG Audio
Audio Digital Signal Processing 1 : EQ




             最高速なイコライザー(一部)
  C       PGEQ42 : PARAGRAPHIC EQUALIZER 4 STEREO:2CH
  C       PROGRAMMED BY : HIROYUKI MASUNO
          PROGRAM PGEQ42
          IMPLICIT REAL*8 (A-H, O-Z)
          PARAMETER(NCHAN=2, NBAND=10, NSAMP=1024)
          REAL*8 AA(NBAND), H2(NBAND), DD(NBAND)
          REAL*8 Z0(NCHAN,NBAND), X1(NCHAN,NBAND), X2(NCHAN,NBAND)
          REAL*8 Y1(NCHAN,NBAND), Y2(NCHAN,NBAND)
          REAL*8 XHN(NBAND), YN0(NBAND), YN1(NBAND)
  C------BAND 1:LF:APPLY LOW SHELF FILTER
          IF(DGAIN.EQ.1.0D0) GO TO 100
          DO 110 ITER1=1,NCHAN
            DO 120 ITER2=1,NSAMP
              XHN(1)=DWAVIN(ITER2)-(AA(1)*Z0(ITER1,1))
              DWAVIN(ITER2)=H2(1)*(DWAVIN(ITER2)+
         &                  (XHN(1)*AA(1)+Z0(ITER1,1))+DWAVIN(ITER2)
              Z0(ITER1,1)=XHN(1)
     120    CONTINUE
     110 CONTINUE
     100 CONTINUE
  C--------------------------------------
          END


Hiroyuki Masuno                                                            Page 32
Arc System Works Co., Ltd.                        .
SIG Audio
Audio Digital Signal Processing 1 : EQ


          圧倒的な物量の大域変数・1万行を超えるupdate関数
        唯一にして絶対のGameClass・新世代のプログラムを体感せよ!




                       FOR               TRAN
                                         LEGACY



                             2012年11月絶賛公開!!
Hiroyuki Masuno                                       Page 33
Arc System Works Co., Ltd.               .
SIG Audio
Audio Digital Signal Processing 1 : EQ




  A4-FXAPO by FORTRAN77
  • FXAPOのFは「FORTRAN」のF。
  • Windows版のオーディオパイプラインは、
    すべてFORTRAN77で記述されている。
  • Visual C++とVisual FortranのMixed
    Languageプログラミング
  • 自動ベクトル化と自動並列化で全プラット
    フォーム中で最速。

Hiroyuki Masuno                              Page 34
Arc System Works Co., Ltd.                        .
SIG Audio
Audio Digital Signal Processing 1 : EQ




                   FORTRANで組む利点
  • 現時点でもっとも高速。平均で6倍以上。
         – FFTならば最大で3桁違うことも珍しくない。
         – 言語仕様上、メモリコヒーレンシが高い
               • ポインターがない、変数はすべてコンパイル時確定。
         – C言語でも高速に記述することはもちろん可能、でもそのために、
           覚えることが多すぎるのは、本末転倒。
               • 信号処理マニアなのであって、プログラム言語マニアではない。
  • コンパイラーが自動ベクトル化+並列化する。
         – IntelのマルチコアCPUなら現時点では最速。
         – マルチコアCPUならば、ハードウェアスレッド数内で、チャン
           ネル数が増えても、ほとんど実行速度が変わらない。
  • 膨大な数値計算のライブラリーがある。
         – Intel Math Kernel Library (IMKL/MKL)

Hiroyuki Masuno                                       Page 35
Arc System Works Co., Ltd.                                             .
SIG Audio
Audio Digital Signal Processing 1 : EQ




       Visual Fortran Composer
                                         • Intel Visual Fortran
                                           Composer XE 2013
                                           – 2012年9月6日発売
                                           – Compiler 13.0, IMKL 11.0
                                           – Windows 8, Visual Studio 2012
                                             まで対応
                                           – 価格:258,300円
                                           – 日本ではXLSoftさんが販売
                                           – ゲーム業界で持っているのは
                                             ひょっとしたら私だけ??

Hiroyuki Masuno                                                            Page 36
Arc System Works Co., Ltd.                    .
SIG Audio
Audio Digital Signal Processing 1 : EQ




                            Fortran Forever
  • Windows版をゲーム機版に移植する際に
    は、非常に遅くなるので苦労する。
         – 実はC/C++言語は個人的に苦手
  • ゲーム機向けにもFortran Compilerを!
         – Xbox360, PS3, PSVITA, Wii-U, 次世代機にも!
         – オーディオパイプラインが早いのなら、レン
           ダリングも早いはず。
               • シェーダーもFortranで書けるようにしよう!
Hiroyuki Masuno                                   Page 37
Arc System Works Co., Ltd.                 .
SIG Audio
Audio Digital Signal Processing 1 : EQ




                            Fortran 公式の歌
  •    おおブレネリ あなたの言語はなに?
  •    私の言語はフォートランよ 数値計算が得意なのよ
  •    ヤーーッフォー フォートランランラン
  •    ヤッフォー フォートランランラン
  •    ヤッフォー フォートランランラン
  •    ヤッフォー フォートランランラン
  •    ヤーーッフォー フォートランランラン
  •    ヤッフォー フォートランランラン
  •    ヤッフォー フォートランランラン
  •    ヤッフォーフォー
Hiroyuki Masuno                                Page 38
Arc System Works Co., Ltd.               .
SIG Audio
Audio Digital Signal Processing 1 : EQ




      NAX Music Player (2012)




Hiroyuki Masuno                              Page 39
Arc System Works Co., Ltd.               .
SIG Audio
Audio Digital Signal Processing 1 : EQ




                     NAX Music Player
  • Playstation VITA向け, 11月発売
  • 世界初「音ゲー」が楽しめる音楽プレイヤー
  • 基本無料・有料DLCで機能拡張
         –   ビジュアライザープラグイン
         –   DSP-FXプラグイン
         –   ダンスゲーム/ダンサープラグイン
         –   DJ, 通信カラオケ, 各種音ゲーもDLCで提供

Hiroyuki Masuno                              Page 40
Arc System Works Co., Ltd.                    .
SIG Audio
Audio Digital Signal Processing 1 : EQ




   御静聴ありがとうございました!

                                   質疑応答
                            お問い合わせは
                         masuno@arcsy.co.jp
Hiroyuki Masuno                                   Page 41

The beginners guide of real-time audio processing (Part 1:Equalizer)

  • 1.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ リアルタイムオーディオ信号処理入門 -第1回:イコライザーをつくってみる- アークシステムワークス株式会社 技術開発部長(CTO) 増野 宏之 masuno@arcsy.co.jp Hiroyuki Masuno Page 1
  • 2.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ 自己紹介(その1) • 増野 宏之 (Hiroyuki Masuno) – アークシステムワークス株式会社所属 – 技術開発部長(CTO) – 1964年10月8日生まれ, そろそろ48歳(年男) – ゲーム業界26年目 • プログラマー/オーディオエンジン開発 • 海外渉外各種交渉業務 • 法務部部長+宴会担当 Hiroyuki Masuno Page 2
  • 3.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ 自己紹介(その2) • コンタクト情報 – 電子メール : • masuno@arcsy.co.jp (会社) • webmaster@artemis-ica.com (個人) – Facebook : http://www.facebook.com/hiroyuki.masuno.7 – Twitter : @HiroyukiMasuno – LinkedIn : Hiroyuki Masuno – 3DS/PSN等すべて実名登録 – ノーガード戦法 Hiroyuki Masuno Page 3
  • 4.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ 講演上の注意点 • A4-DSP Engine Xbox360版の実装を ベースに解説 – XAPO等の書式はWindows版とほぼ同じ – 内部オーディオバッファ構造は以下のとおり。 • サンプリング周波数は48KHz • 波形形式はIEEE754 浮動小数点(-1.0f~1.0f)形式 • 1オーディオフレーム = 1パケット = 256サンプル • 更新間隔= 256/48000 = 約5.3ミリ秒 • オーディオフレームレート = 187.5Hz Hiroyuki Masuno Page 4
  • 5.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ セッションの流れ 1. オーディオ信号処理とは何か、その重要性 2. イコライザーの基本理論(フィルター) 3. XAudio2上での設計と実装 4. EQ実演(NAX Music Player(PSVITA)) 5. ゲーム業界震撼のカミングアウト(笑) 6. 質疑応答(時間があれば) Hiroyuki Masuno Page 5
  • 6.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ 昔話 • 音が専用ハードで再生されていたのは昔。 – ファミコン(矩形波x2・三角波x1・ノイズx1) – 0x4000-0x400F番地のレジスタに値を書き込 んで発音させていた。 – CPU速度: 6502Aの1.79MHz • オーディオ機能はCPU直結 • 6502A+DAC=リコーRP2A03 Hiroyuki Masuno Page 6
  • 7.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ オーディオ信号処理の重要性(1) • 計算資源の爆発的な増加 – ファミコン(1983年)(俺=19歳) • MOS Technology 6502A, 1.79MHz • 8ビット – 最新鋭のPC (2012年)(俺=48歳) • Intel Core-i7 3770K • 最大3.9GHz, 4コア, 8ハードウェアスレッド • 64ビット • 単純なクロック周波数比較でも2,000倍 Hiroyuki Masuno Page 7
  • 8.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ オーディオ信号処理の重要性(2) • メインCPUやDSPがオーディオ処理を担当する時 代になった。 – オーディオパイプラインの誕生 – 今では、比較的重い処理のひとつ。 – 効率的なオーディオパイプライン設計のために、リ アルタイムオーディオ信号処理技術を学ぶ必要性が 生じた。 • 日本語で書かれた参考書はあまり多くない。 • ゲームの場合、重要となる高速化に関する書籍はほぼゼロと いう悲しい状態。高速化→表現力の向上 Hiroyuki Masuno Page 8
  • 9.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ 参考書の紹介 • C言語ではじめる音のプログラミング -サウンドエフェクトの信号処理- – 著者:青木 直史 – 出版社: オーム社 (2008/12) – ISBN-10: 4274206505 – ISBN-13: 978-4274206504 – 2,730円 Hiroyuki Masuno Page 9
  • 10.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ オーディオ信号処理とは • 入力バッファに蓄積されたオーディオ信号波 形になんらかの数値演算を行い出力バッファ に書き出す処理のこと。たとえば・・・ – 信号を一定時間(0.2~1秒程度)遅らせて重ねる • デジタルディレイ – 信号の遅延時間を小刻みに変化させる • コーラス – 信号を極端に増幅し、波形を飽和させる • ディストーション Hiroyuki Masuno Page 10
  • 11.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ オーディオ信号処理とは(2) • 実は、入力バッファも出力バッファも必須では ないし、必ずしも波形を加工する必要もない。 – 入力バッファがない例 • 内部処理で波形を作り出す – WG (Wave Generator) – 入力波形を加工せずに出力波形にコピーする • 最大波高値を検出する – VUメーター • もっとも確からしいBPM値を検出する – リアルタイムBPM解析(A4-BPM/A4-VMA) Hiroyuki Masuno Page 11
  • 12.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ 今回の講演における信号処理 • 第1回目の今回に関しては、入力波形になんらかの 演算をして出力波形に書き出す、一般的なエフェク ターに関する説明を行う。 • WindowsにおけるXAudio2では、XAPOとして 規定されている。 – XAPO: XAudio Audio Processing Object 入力波形 → 演算処理 → 出力波形 Hiroyuki Masuno Page 12
  • 13.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ 一番簡単な処理の例 • アッテネーター(減衰器)(Attenuator) – 入力された波形を半分の音量にして出力する – [半分の音量]→[外部から変えることができるように書 き直す]→[ボリューム調整APO]の出来上がり 入力波形 → 演算処理 → 出力波形 fIn fOut=fIn*0.5f fOut Hiroyuki Masuno Page 13
  • 14.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ XAPOのヘッダー #pragma once // XAPOベースクラス #include <ATGAPOBase.h> // クラスを作るときのおまじない class declspec(uuid("{5EB8D611-FF96-429d-8365-2DDF89A7C1CD}")) CA4FXAPOATT : public ATG::CSampleXAPOBase<CA4FXAPOATT, A4FXAPOATTPARAMSTATS> { public: // コンストラクター CA4FXAPOATT(); // デストラクター ~CA4FXAPOATT(); // FXAPOロックプロセッサー (Xbox360の場合, 48KHz, 16bit, 256samplesが1パケットであることは自明なので、特にこのプロセス WAVEFORMATEX情報を取得する必要はない) HRESULT LockForProcess(UINT32 InputLockedParameterCount, const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS* pInputLockedParameters, UINT32 OutputLockedParameterCount, const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS* pOutputLockedParameters); // FXAPOアンロックプロセッサー (Xbox360の場合不要) void UnlockForProcess(); private: // ATGAPOBaseクラスからの継承メソッド // シグナルプロセッサー (これが本体) void DoProcess(const A4FXAPOATTPARAMSTATS&, FLOAT32* __restrict pData, UINT32 cFrames, UINT32 cChannels); // RPCマニピュレーター (FXAPOの場合、調整可能な変数を大域変数におくので特に不要) void OnSetParameters(const A4FXAPOATTPARAMSTATS& params); }; Hiroyuki Masuno Page 14
  • 15.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ XAPOのヘッダー • 実際に必要なもの(A4FXAPOATT.h) – コンストラクター • CA4FXAPOATT(); – デストラクター • ~CA4FXAPOATT(); – ロックプロセッサー(360では不要) • HRESULT LockForProcess(UINT32 InputLockedParameterCount, const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS* pInputLockedParameters, UINT32 OutputLockedParameterCount, const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS* pOutputLockedParameters); – シグナルプロセッサー • void DoProcess(const A4FXAPOATTPARAMSTATS&, FLOAT32* __restrict pData, UINT32 cFrames, UINT32 cChannels); – RPCマニピュレーター(FXAPOでは不要) • void OnSetParameters(const A4FXAPOATTPARAMSTATS& params); Hiroyuki Masuno Page 15
  • 16.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ シグナルプロセッサーの処理 void CA4FXAPOATT::DoProcess(const A4FXAPOATTPARAMSTATS &, FLOAT32 *__restrict pData, UINT32 cFrames, UINT32 cChannels) { // Locals int indexC, indexS; int indexAccess; int numSamples, numChannels; float fIn, fOut; // 1パケットあたりのサンプル数とチャンネル数を設定 numSamples = (int)cFrames; numChannels = (int)cChannels; // 処理 for (indexC = 0 ; indexC < numChannels ; indexC++) { for (indexS = 0 ; indexS < numSamples ; indexS++) { indexAccess = indexS * numChannels + indexC; fIn = pData[indexAccess]; fOut = fIn * 0.5f; pData[indexAccess] = fOut; } } } Hiroyuki Masuno Page 16
  • 17.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ 実際の処理の部分 for (indexC = 0 ; indexC < numChannels ; indexC++) { for (indexS = 0 ; indexS < numSamples ; indexS++) { // アクセス位置を計算(ステレオの場合LRLRLR…で並んでいる) indexAccess = indexS * numChannels + indexC; fIn = pData[indexAccess]; fOut = fIn * 0.5f; // 半分の音量にする pData[indexAccess] = fOut; } } } Hiroyuki Masuno Page 17
  • 18.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ イコライザーを作る Hiroyuki Masuno Page 18
  • 19.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ イコライザーとは何か • 波形信号の周波数特性を変更する音響機器 • エフェクターの一種(XAPOで設計可能) • グラフィックイコライザー – 中央周波数一定 – 調整できる帯域の幅も一定 – ゲインのみ変更できる – 多数(5~31程度)の周波数領域(バンド)が調整できる。 • パラメトリックイコライザー – 上記の3要素(中央周波数・帯域幅・ゲイン)すべてを変更できる – 調整できるバンドの数は少ない(3~5程度) Hiroyuki Masuno Page 19
  • 20.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ イコライザー設計方法(1) • Linear Phase法 – FFT(フーリエ変換)を使う • 入力波形をFFTして周波数領域に直交変換 • 各周波数ビン利得を変更 • iFFTして時間領域に逆変換 – 特徴 • 位相情報は保持される • iFFT変換後、窓のつなぎ目で、波形を綺麗に繋ご うとすると、最低でも1,024サンプルFFT + 75% オーバーラップ程度の演算が必要となるため重い。 Hiroyuki Masuno Page 20
  • 21.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ イコライザー設計方法(2) • 双2次フィルター法(Biquad Filter) – IIR(無限インパルス応答)フィルターを使う • RBJ Audio-EQ-Cookbook あまりにも有名 • http://www.musicdsp.org/files/Audio-EQ- Cookbook.txt – 特徴 • 時間軸側の計算式があるのでFFT不要で高速 • 位相情報は保持されない • バンドパスフィルターの性能はLinear法に劣る Hiroyuki Masuno Page 21
  • 22.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ 今回設計するイコライザー • 10バンドのグラフィックイコライザー – ゲーム内組み込み用に簡素化 – 37.5, 75, 150, 300, 600, 1.2K, 2.4K, 4.8K, 9.6K, 19.2Kの10バンド (Xbox360) – 31.5, 63, 125, 250, 500, 1K, 2K, 4K, 8K, 16Kの10バンド (Windows, PSVITA) – 31.5Hz領域[LF]はLPF (Xbox360, Low Shelf) – 16KHz領域[HF]はHPF (Xbox360, High Shelf) – 中央の8バンド[MF1-8]はBPF – 帯域幅:中央周波数の2/3の値にする • 37.5(25), 75(50), 150(100), 300(200)⁄ – ゲイン調整幅 +/- 18.0dBで0.1dB刻み Hiroyuki Masuno Page 22
  • 23.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ 処理フロー 事前パラメーター計算 ↓ 入力側から読み込み ↓ LF,MF1-MF8,HFの順に10段のフィルターを通す バンド増幅値が0.0dBの場合は計算しない ↓ 出力側に書き出し Hiroyuki Masuno Page 23
  • 24.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ 高速化のための定数化(1) • ゲイン調整用の乗数は事前計算 – Vテーブル – -18.0dB(0.125f)~+18.0dB(8.000f)まで • 0.1dB刻みなので361段階 • 三角関数は計算しない – K = tan(pi * Fc / Fs) [LF,HF] – K = tan(pi * Fw / Fs) [MF] – D = -cos(2 * pi * Fc / Fs) [MF only] • Fs : サンプリング周波数48,000 • Fc : 中央周波数(一定) • Fw : ゲイン調整幅(一定) Hiroyuki Masuno Page 24
  • 25.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ 高速化のための定数化(2) • Vテーブル const double FXAPO_PGEQ3_BAND_GAIN_TABLE[361] = { 0.1250000000000000, // -18.0dB 0.1264524300377400, // -17.9dB 0.1279217364995970, // -17.8dB 0.1294081154801720, // -17.7dB 0.1309117653525780, // -17.6dB ...... ...... ...... 7.6387328312833300, // +17.6dB 7.7274906313987600, // +17.7dB 7.8172797474739700, // +17.8dB 7.9081121628231700, // +17.9dB 8.0000000000000000, // +18.0dB }; Hiroyuki Masuno Page 25
  • 26.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ 高速化のための定数化(3) • Kテーブル const double FXAPO_PGEQ3_BAND_FILTER_CONSTANT_K[10] = { 0.0024543741889439, //LF k = tan(PI * 37.5 / 48000.0) 0.0032725040294712, //MF1 k = tan(PI * 50.0 / 48000.0) 0.0065450781520340, //MF2 k = tan(PI * 100.0 / 48000.0) 0.0130907170848351, //MF3 k = tan(PI * 200.0 / 48000.0) 0.0261859215691869, //MF4 k = tan(PI * 400.0 / 48000.0) 0.0524077792830412, //MF5 k = tan(PI * 800.0 / 48000.0) 0.1051042352656760, //MF6 k = tan(PI * 1600.0 / 48000.0) 0.2125565616700220, //MF7 k = tan(PI * 3200.0 / 48000.0) 0.4452286853085360, //MF8 k = tan(PI * 6400.0 / 48000.0) 3.0776835371752500, //HF k = tan(PI * 19200.0 / 48000.0) }; Hiroyuki Masuno Page 26
  • 27.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ 高速化のための定数化(4) • Dテーブル const double FXAPO_PGEQ3_BAND_FILTER_CONSTANT_D[10] = { 0.0, // LF Do not apply -0.9999518089593280,// MF1 d = -cos(2PI * 75.0 / 48000.0) -0.9998072404820650,// MF2 d = -cos(2PI * 150.0 / 48000.0) -0.9992290362407230,// MF3 d = -cos(2PI * 300.0 / 48000.0) -0.9969173337331280,// MF4 d = -cos(2PI * 600.0 / 48000.0) -0.9876883405951380,// MF5 d = -cos(2PI * 1200.0 / 48000.0) -0.9510565162951540,// MF6 d = -cos(2PI * 2400.0 / 48000.0) -0.8090169943749470,// MF7 d = -cos(2PI * 4800.0 / 48000.0) -0.3090169943749470,// MF8 d = -cos(2PI * 9600.0 / 48000.0) 0.0, // HF Do not apply }; Hiroyuki Masuno Page 27
  • 28.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ 事前パラメータ計算(aa,dd) double d, k, v; // フィルタパラメータdとkを定数表から引く、またvはm_dBandGainと等価となる d = FXAPO_PGEQ3_BAND_FILTER_CONSTANT_D[indexB]; k = FXAPO_PGEQ3_BAND_FILTER_CONSTANT_K[indexB]; v = m_dBandGain[indexB]; // フィルターパラメータh2は共通処理 h2[indexB] = (v - 1.0) / 2.0; // フィルタパラメータaa,ddを計算する // 0 -- LF : ローシェルフフィルタ if (0 == indexB) { if (v > 1.0) {aa[indexB] = (k - 1.0) / (k + 1.0);} //Boost: a = (K - 1) / (K + 1) else {aa[indexB] = (k - v) / (k + v);} //Cut: a = (K - v) / (K + v) } // 1~8 -- MF : バンドパスフィルタ (MF1~MF8の8種類ある) else if (indexB >= 1 && indexB <= 8) { if (v > 1.0) {aa[indexB] = (k - 1.0) / (k + 1.0);} //Boost: a = (K - 1) / (K + 1) else {aa[indexB] = (k - v) / (k + v);} //Cut: a = (K - v) / (K + v) dd[indexB] = d * (1.0 - aa[indexB]); //Cross: d = D * (1 - a) } // 9 -- HF : ハイシェルフフィルタ else { if (v > 1.0) {aa[indexB] = (k - 1.0) / (k + 1.0);} //Boost: a = (K - 1) / (K + 1) else {aa[indexB] = ((v * k) - 1.0) / ((v * k) + 1.0);} //Cut: a = (VK - 1) / (VK + 1) } Hiroyuki Masuno Page 28
  • 29.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ フィルター処理 (LF/HF) // シェルフフィルタ // iC:チャンネル番号(0—L, 1—R) // iB:バンドID(0—LF, 9—HF) // dWave:処理波形の波高値 // xhn = w - (a - z(prev)) // w = h2 * (w + ((xhn * a) + z(prev))) + w // z(next) = xhn { xhn[iB] = dWave - (aa[iB] * z0[iC][iB]); dWave = h2[iB] * (dWave + ((xhn[iB] * aa[iB]) + z0[iC][iB])) + dWave; z0[iC][iB]= xhn[iB]; } Hiroyuki Masuno Page 29
  • 30.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ フィルター処理 (MF1-8) // MF : バンドパスフィルタ (MF1~MF8) // yn1 = (-a * w) + (d * x1) + x2 - (d * y1) + (a * y2) // yn0 = h2 * (w - yn1) + w { yn1[iB] = (-aa[iB] * dWave) + (dd[iB] * x1[iC][iB]) + x2[iC][iB] - (dd[iB] * y1[iC][iB]) + (aa[iB] * y2[iC][iB]); yn0[iB] = h2[iB] * (dWave - yn1[iB]) + dWave; // Cross x2[iC][iB] = x1[iC][iB]; x1[iC][iB] = dWave; y2[iC][iB] = y1[iC][iB]; y1[iC][iB] = yn1[iB]; // IIR Update original sample dWave = yn0[iB]; } Hiroyuki Masuno Page 30
  • 31.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ NAX Music Player Paragraphic EQ デモ実演 Hiroyuki Masuno Page 31
  • 32.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ 最高速なイコライザー(一部) C PGEQ42 : PARAGRAPHIC EQUALIZER 4 STEREO:2CH C PROGRAMMED BY : HIROYUKI MASUNO PROGRAM PGEQ42 IMPLICIT REAL*8 (A-H, O-Z) PARAMETER(NCHAN=2, NBAND=10, NSAMP=1024) REAL*8 AA(NBAND), H2(NBAND), DD(NBAND) REAL*8 Z0(NCHAN,NBAND), X1(NCHAN,NBAND), X2(NCHAN,NBAND) REAL*8 Y1(NCHAN,NBAND), Y2(NCHAN,NBAND) REAL*8 XHN(NBAND), YN0(NBAND), YN1(NBAND) C------BAND 1:LF:APPLY LOW SHELF FILTER IF(DGAIN.EQ.1.0D0) GO TO 100 DO 110 ITER1=1,NCHAN DO 120 ITER2=1,NSAMP XHN(1)=DWAVIN(ITER2)-(AA(1)*Z0(ITER1,1)) DWAVIN(ITER2)=H2(1)*(DWAVIN(ITER2)+ & (XHN(1)*AA(1)+Z0(ITER1,1))+DWAVIN(ITER2) Z0(ITER1,1)=XHN(1) 120 CONTINUE 110 CONTINUE 100 CONTINUE C-------------------------------------- END Hiroyuki Masuno Page 32
  • 33.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ 圧倒的な物量の大域変数・1万行を超えるupdate関数 唯一にして絶対のGameClass・新世代のプログラムを体感せよ! FOR TRAN LEGACY 2012年11月絶賛公開!! Hiroyuki Masuno Page 33
  • 34.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ A4-FXAPO by FORTRAN77 • FXAPOのFは「FORTRAN」のF。 • Windows版のオーディオパイプラインは、 すべてFORTRAN77で記述されている。 • Visual C++とVisual FortranのMixed Languageプログラミング • 自動ベクトル化と自動並列化で全プラット フォーム中で最速。 Hiroyuki Masuno Page 34
  • 35.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ FORTRANで組む利点 • 現時点でもっとも高速。平均で6倍以上。 – FFTならば最大で3桁違うことも珍しくない。 – 言語仕様上、メモリコヒーレンシが高い • ポインターがない、変数はすべてコンパイル時確定。 – C言語でも高速に記述することはもちろん可能、でもそのために、 覚えることが多すぎるのは、本末転倒。 • 信号処理マニアなのであって、プログラム言語マニアではない。 • コンパイラーが自動ベクトル化+並列化する。 – IntelのマルチコアCPUなら現時点では最速。 – マルチコアCPUならば、ハードウェアスレッド数内で、チャン ネル数が増えても、ほとんど実行速度が変わらない。 • 膨大な数値計算のライブラリーがある。 – Intel Math Kernel Library (IMKL/MKL) Hiroyuki Masuno Page 35
  • 36.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ Visual Fortran Composer • Intel Visual Fortran Composer XE 2013 – 2012年9月6日発売 – Compiler 13.0, IMKL 11.0 – Windows 8, Visual Studio 2012 まで対応 – 価格:258,300円 – 日本ではXLSoftさんが販売 – ゲーム業界で持っているのは ひょっとしたら私だけ?? Hiroyuki Masuno Page 36
  • 37.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ Fortran Forever • Windows版をゲーム機版に移植する際に は、非常に遅くなるので苦労する。 – 実はC/C++言語は個人的に苦手 • ゲーム機向けにもFortran Compilerを! – Xbox360, PS3, PSVITA, Wii-U, 次世代機にも! – オーディオパイプラインが早いのなら、レン ダリングも早いはず。 • シェーダーもFortranで書けるようにしよう! Hiroyuki Masuno Page 37
  • 38.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ Fortran 公式の歌 • おおブレネリ あなたの言語はなに? • 私の言語はフォートランよ 数値計算が得意なのよ • ヤーーッフォー フォートランランラン • ヤッフォー フォートランランラン • ヤッフォー フォートランランラン • ヤッフォー フォートランランラン • ヤーーッフォー フォートランランラン • ヤッフォー フォートランランラン • ヤッフォー フォートランランラン • ヤッフォーフォー Hiroyuki Masuno Page 38
  • 39.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ NAX Music Player (2012) Hiroyuki Masuno Page 39
  • 40.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ NAX Music Player • Playstation VITA向け, 11月発売 • 世界初「音ゲー」が楽しめる音楽プレイヤー • 基本無料・有料DLCで機能拡張 – ビジュアライザープラグイン – DSP-FXプラグイン – ダンスゲーム/ダンサープラグイン – DJ, 通信カラオケ, 各種音ゲーもDLCで提供 Hiroyuki Masuno Page 40
  • 41.
    Arc System WorksCo., Ltd. . SIG Audio Audio Digital Signal Processing 1 : EQ 御静聴ありがとうございました! 質疑応答 お問い合わせは masuno@arcsy.co.jp Hiroyuki Masuno Page 41