the beginners guide of real-time audio processing (part 1:equalizer)

41
Arc System Works Co., Ltd. SIG Audio Audio Digital Signal Processing 1 : EQ Page 1 . Hiroyuki Masuno リアルタイムオーディオ信号処理入門 -1:イコライザーをつくってみる- アークシステムワークス株式会社 技術開発部長(CTO) 増野 宏之 [email protected]

Upload: hiroyuki-masuno

Post on 27-Dec-2014

5.464 views

Category:

Technology


0 download

DESCRIPTION

9/28に開催された、SIG-Audio準備会#2での講演資料(スライド)です。 イコライザーの作り方と、フォートラン教の布教用資料(笑)です。

TRANSCRIPT

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 1

.

Hiroyuki Masuno

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

アークシステムワークス株式会社

技術開発部長(CTO)

増野 宏之

[email protected]

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 2

.

Hiroyuki Masuno

自己紹介(その1)

• 増野 宏之 (Hiroyuki Masuno)

– アークシステムワークス株式会社所属

– 技術開発部長(CTO)

– 1964年10月8日生まれ, そろそろ48歳(年男)

– ゲーム業界26年目

• プログラマー/オーディオエンジン開発

• 海外渉外各種交渉業務

• 法務部部長+宴会担当

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 3

.

Hiroyuki Masuno

自己紹介(その2)• コンタクト情報

– 電子メール : • [email protected] (会社)

[email protected] (個人)

– Facebook : http://www.facebook.com/hiroyuki.masuno.7

– Twitter : @HiroyukiMasuno

– LinkedIn : Hiroyuki Masuno

– 3DS/PSN等すべて実名登録

– ノーガード戦法

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 4

.

Hiroyuki Masuno

講演上の注意点• A4-DSP Engine Xbox360版の実装をベースに解説– XAPO等の書式はWindows版とほぼ同じ

– 内部オーディオバッファ構造は以下のとおり。• サンプリング周波数は48KHz

• 波形形式はIEEE754 浮動小数点(-1.0f~1.0f)形式

• 1オーディオフレーム = 1パケット = 256サンプル

• 更新間隔= 256/48000 = 約5.3ミリ秒

• オーディオフレームレート = 187.5Hz

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 5

.

Hiroyuki Masuno

セッションの流れ1. オーディオ信号処理とは何か、その重要性

2. イコライザーの基本理論(フィルター)

3. XAudio2上での設計と実装

4. EQ実演(NAX Music Player(PSVITA))

5. ゲーム業界震撼のカミングアウト(笑)

6. 質疑応答(時間があれば)

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 6

.

Hiroyuki Masuno

昔話• 音が専用ハードで再生されていたのは昔。

– ファミコン(矩形波x2・三角波x1・ノイズx1)

– 0x4000-0x400F番地のレジスタに値を書き込

んで発音させていた。

– CPU速度: 6502Aの1.79MHz

• オーディオ機能はCPU直結

• 6502A+DAC=リコーRP2A03

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 7

.

Hiroyuki Masuno

オーディオ信号処理の重要性(1)

• 計算資源の爆発的な増加– ファミコン(1983年)(俺=19歳)

• MOS Technology 6502A, 1.79MHz

• 8ビット

– 最新鋭のPC (2012年)(俺=48歳)• Intel Core-i7 3770K

• 最大3.9GHz, 4コア, 8ハードウェアスレッド

• 64ビット

• 単純なクロック周波数比較でも2,000倍

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 8

.

Hiroyuki Masuno

オーディオ信号処理の重要性(2)

• メインCPUやDSPがオーディオ処理を担当する時

代になった。

– オーディオパイプラインの誕生

– 今では、比較的重い処理のひとつ。

– 効率的なオーディオパイプライン設計のために、リアルタイムオーディオ信号処理技術を学ぶ必要性が生じた。

• 日本語で書かれた参考書はあまり多くない。

• ゲームの場合、重要となる高速化に関する書籍はほぼゼロという悲しい状態。高速化→表現力の向上

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 9

.

Hiroyuki Masuno

参考書の紹介• C言語ではじめる音のプログラミング

