☆ WAVEFLT2 とは

「WAVEFLT2」は Win32,Linux 用のディジタル音声フィルタです。

もしバグ等を発見したら是非お知らせ下さい。

対応フォーマット

PCM 形式 WAVE ファイル
内部演算精度 : 64bit double
サンプリングレート : 任意
ビット : 8, 16, 24, 32(long, IEEE float), 64(IEEE float)
データサイズ : 最大 8388608 Tbytes(*)

(*) wave フォーマットとして WAVEFLT2 独自拡張フォーマットを使用。サイズが 4G 以上のファイルは WAVEFLT2 以外のソフトでは 4G として認識されます。 -noextrahdrも参照してください。

(注意)

WAVEFLT2 では次のオプションが旧 WAVEFLT と互換性がないので 旧 WAVEFLT から移行する場合は設定を変更してください。またいくつかのオプションの 動作が変更されているので注意点 の方も参照してください。

(廃止したオプション)
-headcut, -headcut2, -nv, -reg, -nosnd,-nosnd2,-adptrain,-adpln,-adplate
-med, -medln, -normal_avg_limit, normal_rms_limit, -dyn, -normal_db
-lpf, -hpf, -bpf, -bsf, -db, -eqln, -eqout, -nsat, -f, -nosignal
-firout, -iirout, -splitkbr, -eq, -eqlog

(仕様を変更したオプション)
-addsin, -mixfile, -nosound, -nosound_detail, -nosound_detail2, -normal, -headofs
-buf, -pipebuf, -adp , -autoofs, -mix, 

(-nosound などのリニア値 -> dB 値変更の目安)

1024 = -30 dB
512 = -36 dB
256 = -42 dB
128 = -48 dB
64 = -54 dB
32 = -60 dB
16 = -66 dB
8 = -72 dB
4 = -78 dB
2 = -84 dB
1 = -90 dB
0 = -96 dB 以下



☆ 動作環境

Win32, Linux(x86)

Linux 版のバイナリはソースから作成して下さい。ただしソースの改造が必要だと思います。

推奨環境:

セレロン 1G 以上、メモリ 256M 以上、HDD 10G 以上、Windows 2000/XP


☆ チュートリアル

はじめにコマンドプロンプトを起動して下さい。 win9x なら doskey コマンドと併用すると便利です。

waveflt2 | more と打つと書式が表示されます。

バンドパスフィルタを使って、1000-15000 hz の範囲の音を取り出すには次のように打ちます。

waveflt2 -fir_bpf 1000 15000 input.wav out.wav

設定は設定ファイルに書いておくと便利かもしれません。例えば アーカイブに付属している設定ファイルのサンプル wfltsample.txt には

# WAVEFLT サンプル
# 行の先頭に「#」を付けるとその行はコメントになります

-fir_bpf 1000 15000

# ここまで

と書かれていますが、コマンドラインで

waveflt2 -cfg "wfltsample.txt" input.wav out.wav

と打つと上のコマンドを実行したのと同じ意味になります。 その他、詳しくはオプション一覧を参考にしてください。


☆ 注意点(重要)

(1) 入力に stdin を指定したとき、及び -split-nosoundなど 途中で出力ファイルを切り替える処理を行う場合には、 巻き戻しや再生時間の取得が出来ないために ノーマライズ処理(-normalなど)、 フェードアウト処理( -fout) を実行できません。

したがって-nosoundなどとノーマライズを 共用したい場合は一度ハードディスクにデータを出力してから -exec コマンドで waveflt2 を別にもう一つ起動して行ってください。 例えば 無音判定分割 + ノーマライズ + OGG 化 を参考にしてみてください。

(2) 出力に stdout, waveout を指定した場合は -split-nosoundなど の途中で出力ファイルを切り替える処理を実行できません。 ただし -pipeout を指定している場合は可能です。

(3) 入力に stdin を指定したときは ファイルの巻き戻しが出来ないため -adp_detailオプションを指定した場合に 初期学習時間が 0 にセットされます。

(4) -endless 指定時は再生時間の取得が出来ないために フェードアウト処理(-fout) を実行できません。

