harktutorial2010 japan...
TRANSCRIPT
ノ ド 作成ノードの作成P i 3Practice 3
HARK グループHARK グル プ
武田 龍
開発環境について開発環境
OS: Ubuntu 10.04, etc…
Editor: 任意(推奨 emacs, vi, eclipse)d to 任意(推奨 e acs, , ec pse)
コンパイラ: gcc (主に g++)
デバ ガ db および そのフロントエンド(任意) デバッガ: gdb および、そのフロントエンド(任意)
目次目次
前半 HARK ジ 説明前半:HARK モジュールの説明 FlowDesigner (FD) 用ソースファイルのフ FlowDesigner (FD) 用ソ スファイルのフォーマット概要を説明
後半:実際にモジュールを作成ソ スは途中までは作成済みで 穴埋め ソースは途中までは作成済みで、穴埋め・コンパイルを行う
HARK モジュール:ChannelSelector の説明
その前に:準備そ 前 準備
ターミナル・エディタの起動タ ミナル エディタの起動
アプリケーション → アクセサリ → 端末
ディレクトリの移動
% cd ~/practice3/hark-dev/% cd /practice3/hark-dev/
エディタの立ち上げ
% emacs <FILENAME> &
or メモ帳 like % gedit <FILENAME> &or メモ帳 like % gedit <FILENAME> &
Flowdesigner の立ち上げg% flowdesigner &
その他そ 他
注意点:注意点:
書き込み・実行属性付与
% sudo chmodchmod ++wxwx <FILENAME><FILENAME>
具体的には具体的には具体的には具体的には
% % sudosudo chmodchmod 777 777 ––R *R *
管理者権限実行
%% sudosudo make installmake install%% sudosudo make installmake install
ウィンドウ切り替え
Alt + TabAlt + Tab
ChannelSelector モジュールとはジM次元
M次元
Channel
Data1[0] Data1[1] …
Data2[0] Data2[1] …Data2[0] Data2[1] …
N次 K・
Selector
DataN[0] DataN[1] …DataN[0] DataN[1] …
次元
K次元
・・・
・・・
Data1 のデータ列はいらない
N*M Matrix K*M Matrix
[Data2 Data3 DataN]
デ デ
Data1 のデ タ列はいらない[Data2 Data3 … DataN]
チャンネル指定ベクトル(次元 K)
入力データ(行列形式)から不要なデータ(行)をのぞいて出力(行列形式)
必要なマイクチャンネルだけを取り出す時に利用
ChannelSelector のFD上の仕様仕様
機能
入力から必要なチャンネルのみを取り出して出力
仕様 仕様
入力: INPUT型 N*M次元 M t i <fl t>型: N*M次元 Matrix<float>
出力: OUTPUT型 * 次元 f型: K*M次元 Matrix<float>
パラメータ: SELECTOR
型: K次元 Vector<int>
必要なチャンネル番号(行番号). サイズが出力チャンネル数.
型は基本的に Flowdesigner内 で定義されたもの
モジュール作成:通常のプログラムと異なる点
ジ 実装 モジュールクラスの実装 (通常)BufferedNode クラスを継承
コンストラクタ・calculate メソッドの実装 Flowdesigner は calculate を呼び出し実行
入出力ノードのオブジェクト取得(addInput,addOutput, getInput メソッド),モジュールパラメータの取得
FD で定義された型(クラス)の利用(Matrixなど).Matrix.h, Vector.h, Map.h 等をインクルードする.
DECLARE_NODE の記述 Flowdesigner モジュールの入出力ノード・パラメータのg宣言
モジュールクラスのイメージジ クラ イ ジ
BufferedNode Node クラス(親クラス)
ChannelSelector クラス
! データの ! デ タのBufferedNode, Node クラス(親クラス)
addInput メソッド addOutput メソッド
tI t メソ ド Buffer 領域
! デ タの入口を作る
! データの出口を作る
inputgetInput メソッド
calculate メソッド outputs[count]
Buffer 領域
INPUT OUTPUT
デ
calculate メソッド(再定義)
input output! コア処理
! データを引っ張ってくる ! 格納場所から
出力するデータへポインタを張るp pア処理
SELECTOR
コンストラクタ
ポインタを張る
SELECTORt メソ ド
引数: params(= parameters)
コンストラクタ
! パラメータを取ってくる
ParameterSet クラス
SELECTORget メソッド
DECLARE NODE とは_ Flowdesigner 上で表示されるコンポーネント情報.以下を記述する以下を記述する. 入力ポート名, その型
出力ポート名 その型 出力ポート名, その型
モジュールのパラメータとその型, デフォルト値(任意)
性質 性質 プログラムのソースに記述する
モジュールのポート接続の際の簡易型チェックに利用 モジュ ルのポ ト接続の際の簡易型チェックに利用
ChannelSelector の処理の流れ処 流れ
• パラメータ: SELECTORの取得初期化
ラメ タ: SELECTORの取得• 入力ポート:INPUT のID取得(addInput)• 出力ポート:OUTPUT のID取得(addOutput)
初期化(コンストラクタで処理)
• 入力オブジェクト: input の取得(getInput)• 出力オブジェクト: output の生成(new)出力オブジェクト: output の生成(new)
コア処理• エラー等のチェック(説明は省略)
calculate メソッドに記述
• エラ 等のチェック(説明は省略)
• SELECTOR で指定されたチャンネルSELECTOR で指定されたチャンネルの値を input から output にコピー
output(i,*) = input(selector[i],*);
ソ スファイル Ch lS l t のソースファイル ChannelSelector.cc の説明
ChannelSelector.cc をエディタで開いてくださいてください
% cd ~/practice3/hark-fd
% emacs ChannelSelector.cc &
or % gedit ChannelSelector.cc &
ChannelSelector: Source 1 必要なヘッダファイルをインクルード
定 BufferedNode, Buffer, Vector, Matrix は Flowdeigner で定義されたクラス.該当クラスを使用する場合にインクルード.
Namespace FD を宣言 Namespace FD を宣言/** Copyright 2008 Kyoto University and Honda Motor Co.,Ltd.* All rights reserved* All rights reserved.* HARK was developed by researchers in Okuno Laboratory* at the Kyoto University and Honda Research Institute Japan Co.,Ltd.*/
#include <iostream>#include "BufferedNode.h"#include "Buffer.h"#include "Vector h"
ヘッダーファイルをインクルード#include Vector.h#include "Matrix.h"#include <math.h>#include <assert.h>
Namespace を宣言using namespace std;using namespace FD;
Namespace を宣言.FD は “F”low “D”esigner の名前空間.
ChannelSelector: Source 2 Flowdesigner ノード宣言(必須)
複数ある場合はその分だけ追加記述(ノ ド名以外) 複数ある場合はその分だけ追加記述(ノード名以外)class ChannelSelector;DECLARE_NODE(ChannelSelector);/*Node** @name ChannelSelector* @category HARK:MISC
ノード名とカテゴリ名の記述,コメント
* @description Select specified channels from multi-channel windowed PCM.** @input_name INPUT* @input_type Matrix<float>
入力ポート(名前+型)の記述,コメント
* @input_description Multi-channel windowed PCM.** @output_name OUTPUT* @output_type Matrix<float>
出力ポート(名前+型)の記述,コメント
* @output_description Multi-channel windowed PCM consisting of selected channel in the inputs.** @parameter_name SELECTOR* @parameter_type <Vector<int> >
パラメータ(名前+型)の記述,コメント
* @parameter_description Channel selection setting which is …*END*/
ChannelSelector: Source 3 クラス定義,コンストラクタ
B ff dN d を継承 ジ パラメ タの取得 BufferedNode を継承,モジュールパラメータの取得
class ChannelSelector : public BufferedNode {int inputID; BufferedNode の継承int inputID;int outputID;Vector<int> selector;int num_chan;int length;
入出力ポートのID(Key) とモジュールパラメータ用の変数
BufferedNode の継承
int length;
public:ChannelSelector(string nodeName, ParameterSet params)
: BufferedNode(nodeName params)
モジュールパラメータ用の変数
: BufferedNode(nodeName, params){
inputID = addInput("INPUT");outputID = addOutput("OUTPUT");
IDの取得.引数の文字列はDECLARE_NODEに
記述したものと同一にする.
selector = object_cast<Vector<int> >(parameters.get("SELECTOR"));
inOrder = true;
記述したものと同 にする.
モジ ルパラメ タ用のオブジ クトを取得 型キ スト
スペースが必要
inOrder = true;}
モジュールパラメータ用のオブジェクトを取得.型キャスト.parameters = params とほぼ同じ(親クラスのメンバ変数)
ChannelSelector: Source 4 calculate メソッドをオーバーライド
void calculate(int output_id, int count, Buffer &out) {RCPtr<Matrix<float> > input = getInput(inputID, count);
入力オブジ ク 取得スペ スが必要
RCPtr<Matrix<float> > output(new Matrix<float>(selector size()
getInput で入力オブジェクトの取得.Flowdesigner 用ポインタに代入.スペースが必要
スペースが必要
RCPtr<Matrix<float> > output(new Matrix<float>(selector.size(),input->ncols()));
(*(outputs[outputID].buffer))[count] = output;
出力オブジェクト(Matrix<float>)を生成 ポインタに代入
/* 中略 */for (int c = 0; c < selector.size(); c++) {
for (int j = 0; j < length; j++) {
出力オブジェクト(Matrix<float>)を生成.ポインタに代入.出力ポートのバッファに代入.
for (int j = 0; j < length; j++) {(*output)(c, j) = (*input)(selector[c], j);
}}
}ChannelSelector のコア処理.
必要な ネ だけ抜き出し ピ}};
必要なチャンネルだけ抜き出してコピー.
補足:DECLARE NODE補足 _
@input_type, @output_type, @parameter_type の種類@ p _ yp @ p _ yp @p _ yp単純型: int, float, bool
文字列: String
配列 Vector<T> Tは単純型,ソースに #include “Vector.h” が必要
V t d bl e.g Vector<double>
行列 Matrix<T> Tは単純型 ソースに #include “Matrix h” が必要 Tは単純型, ソースに #include “Matrix.h” が必要
e.g Matrix<float>
Map 型 Map<KEY,VALUE> p 型 p , #include “Map.h” が必要
e.g Map<String, int> KEYとVALUEのmapping
補足:実装 (skip)補足 実装 ( p) RCPtr
Flowdesigner 用オブジェクトのスマートポインタ Flowdesigner 用オブジェクトのスマートポインタ getInput/Output で取得したオブジェクトを扱う
calculate 引数の out calculate 引数の out 出力が1つしかない場合に使用 out[count] はoutputs[outputID].buffer))[count] と同義[ ] p [ p ] ))[ ]
calculate 引数の count 基本的に Flowdesigner上で calculate が実行された
数g
回数 inOrder = true; とすると,calculate が呼び出される毎に count が順にインクリメント(count=0 1 2 3 4 )さに count が順にインクリメント(count=0,1,2,3,4,…)されていく.
1ループ前(今 count ループ目とする)データが欲しい前(今 目 する)デ タ 欲場合は getInput(ID, count-1) とすればよい
補足:その他 (skip)補足 そ 他 ( p)
上 ジ 間 線が赤色Flowdesigner 上でモジュール間の線が赤色
入出力の型が不一致が原因
コンストラクタの parameters ってなに
Node クラスのメンバ変数 params で初期化される Node クラスのメンバ変数.params で初期化される.
DECLRARE_NODE, @parameter におけるデフォルト値の設定フォルト値の設定
@parameter_value の後に記述
例: @parameter_type float
@parameter_value -20.0
実装: ChannelSelector の改造
~ChannelSelector2 の作成~変更箇所を一通り説明その後実装
% emacs ChannelSelector2 cc &% emacs ChannelSelector2.cc &
or % gedit ChannelSelector2.cc &
ChannelSelector2 の実装実装
ゲインを変更する ChannelSelector: 仕様ゲインを変更する ChannelSelector: 仕様入力入力: 1入力: INPUT: Matrix<float>出力出力: 1出力: OUTPUT: Matrix<float>出力出力: 1出力: OUTPUT: Matrix<float>パラメータパラメータ: SELECTOR: Vector<int>ゲイン(GAIN): Vector<float> ここ変更ゲイン(GAIN): Vector<float>処理イメージ: OUTPUT[i] = INPUT[ SELECTOR[i] ]
* GAIN[i]
ここ変更
GAIN[i]
ファイル ChannelSelector2.cc モジュ ル群 HARK TEST に追加 モジュール群 HARK_TEST に追加
ノード名は ChannelSelector2 とする
ChannelSelector2 cc sample は完成済み ChannelSelector2.cc.sample は完成済み
とりあえずの実行りあ ず 実行
完成ChannelSelector2.cc.sample は完成したファイル.
できなかった場合に利用.
% cp ChannelSelector2 cc sample ChannelSelector2 cc% cp ChannelSelector2.cc.sample ChannelSelector2.cc
% ./configure --prefix=/usr
% make
% sudo make install
% flowdesigner net_tutorial3.n
ChannelSelector2 の処理の流れ処 流れ• パラメータ: SELECTORの取得•• パラメータ:パラメータ: GAINGAIN の取得の取得 初期化パラメ タ:パラメ タ: GAIN GAIN の取得の取得• 入力ポート:INPUT のID取得(addInput)• 出力ポート:OUTPUT のID取得(addOutput)
初期化(コンストラクタで処理)
• 入力オブジェクト: input の取得(getInput)• 出力オブジェクト: output の生成(new)出力オブジェクト: output の生成(new)
コア処理• エラー等のチェック(説明は省略)
calculateメソッドに記述
• エラ 等のチェック(説明は省略)
• SELECTOR で指定されたチャンネルの値をSELECTOR で指定されたチャンネルの値をinput から output にコピー
•• ただし,ただし,GAIN[GAIN[ii] ] の値を掛けるの値を掛けるoutput(output(ii *) = input(selector[*) = input(selector[ii] *) * GAIN[] *) * GAIN[ii];];
追加部分output(output(ii, ) = input(selector[, ) = input(selector[ii], ) GAIN[], ) GAIN[ii];];
Step1: DECLARE_NODEp _class ChannelSelector2;DECLARE_NODE(ChannelSelector2);/*Node** @name ChannelSelector2* @category HARK_DEV:misc* @description Select some channels from windowed PCM and change their gains.** @input_name INPUT* @input_type Matrix<float>* @input_description Multi-channel windowed PCM.** @output_name OUTPUT* @output_type Matrix<float>* @output_description Selected channel of windowed PCM.** @parameter_name SELECTOR* @parameter_type Vector<int>* @parameter_description Flags for channel selection** @parameter_name GAIN* @parameter_type Vector<float>* @ d i i G i f l d h l E l V fl 1 0 1 0 1 0
新たなパラメータ「GAIN」を追加
* @parameter_description Gains for selected channels. Example, <Vector<float> 1.0 1.0 1.0>.*END*/
Step2: コンストラクタp ラクタ
クラス定義,コンストラクタ
パラメータ GAIN を取得する処理を追加
class ChannelSelector2 : public BufferedNode {i t i tIDint inputID;int outputID;Vector<int> selector;Vector<float> gain;i t h
GAIN を格納する変数を宣言
int num_chan;int length;
public:Ch lS l t 2( t i d N P t S t )ChannelSelector2(string nodeName, ParameterSet params)
: BufferedNode(nodeName, params){
inputID = addInput("INPUT");t tID ddO t t("OUTPUT")outputID = addOutput("OUTPUT");
selector = object_cast<Vector<int> >(parameters.get("SELECTOR"));gain = object_cast<Vector<float> >(parameters.get("GAIN"));
inOrder = true;}
GAIN パラメータを取得.(すでに追加済み)
Step3: calculate メソッドp ソッ
calculate メソッドをオーバーライド
ゲインを掛ける処理を追加.
void calculate(int output_id, int count, Buffer &out) {RCPtr<Matrix<float> > input = getInput(inputID, count);RCPtr<Matrix<float> > output(new Matrix<float>(selector.size(),
input->ncols()));(*(outputs[outputID].buffer))[count] = output;
/* 中略 */
for (int c = 0; c < selector.size(); c++) {for (int j = 0; j < length; j++) {
(*output)(c, j) = (*input)(selector[c], j) * gain[c];}
}}
};出力を gain[c] 倍する.Selector は出力すべきチャネル番号が格納されている.
モジュールの確認ジ 確認
コンパイルとインストール
% ./configure --prefix=/usr/% make パスワード聞かれた場合は% sudosudo make install
モジュールの確認
パスワ ド聞かれた場合はharkuser とタイプ
モジュ ルの確認 HARK_TEST 以下に ChannelSelector2 が出現
実装してください
質問はTA等にお聞きください
ある程度時間が経ったら,モジ ルのテストネ トワ クモジュールのテストネットワークを作成しますを作成します
ChannelSelector2.cc.sample と
net tutorial3.n は完成済みファイルです.net_tutorial3.n は完成済みファイルです.
動作確認(実装は説明後)動作確認(実装 説明後)
作成するネットワークの概要 定数行列をChannelSelector2に入力 定数行列は Constant で定義 定数行列は Constant で定義
出力する行とそのゲインをパラメータで指定
出力される行列の値を確認 出力される行列の値を確認 Flowdesigner 上に標準出力
定数行列を入力Flowdesigner 上に出力Flowdesigner 上に出力
4131
2.11.1
4.13.1
期待される動作
2,3列目を抜粋3列目を2倍
6.15.1
4.13.1
2.33
期待される動作
Constant ノード
右クリック: General Constant を選択
Constant をダブルクリック
Type を object にして,Value を埋めるyp を j にして, を埋める
<Matrix <rows 3> <cols 2> <data 1.1 1.2 1.3 1.4 1.5 1.6> >
スペースが必要
変更箇所
ChannelSelector2 ノード
2つのパラメータを埋める
SELECTOR: type object: <Vector<int> 1 2>
GAIN: type object: <Vector<float> 1 0 2 0> GAIN: type object: <Vector<float> 1.0 2.0>
変更箇所変更箇所
実行実行
Flowdesigner の実行ボタンを押す
下のメッセージボックスに結果(Matrix 型)が出力下の ッセ ジボックスに結果( a 型)が出力
2, 3列目が抜き出され,3列目の要素が2倍になっている
動作確認してください
質問はTA等にお聞きください
早くできた方は Appendix を読み進めて,新たなジ 作成に取り組ん み くださモジュール作成に取り組んでみてください
net_practice3.n は完成済みファイルです.
その他、発展そ 他、発展
型の変更 型の変更
Map 型等の利用
複数の入力 出力ポ トの追加 複数の入力・出力ポートの追加
もうひとつモジュールを HARK_TEST に追加
Flowdesigner, HARK のソース・ノードの活用
今回作成した ChannelSelector2.cc はHARKモジュ今回作成した は ジール ChannelSelector の改造
ファイルやマイクからの入力サポート ファイルやマイクからの入力サポ ト
ノード同士の接続では型に注意
Appendixpp
新規 ジ 追 Appendix1: 新規モジュールの追加
Appendix2: ライブラリの利用ppe d ライブラリの利用
Appendix3: SaveWavePCM の作成
Appendix1: 新規モジュールの追加pp 新規 ジ 追加
Case 1: 新たな FD ライブ Case 2: FD ライブラリにラリの作成 新たなモジュールを追加
モジュールファイル “xxx.cc” を作成 モジュールファイル“xxx2.cc” を作成
C. “Makefile.am” を編集“libfdt t l SOURCES” の 後に
A. “Makefile.am” を作成
モジュ ルファイル xxx.cc を作成 モジュ ルファイル xxx2.cc を作成
“libfdtest_la_SOURCES” の 後に追加するファイル名を記述するのみ
B. “configure.in” を編集
% autoconf-2.61% automake-1 10
% automake-1.10% /configure% automake-1.10
% ./configure% make % sudo make install
% ./configure% make % sudo make install
% sudo make install
Appendix1:新規モジュールの追加1/3ppA. “Makefile.am” の作成
“t t” という名前の FD ライブラリを追加 “test” という名前の FD ライブラリを追加 初のモジュールファイルは “xxx.cc” とする
“Makefile.am” を作成.(元はサンプルをコピーすればよい) Makefile.am を作成.(元はサンプルをコピ すればよい) 赤字の部分赤字の部分を必要なら変更する
override includedir=${prefix}/lib/flowdesigner/toolbox/fdtest$override datadir=${prefix}/lib/flowdesigner/toolbox/fdtest
override libdir=${prefix}/lib/flowdesigner/toolbox/fdtest
lib LTLIBRARIES libfdt t llib_LTLIBRARIES = libfdtest.la
install-data-local:mkdir p $(datadir)mkdir -p $(datadir)(if [ -f $(libdir)/libfdtest ]; then cd $(libdir); rm -f fdtest.tlb; ln -s libfdtest
fdtest.tlb; else cd $(libdir); rm -f fdtest.tlb; ln -s libfdtest.so fdtest.tlb; fi)(cd $(top srcdir); info2def pl * cc * h > $(datadir)/fdtest def)(cd $(top_srcdir); info2def.pl .cc .h > $(datadir)/fdtest.def)
libfdtest_la_SOURCES = xxx.cc
Appendix1:新規モジュールの追加 2/3ppB. “configure.in” の編集
編集 “configure.in” の編集
赤字の部分を作成したファイル名にする
dnl Process this file with autoconf to produce a configure script. -*-m4-*-
AC_INIT(xxx.cc)
dnl Stolen from gtk+:dnl Stolen from gtk :
includedir=$includedir/flowdesignerdatadir=$datadir/flowdesigner$ glibdir=$datadir/lib...
Appendix1:新規モジュールの追加 3/3ppC. “Makefile.am” の編集
“M k fil ”を編集し “ 2 ”を追加記述 “Makefile.am”を編集し,“xxx2.cc”を追加記述 2つ目以降のモジュールファイルは “xxx.cc” の後に追加していくだけで良い加していくだけで良い
override includedir=${prefix}/lib/flowdesigner/toolbox/fdtestoverride datadir=${prefix}/lib/flowdesigner/toolbox/fdtestoverride datadir=${prefix}/lib/flowdesigner/toolbox/fdtestoverride libdir=${prefix}/lib/flowdesigner/toolbox/fdtest
lib LTLIBRARIES = libfdtest.lalib_LTLIBRARIES libfdtest.la
install-data-local:mkdir -p $(datadir)p $( )(if [ -f $(libdir)/libfdtest ]; then cd $(libdir); rm -f fdtest.tlb; ln -s libfdtest
fdtest.tlb; else cd $(libdir); rm -f fdtest.tlb; ln -s libfdtest.so fdtest.tlb; fi)(cd $(top_srcdir); info2def.pl *.cc *.h > $(datadir)/fdtest.def)
libfdtest_la_SOURCES = xxx.cc xxx2.cc
Appendix2: ライブラリの利用pp ライ ラリ 利用
外部ライブラリを利用したい場合 外部ライブラリを利用したい場合
例: 音ファイルを扱うライブラリ <sndfile.h> を利用
-lsndfile オプションを付ける必要がある
Makefile.am の libfdtest_la_LIBADD にオプションを追 ば追加すれば良い
.libfd l SOURCES S W PCMlibfdtest_la_SOURCES = SaveWavePCM.cc
libfdtest_la_LDFLAGS = -release $(LT_RELEASE) \'fl d i fi lib fi libfl ''flowdesigner-config --libs config libflow'
INCLUDES = `flowdesigner-config --cflags libflow`
libfdtest_la_LIBADD = -lsndfile
Appendix3: SaveWavePCM の作成pp 作成
な 保存 Raw ではなく Wave ファイルで保存したい
SaveRawPCM はヘッダなしファイル
WAV 形式は チャンネル数,サンプリング周波数,データ長(バイト)などの情報をヘッダに格納
SaveWavePCM の改造
機能: ヘッダなし 16bit PCM 波形を出力 機能: ヘッダなし,16bit PCM 波形を出力
ヘッダ書きこみを行えば WAV 形式に
ダ情報書き込み 自作 ライブラリの利用 ヘッダ情報書き込み: 自作 or ライブラリの利用
<sndfile.h> のインクルード,-lsndfile のリンク
Appendix3: SaveWavePCM の作成: pp 作成SaveRawPCM の概説
ド 説 ソースコードの説明
動的型判別: 入力型に Map<int,ObjectRef>, p jMatrix<float> の両方を扱うことが可能
バイト/型変換
変更すべき点
ofstream クラスに相当する wav 形式を扱うクラスを ofstream クラスに相当する wav 形式を扱うクラスを作れば楽
sndfile ライブラリを使う場合: sndfile h をインクルー sndfile ライブラリを使う場合: sndfile.h をインクルー
ドすると,ヘッダ書きこみ関数や波形書きこみ関数を利用可能利用可能
Appendix3: SaveWavePCM の作成: pp 作成SaveRawPCM の概説
void calculate(int output_id, int count, Buffer &out){
ObjectRef in = getInput(inputID, count);if ( id(*i ) id(M i Obj R f )) {if (typeid(*in) == typeid(Map<int, ObjectRef>)) {
RCPtr<Map<int, ObjectRef> > input = in;Map<int, ObjectRef>::iterator it = input->begin(); Typeid で型が
同じがどうか判定typeid で型が
同じがどうか判定for (; it != input->end(); ++it) {
Vector<float>& x = object_cast<Vector<float> >(it->second);<中略>}
同じがどうか判定同じがどうか判定
}}else if (typeid(*in) == typeid(Matrix<float>)) {
Matrix<float>& x = object cast<Matrix<float> >(in);Matrix float & x object_cast Matrix float (in);<中略>
}else {中略<中略>
}}
Appendix3: SaveWavePCM の作成: pp 作成SaveRawPCM の概説
for (; it != input->end(); ++it) {Vector<float>& x = object_cast<Vector<float> >(it->second);
h d f fshared_ptr<ofstream> fout;if (streams.find(it->first) == streams.end()) {
ostringstream name_str;name str << basename << it->first << ".sw"; convertBitFormat はname_str << basename << it >first << .sw ;fout.reset(new ofstream(name_str.str().c_str()));streams[it->first] = fout;
tBitF t( b f 0 i ())
float から2 byte or 3byte 整数に型変換する関数.
配列の何処からどこまでを変換するかが異なるconvertBitFormat(x, buf, 0, x.size());
}else {
convertBitFormat(x, buf, x.size() - advance, x.size());
変換するかが異なる.
convertBitFormat(x, buf, x.size() advance, x.size());fout = streams[it->first];
}fout->write((char*)&buf[0], buf.size());f t fl h()
オーバラップ処理をしている場合,新規入力部分だけ
fout->flush();}
変換対象になる.
Appendix3: SaveWavePCM の作成: pp 作成ライブラリ libsndfile interface基 数を ば良 基本的に以下の関数を用いれば良い.
リファレンスはローカルリファレンスは カル~/practice3/libsndfile.html にあります.
SNDFILE* sf open (const char *path int mode SNDFILE sf_open (const char path, int mode, SF_INFO *sfinfo) ;
int sf close (SNDFILE *sndfile) ; int sf_close (SNDFILE sndfile) ;
sf_count_t sf_write_short (SNDFILE *sndfile, short *ptr sf count t items) ;ptr, sf_count_t items) ;
int sf_command (SNDFILE *sndfile, int cmd, void *data int datasize) ;data, int datasize) ;
Appendix3: SaveWavePCM の作成: pp 作成SaveWavePCM のサンプル
プ パ サンプルのコンパイル
試作品は SaveWavePCM.cc.samplep1) リネーム: mv SaveWavePCM.cc.sample SaveWavePCM.cc
2) Makefile.am の libfdtest_la_SOURCES に SaveWavePCM を追加加
3) Makefile.am の libfdtest_la_LIBADD に –lsndfile を追加
4) automake configure4) automake configure
net_appendix.n がネットワークファイル
wavesufer sep 0 wav 等で波形を確認可能 wavesufer sep_0.wav 等で波形を確認可能
SaveRawPCM を使った場合と比較
その他:デバッグの方法 (skip)そ 他 デ ッグ 方法 ( p) -g –ggdb オプションつきでコンパイル(Makefile.amに
AM CXXFLAGS= g ggdb を追加)AM_CXXFLAGS= -g –ggdb を追加) gdb /path/flowdesigner ブレークポインタ設定
b VAdd::calculate (関数名で設定) b vadd.c:62 (行番号で設定) ブレークポインタ確認 ブレ クポインタ確認
i b (info breakpoints) 条件設定 #はブレークポインタの番号
Condition # i > 1 (iが1より大きい時に#番のブレークポインタが有効になる) Condition # i > 1 (iが1より大きい時に#番のブレ クポインタが有効になる)
実行 r (run)
( ti ) c (continue)
その他 適宜 printf デバックp
まとめま
新規 ド 新規ノード開発
DECLARE_NODE: /*NODE … END*/
コンストラクタ,calculate メソッド
Makefile.am の編集、コンパイル Makefile.am の編集、コンパイル
ChannelSelector の実装
モジ ルパラメ タの追加 モジュールパラメータの追加
ネットワーク Constant でのパラメータ設定