-サウンドエフェクトの信号処理-

– 著者:青木直史

– 出版社: オーム社 (2008/12)

– ISBN-10: 4274206505

– ISBN-13: 978-4274206504

– 2,730円

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 10

.

Hiroyuki Masuno

オーディオ信号処理とは• 入力バッファに蓄積されたオーディオ信号波形になんらかの数値演算を行い出力バッファに書き出す処理のこと。たとえば・・・– 信号を一定時間(0.2~1秒程度)遅らせて重ねる

• デジタルディレイ

– 信号の遅延時間を小刻みに変化させる• コーラス

– 信号を極端に増幅し、波形を飽和させる• ディストーション

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 11

.

Hiroyuki Masuno

オーディオ信号処理とは(2)

• 実は、入力バッファも出力バッファも必須ではないし、必ずしも波形を加工する必要もない。– 入力バッファがない例

• 内部処理で波形を作り出す– WG (Wave Generator)

– 入力波形を加工せずに出力波形にコピーする• 最大波高値を検出する

– VUメーター

• もっとも確からしいBPM値を検出する– リアルタイムBPM解析(A4-BPM/A4-VMA)

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 12

.

Hiroyuki Masuno

今回の講演における信号処理• 第1回目の今回に関しては、入力波形になんらかの

演算をして出力波形に書き出す、一般的なエフェクターに関する説明を行う。

• WindowsにおけるXAudio2では、XAPOとして

規定されている。– XAPO: XAudio Audio Processing Object

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

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 13

.

Hiroyuki Masuno

一番簡単な処理の例• アッテネーター(減衰器)(Attenuator)

– 入力された波形を半分の音量にして出力する

– [半分の音量]→[外部から変えることができるように書き直す]→[ボリューム調整APO]の出来上がり

出力波形

fOut

→演算処理

fOut=fIn*0.5f

→入力波形

fIn

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 14

.

Hiroyuki Masuno

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);

};

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 15

.

Hiroyuki Masuno

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);

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 16

.

Hiroyuki Masuno

シグナルプロセッサーの処理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;

}

}

}

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 17

.

Hiroyuki Masuno

実際の処理の部分

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;

}

}

}

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 18

.

Hiroyuki Masuno

イコライザーを作る

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 19

.

Hiroyuki Masuno

イコライザーとは何か• 波形信号の周波数特性を変更する音響機器

• エフェクターの一種(XAPOで設計可能)

• グラフィックイコライザー– 中央周波数一定

– 調整できる帯域の幅も一定

– ゲインのみ変更できる

– 多数(5~31程度)の周波数領域(バンド)が調整できる。

• パラメトリックイコライザー– 上記の3要素(中央周波数・帯域幅・ゲイン)すべてを変更できる

– 調整できるバンドの数は少ない(3~5程度)

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 20

.

Hiroyuki Masuno

イコライザー設計方法(1)

• Linear Phase法– FFT(フーリエ変換)を使う

• 入力波形をFFTして周波数領域に直交変換

• 各周波数ビン利得を変更

• iFFTして時間領域に逆変換

– 特徴• 位相情報は保持される

• iFFT変換後、窓のつなぎ目で、波形を綺麗に繋ごうとすると、最低でも1,024サンプルFFT + 75%オーバーラップ程度の演算が必要となるため重い。

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 21

.

Hiroyuki Masuno

イコライザー設計方法(2)

• 双2次フィルター法(Biquad Filter)

– IIR(無限インパルス応答)フィルターを使う

• RBJ Audio-EQ-Cookbookあまりにも有名

• http://www.musicdsp.org/files/Audio-EQ-

Cookbook.txt

– 特徴• 時間軸側の計算式があるのでFFT不要で高速

• 位相情報は保持されない

• バンドパスフィルターの性能はLinear法に劣る

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 22

.

Hiroyuki Masuno

今回設計するイコライザー• 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刻み

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 23

.

Hiroyuki Masuno

処理フロー

出力側に書き出し

LF,MF1-MF8,HFの順に10段のフィルターを通す

バンド増幅値が0.0dBの場合は計算しない