(5) 4G 以上のファイルを出力する場合、 wave フォーマットとして WAVEFLT2 独自拡張フォーマットを使用します。その際、 サイズが 4G 以上のファイルは WAVEFLT2 以外のソフトでは 4G として認識されます。 -noextrahdrも参照してください。

(6) 入力ファイルと出力ファイルが同名の場合は入力ファイルを *.bkp に変更してから実行します。

(7) ノーマライズ処理は 一度全てのデータをフィルタに通してピークや平均値などを取得してから 入力ファイルを巻き戻して実行されます。従って同じフィルタ処理が 2 回 実行されることになるので処理時間を短縮したい場合は一度フィルタ処理した データをハードディスクに中間ファイルとして出力してから再度ノーマライズ処理のみを実行してください。 なお、その際に -bit* オプションで中間ファイルの bit 数を 24 以上に設定しておけば量子化雑音の影響は最小限に 抑えられます。


☆ (応用例) 無音分割 + ノーマライズ + OGG 出力

入力音声の無音部を判定してファイルを分割し、 さらにノーマライズして OGG にエンコードする例です。

仕様上、-nosound オプションと -normal オプションは 同時に使用できない ので一旦 -nosound で分割した中間 WAVE ファイルを 作成して -exec オプションで 2 段目の WAVEFLT2 を起動して改めてノーマライズ + OGG 化します。

-exec オプションで起動した 2 段目の WAVEFLT2 では中間ファイルを作成せずに 直接 OGG エンコードを行います。

(1) oggenc.exe を waveflt2.exe と同じフォルダに置く
(2) waveflt2.exe と同じフォルダに下の config.txt 、config2.txt 
という 2 つの設定ファイルを作成する。

--------

## config.txt ここから
## 1 段目の WAVEFLT2 の設定ファイル
## 分割を行って 2 段目の WAVEFLT2 を起動

# アナログ入力などて直流成分がずれている場合
#-autoofs 300

-nosound 500 -60
-exec "waveflt2 -cfg %^config2.txt%^ %^%a%^ %^%a%^"
## config.txt ここまで

--------

## config2.txt ここから
## config.txt の -exec オプションで起動する 2 段
## 目の WAVEFLT2 の設定ファイル
## ノーマライズして OGG エンコード して中間ファイル削除
-silent
-normal -.1
-bit32float
-pipeout "oggenc - -o %^%a%^"
-del
## config2.txt  ここまで


--------

(3) コマンドプロンプトで

waveflt2 -cfg "config.txt" input.wav output.ogg

と打つと無音部で分割されて
output000.ogg , output001.ogg …
というファイルが作成される。

うまく分割されない場合は config.txt の -nosound の数字を 調整してみてください。

config2.txt の -del オプションをコメントアウトすると 中間ファイルを削除しません。中間ファイルは上の例の場合は output000.bkp , output001.bkp … というファイルになります。 この中間ファイルの拡張子を .wav に変更すると(ノーマライズしていない) WAVE 形式ファイルになります。

また OGG 形式にエンコードしない場合は config2.txt の -pipeout オプション をコメントアウトして

waveflt2 -cfg "config.txt" input.wav output.wav

と出力ファイルの拡張子を .wav に変更して実行してください。

(詳細説明)

1 段目の WAVEFLT2 で -nosound オプションで無音分割されて output000.ogg , output001.ogg …という「WAVE 形式の」 中間ファイルが作成されます。ここで分割されて ファイルが切り替わる度に -exec オプションによって 2 段目の WAVEFLT2 が起動されるのですが、 %^%a%^ %^%a%^ の様に入力と出力ファイル名を同じに指定しているので 中間ファイルが output000.bkp , output001.bkp …とリネームされます。 後は ノーマライズ + OGG エンコードして -del オプションで中間ファイルが 削除されます。


☆ データを処理する順番

