「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 版のバイナリはソースから作成して下さい。ただしソースの改造が必要だと思います。
推奨環境:
セレロン 1.2G 以上、メモリ 312M 以上、HDD 空10G 以上、Windows 2000/XP
開発環境: CPU: セレロン1.2G メモリ: 312M 音源: Philips PSC706 + audio-technica ATH-M40fs OS: Windows XP pro コンパイラ: VC++6.0
はじめにコマンドプロンプトを起動して下さい。 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 以上に設定しておけば量子化雑音の影響は最小限に 抑えられます。
(8) 入力が 24 bit ファイルか、もしくはフィルタ処理を行った場合で 出力 bit 数を 16 bit にするときは出来るだけ -dither 0 を指定するようにしてください。
入力音声の無音部を判定してファイルを分割し、 さらにノーマライズして 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)
→ サブバンド・ノイズゲート(-ngate_sb)
→ 適応フィルタ(-adp)
→ FIR フィルタ(-fir_*)
→ FIR イコライザ(-fir_eq*)
→ IIR フィルタ(-iir_*)
→ (ディ)エンファシス(-demp)
→ シェルビング EQ low(-sveq_l)
→ シェルビング EQ high(-sveq_h)
→ ピーキング EQ (-pkeq)
→ 位相逆転(-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 |
%b | 出力データサイズ(byte) |
%B | 出力ファイル全体のサイズ(= %b + ヘッダサイズ)(byte) |
%% | % |
%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 | ロック音のウィンドウハンドル |
文字列置換規則表 (WAVEFLT2 のみ)
%^ | " |
(ロック音での置換例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
URL : http://hp.vector.co.jp/authors/VA014492/
Copyright (c) 1999-2003 Tomoya Tokairin
waveflt2.exe : GPL
wflt2.dll :
wflt2dll.h, wflt2.lib, wflt2.dll のみを使用して dynamic link するなら LGPL2.1
static link するなら GPL
Mersenne Twister(rand.c): Copyright (C) 1997-2002, Makoto Matsumoto and Takuji Nishimura
2003/1/18 WAVEFLT2 Ver 1.16 文字列置換のところを少しいじった(%b,%B 追加) ノイズゲートのところをいじった(まだ作成途中)。 -ditherを指定した時は四捨五入で量子化するようにした。 2002/12/22 WAVEFLT2 Ver 1.15 今まで適当にしてたディザ処理をちゃんとするようにした。 rectangleディザからtriangleディザに変更した。 24次FIRノイズシェイパ追加。 rand()の代わりにMersenne Twisterを使うことにした。 -dither の書式を変更。 EWC Ver 1.60 付属。 2002/11/24 WAVEFLT2 Ver 1.12 -balance の範囲を 0 <= l,r <= 100.0 に変更。 EWC ver 1.58 付属 2002/11/23 WAVEFLT2 Ver 1.11 -tstamp オプション追加 2002/11/15 WAVEFLT2 Ver 1.10 テストした。 軽いデバッグ。 EWC ver 1.57 付属 2002/10/15 WAVEFLT2 Ver 1.10b3 まぬけなバグをちょっと修正 2002/9/4 WAVEFLT2 Ver 1.10b2 出力先が null の時も -exec で指定したコマンドを実行するバグ(?)を修正 2002/6/25 WAVEFLT2 Ver 1.10b -pkeq オプション追加 -ngate_f オプション追加 -mdct オプション廃止 シェルビング EQ のルーチンを整理 FFT と MDCT のルーチンを整理 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 のマニュアルを参照すること)