入力側から読み込み

事前パラメーター計算

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 24

.

Hiroyuki Masuno

高速化のための定数化(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 : ゲイン調整幅(一定)

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 25

.

Hiroyuki Masuno

高速化のための定数化(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

};

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 26

.

Hiroyuki Masuno

高速化のための定数化(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)

};

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 27

.

Hiroyuki Masuno

高速化のための定数化(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

};

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 28

.

Hiroyuki Masuno

事前パラメータ計算(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)

}

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 29

.

Hiroyuki Masuno

フィルター処理 (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];

}

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 30

.

Hiroyuki Masuno

フィルター処理 (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];

}

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 31

.

Hiroyuki Masuno

NAX Music Player

Paragraphic EQ

デモ実演

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 32

.

Hiroyuki Masuno

最高速なイコライザー(一部)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

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 33

.

Hiroyuki Masuno

FORTRANL E G A C Y

圧倒的な物量の大域変数・1万行を超えるupdate関数

唯一にして絶対のGameClass・新世代のプログラムを体感せよ!

2012年11月絶賛公開!!

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 34

.

Hiroyuki Masuno

A4-FXAPO by FORTRAN77

• FXAPOのFは「FORTRAN」のF。

• Windows版のオーディオパイプラインは、すべてFORTRAN77で記述されている。

• Visual C++とVisual FortranのMixed

Languageプログラミング

• 自動ベクトル化と自動並列化で全プラットフォーム中で最速。

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 35

.

Hiroyuki Masuno

FORTRANで組む利点• 現時点でもっとも高速。平均で6倍以上。

– FFTならば最大で3桁違うことも珍しくない。– 言語仕様上、メモリコヒーレンシが高い

• ポインターがない、変数はすべてコンパイル時確定。

– C言語でも高速に記述することはもちろん可能、でもそのために、覚えることが多すぎるのは、本末転倒。

• 信号処理マニアなのであって、プログラム言語マニアではない。

• コンパイラーが自動ベクトル化+並列化する。– IntelのマルチコアCPUなら現時点では最速。– マルチコアCPUならば、ハードウェアスレッド数内で、チャンネル数が増えても、ほとんど実行速度が変わらない。

• 膨大な数値計算のライブラリーがある。– Intel Math Kernel Library (IMKL/MKL)

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 36

.

Hiroyuki Masuno

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さんが販売

– ゲーム業界で持っているのはひょっとしたら私だけ??

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 37

.

Hiroyuki Masuno

Fortran Forever

• Windows版をゲーム機版に移植する際には、非常に遅くなるので苦労する。– 実はC/C++言語は個人的に苦手

• ゲーム機向けにもFortran Compilerを!

– Xbox360, PS3, PSVITA, Wii-U, 次世代機にも!

– オーディオパイプラインが早いのなら、レンダリングも早いはず。

• シェーダーもFortranで書けるようにしよう!

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 38

.

Hiroyuki Masuno

Fortran 公式の歌• おおブレネリ あなたの言語はなに?

• 私の言語はフォートランよ 数値計算が得意なのよ

• ヤーーッフォー フォートランランラン

• ヤッフォー フォートランランラン

• ヤッフォー フォートランランラン

• ヤッフォー フォートランランラン

• ヤーーッフォー フォートランランラン

• ヤッフォー フォートランランラン

• ヤッフォー フォートランランラン

• ヤッフォーフォー

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 39

.

Hiroyuki Masuno

NAX Music Player (2012)

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 40

.

Hiroyuki Masuno

NAX Music Player

• Playstation VITA向け, 11月発売

• 世界初「音ゲー」が楽しめる音楽プレイヤー

• 基本無料・有料DLCで機能拡張

– ビジュアライザープラグイン

– DSP-FXプラグイン

– ダンスゲーム/ダンサープラグイン

– DJ, 通信カラオケ, 各種音ゲーもDLCで提供

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

Arc System Works Co., Ltd.SIG Audio

Audio Digital Signal Processing 1 : EQ

Page 41

.

Hiroyuki Masuno

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

質疑応答

お問い合わせは[email protected]