入力
→ double 型に変換
→ DC オフセット手動補正(-ofs)
→ -1 〜 1 の範囲に正規化
→ DC オフセット自動補正(-autoofs)
→ FIR フィルタ(-nosound_fir)
→ 先頭削除、無音分割(-nosound*)
→ 時間、サイズ分割(-split*)
→ 左右バランス調整(-balance)
→ ファイルミキシング(-mixfile)
→ 左右チャンネルミキシング(-mix)
→ サイン波合成(-addsin)
→ 適応フィルタ(-adp)
→ FIR フィルタ(-fir_*)
→ FIR イコライザ(-fir_eq*)
→ IIR フィルタ(-iir_*)
→ (ディ)エンファシス(-demp)
→ シェルビング EQ low(-sveq_l)
→ シェルビング EQ high(-sveq_h)
→ MDCT(-mdct)
→ 位相逆転(-phinv)
→ コンプレッサ(-comp)
→ ボリューム調整(-vol)
→ フェードイン、アウト(-fin,-fout)
→ ノーマライズ + コンプレッサ(リミッタ) (-normal*)
→ リサンプリング(-rsmp)
→ 出力ビット数に従ってレベルを調整(-bit*)
→ ディザ(-dither)
→ 量子化
→ 出力


☆ 置換規則一覧 & 置換例

ロック音の場合は PIPE のコマンド、録音前後コマンド、ファイル名で、WAVEFLT2 の場合は 出力ファイル名、-pipeout、-exec オプション等で指定できる置換文字の一覧です。

文字列置換規則表 (ロック音、WAVEFLT2 共通)
%d出力ファイルのドライブ (例) c:
%p出力ファイルのパス (例) \bin\lockon\
%f出力ファイルのファイル名(拡張子除く) (例) out
%e出力ファイルの拡張子 (例) .wav
%aパスを含むファイル名(%a = %d%p%f%e) (例) c:\bin\lockon\out.wav
%%%
%1%1 (waveflt2 の場合は -udef1) で指定したユーザー定義文字列
%2%2 (waveflt2 の場合は -udef2)で指定したユーザー定義文字列
%3%3 (waveflt2 の場合は -udef3)で指定したユーザー定義文字列
%Y年 (下二桁 例えば 2002 年の場合は 02 に置換)
%M
%D
%H
%N
%S
%W曜日

(注意) %Y,%M,…%W などの時刻はロック音の場合は録音を開始した時間、 waveflt2 の場合は waveflt2 が起動した時間、または -split や -nosound* などで 分割が行われた時間がセットされます。

文字列置換規則表 (ロック音 のみ)
%Lロック音のウィンドウハンドル
scmpx 〜 stdin "%a" fstdin -dos -hide -command "scmpx 〜 dummy.dat %^%a%^"
wm8eutil -input stdin -output "%a" 〜 fstdin -v -dos -command "wm8eutil -input dummy.dat -output %^%a%^ 〜"

文字列置換規則表 (WAVEFLT2 のみ)
%^"
scmpx 〜 stdin %^%a%^ fstdin -dos -hide -command "scmpx 〜 dummy.dat %^%a%^"
wm8eutil -input stdin -output %^%a%^ 〜 fstdin -v -dos -command "wm8eutil -input dummy.dat -output %^%a%^ 〜"

(ロック音での置換例1) 

ファイル名が c:\tmp\out.wav の時

%d           -> c:
%p           -> \tmp\
%f           -> out
%e           -> .wav
"%a"         -> "c:\tmp\out.wav"
"%d%p%f%e"   -> "c:\tmp\out.wav"
"%d%p%f.ogg" -> "c:\tmp\out.ogg"
"e:%pTest%e" -> "e:\tmp\Test.wav"

(ロック音での置換例2) 

現在時刻が 2001/10/4  16:32:10 の時

"c:\tmp\out%Y-%M-%D-%H-%N-%S.wav"   -> "c:\tmp\out01-10-04-16-32-10.wav"

(WAVEFLT2の例1) 現在時刻が 4:10 の時、waveflt2 input.wav "%H-%N.wav" を実行すると 4-10.wav が出力される。

(WAVEFLT2の例2) waveflt2 -pipeout "oggenc - -o %^%a%^" input.wav out.ogg を実行すると out.ogg が出力される。

(WAVEFLT2の例3) waveflt2 -udef1 "def1" -pipeout "oggenc - -o %^%d%p%1%e%^" input.wav out.ogg を実行するとdef1.ogg が出力される。

(WAVEFLT2の例4) cat input.wav | waveflt2 -split 60 -pipeout "oggenc - -o %^%d%pout-%H-%N-%S%e%^" stdin out.ogg を実行すると 分割時間がファイル名になる(リアルタイム入力などで使用する)。


☆ バグレポート等連絡先

作者 : 東海林 智也
MAIL :
tokai@main.eng.hokudai.ac.jp
URL1 : http://hp.vector.co.jp/authors/VA014492/
URL2 : http://isp5.main.eng.hokudai.ac.jp/~tokai/


☆ COPYRIGHT, LICENSE

Copyright (c) 1999-2002 Tomoya Tokairin

waveflt2.exe : GPL

wflt2.dll :
wflt2dll.h, wflt2.lib, wflt2.dll のみを使用して dynamic link するなら LGPL2.1
static link するなら GPL


☆ 更新履歴
2002/6/2  WAVEFLT2 Ver 1.00

もうちょい低音が欲しい気がしたので EQ の利得の範囲を +-24 dB まで上げた
デフォルトのパラメータ値を少しいじった
EWC ver 1.52 付属
最終テストしてリリース版にした


2002/6/1  WAVEFLT2 Ver 1.00 rc-final2

入力サンプリング数が 96k だと出力サンプリング数が変になるバグを修正
32bit-float の時はクリップ時の飽和処理をしないようにした
EWC ver 1.51 付属


2002/5/31  WAVEFLT2 Ver 1.00 rc-final

各オプションのテスト完了
マニュアル校正
ソース整理
wflt2.dll の使用サンプルの修正
いろんなフォーマットでテスト
EWC との連携テスト & 調整
EWC ver 1.5 付属


2002/5/30  WAVEFLT2 Ver 1.00 rc4

安物ヘッドホンのショボイ音じゃまともなパラメータ取りが出来ないので
オーテクの ATH-M40fs を買って来た
-exec の文字置換がうまくいってなかったバグを修正
-nosound_detail2 と -split を組み合わせると最後のバッファが出力
されないバグを修正
-cutouthead オプション廃止して -shift オプション追加
将来的な事を考えてFIR フィルタ部をマルチチャンネル化
FIR フィルタと FIR-EQ を同時に使えるようにした
-nosound_fir オプション追加
-normal_rms_comp, -normal_avg_comp オプション廃止
-normal_comp オプション追加
将来的な事を考えてIIR フィルタ部をマルチチャンネル化
IIR フィルタと ディエンファシスを同時に使えるようにした
-iir_bpf の次数を 4 次に上げた
-emp オプション追加
-sveq_l, -sveq_h オプション追加
(とりあえず)仕様確定


2002/5/26  WAVEFLT2 Ver 1.00 rc3

内蔵音源のショボイ音じゃまともなパラメータ取りが出来ないのでバルクの
アコエジ PSC706 を買って来た
-fir_eq3, -fir_eq3_detail オプション追加
-outbit オプション廃止
-bit8, -bit16, -bit24, -bit32long, -bit32float, -bit64 オプション追加
-bit32float と waveout を組み合わせると落ちるバグを修正
waveflt2 | more とするとバージョンが表示されないバグを修正
-comp_rms オプション廃止して -comp に統一



2002/5/25  WAVEFLT2 Ver 1.00 rc2

FILTER_DATA 構造体を整理
なんか気に入らなかったのでコンプレッサのアルゴリズム変更(今回は波形を見ながら
ちゃんと調整した)
-comp_rms オプション追加
フィルタ特性出力の周波数軸を対数軸にした
-fir_eq オプション追加
-fir_eq_detail オプション追加
-cutouthead オプション追加
-balance オプション追加
-normal_nolink オプション追加



2002/5/23  WAVEFLT2 Ver 1.00 rc1

リサンプリングの間抜けなバグを修正(LPF の減衰量が足りてなかった)
リサンプリングのパラメータを調整
-rsmp_detail オプション追加
24,64 bit の出力が変になってたのを訂正
エンジン部分を DLL 化するため内部構造をまた大幅に改造
エンジン部から fprintf() を全部排除
エンジン部を分離して wflt2.dll を作成
wflt2.dll の使用サンプル作成
簡単なテスト



2002/5/21  WAVEFLT2 Ver 1.00 beta2

SSE2 対応
-nosse2 オプション追加
ADP フィルタのしょうもないバグを修正(畳み込みがちゃんとされてなかった)
ADP フィルタ高速化(約 2 倍)
コンプレッサのしょうもないバグを修正(ゲイン調整がうまくいってなかった)
FIR フィルタのメモリ関係の処理をちゃんとした
ファイルサイズが 4G 未満の時は拡張ヘッダを出力しないようにした


2002/5/20  WAVEFLT2 Ver 1.00 beta1

6 G 位の WAVE ファイルを使って、本当に 4G 以上のファイルで使えるのかテスト。
-format で 8bit を指定して入力を nosound としたときちゃんとした無音ファイルが
できない問題を解決
-cut と -split が同時に使えない問題を解決
-cut と -nosound_detai 2 〜が同時に使えない問題を解決
-noextrahdr オプション追加
-info の処理をちゃんと作った
-buf, -pipebuf の仕様を変更してバッファサイズをフォーマットによって可変にした
FIR フィルタと IIR フィルタを同時に使えるようにした。
-firchr,-iirchr オプション追加
32 bit のファイルだとノイズが入っていた問題を解決
64 bit ファイルの format tag を 3 (IEEE FLOAT) にした。
-text の処理をちゃんと作った

やっぱりソニーみたいに独自フォーマットで拡張するのは良くないと思ったが
パッとした拡張フォーマットも無いし、ASF 使うのもしゃくなのでとりあえずし
ばらくは RIFF を拡張した独自フォーマットを使う事にした。生 PCM なので後で
いくらでも潰しが利くし。

という訳で wflt チャンクの仕様は

・WAVEFLT2 は fmt_ と data チャンクの間に wflt チャンクを出力する

・構造: 20 byte

'wflt'			: 4byte
チャンクサイズ	: (DWORD) 4byte
データサイズ	: (int64) 8byte
(リザーブ)		: (DWORD) 4byte

と決定。


2002/5/18  WAVEFLT2 Ver 1.00 alpha2

やっぱり 32 bit のデフォルト出力はlong にすることにして -outbit32long 廃止
その代わり 64 bit double 型出力追加
内部処理を 64 bit 化
独自フォーマットとして wave フォーマットに 'wflt' チャンクを拡張して 4G 制約突破
-format オプション追加
軽くテスト


2002/5/17  WAVEFLT2 Ver 1.00 alpha

オプション関係の大幅見直しで Ver.0.9* 系とオプションの互換性がほとんど
無くなってしまったので、思い切って WAVEFLT2 に改名。

ノーマライズ周りの処理を大幅変更。
32 bit (float,long) 入出力に対応。
-outbit32long オプション追加。
-normal_avg_comp, -normal_rms_comp オプション追加
-comp オプション追加
-fir_lpf,-fir_hpf,-fir_bpf,-fir_bsf オプション追加
-firdb オプション追加
-nosat オプション追加
出力ファイルに null 指定できるようにした。
手を入れた所から順次メッセージを英語化。
ヘルプ更新


2002/5/13  Ver 1.00 alpha2

-nowavehdr オプション追加。
ヘルプを更新。


2002/4/30  Ver 1.00 alpha

FIR フィルタ周りのソースを大幅整理。
ADP フィルタ周りのソースを大幅整理。
IIR フィルタ周りのソースを少し整理。
ついでなので、すべてのフィルタのソースを整理してかなり見やすくなった。
ついでなので、因果性を満たすために分かりづらいプログラム構造になっていたのを
きれいにしてさらに見やすくなった。
結局、ほとんどソースを書き直した事になったので思い切って Ver 1.00 にすることにした。

24 bit ファイルの入出力に対応。
内部的に音のデータを -1 から 1 に正規化して計算するようにした。
各フィルタのディフォルトパラメータ値の調整(今回は音楽を聴きながらちゃんとした)。

この際だからオプション関係の全面見直し 

-adp_detail, -outbit, -dither オプション追加。


(これ以前の更新履歴は ver. 0.989 のマニュアルを参照すること)