Kiraru2002の部屋

Last Updated : 2006/06/09 7:30 (JST)
アクセスカウンタ:

[更新履歴] Last Updated : its ver.0.8.5
[過去のComment] : [Blog]

Avisynth plugins (for 1.0x/2.0x and/or 2.5x)

Avisynth plugins (for 2.5x)

Others



なお、Avisynthスクリプトは、大文字小文字を区別しないので、DNR2でもdnr2でもDnr2でも良い。
アンダースコアの有無に要注意。

プログラミングの習作として作成したもので、一切の保証を負いません。
使用したことによる損害賠償の免責、バグ修正等のメンテナンスの免責に同意した人は自由に使用してください。
なお、作成、テスト環境は以下の通り。
  • PentiumIII-866MHz,i815E,384MB,GA-6oxm7e,CT5880,on board video
  • Windows2000SP3,NTFS
  • MSVC5.0 + MASM 6.14
  • Avisynth 1.0beta7d, 2.08, 2.51
  • VirtualDub 1.5.1, AviUtl 0.98d
  • Video source:AD-TVK52Pro hunuaaCap 2.5.6.0 YUY2(huffyuv,PICVideo MJPEG) 640x480

  • Pentium4-3.0GHz,i865PE,2GB,GA-8IPE1000-Pro2(rev.2.0)
  • Windows2000SP4/XPSP2,NTFS
  • MS VCTK(free) ver.1.1 + MASM 6.15
  • Avisynth 2.55
  • VirtualDub 1.6.9, AviUtl 0.99
  • Video source:PrimeTV 7133(lifeview) hunuaaCap 2.5.6.3 YUY2(huffyuv) 704x480


    (for 1.0x/2.0x and/or 2.5x)とあるPluginは、GPL ver.2 が適用されます。
    (for 2.5x)とあるPluginについては、GPLというわけではありません。

  • 参考: 2ch BBSのDTV板に専用スレッド Avisynthを絶讃ιょぅょ Part21 があります。
    本プラグインへのバグ報告・意見等ありましたら、私の blog 又は 2ch BBS へどうぞ。
    なお、コメント数が1000を超えてdat落ちして読めなくなった場合は、DTV板から継続のスレッドを探してみて ください。
    2ch BBS DTV板一覧


    ColorYUY2 - 色補正(YUY2/YV12)

    Download ColorYUY2 v0.17-3 (included Source files)

    ColorYUY2( gain_y, off_y, gamma_y, cont_y,
    gain_u, off_u, gamma_u, cont_u,
    gain_v, off_v, gamma_v, cont_v,
    gain_r, off_r, gamma_r, cont_r,
    gain_g, off_g, gamma_g, cont_g,
    gain_b, off_b, gamma_b, cont_b,
    levels, opt, matrix,
    debug, hscale, x, y, interpolation, convert, interlaced )


    gain_y, gain_u, gain_v 左端(値=0)を基点に拡大縮小(比率は±256で2倍、又は、0)
    コントラストとの違いはセンター値(128)が基点じゃないこと
    cont_y, cont_u, cont_v コントラスト値を指定
    センター(128)を基点に拡大縮小(比率は±256で2倍、又は、0)
    off_y, off_u, off_v オフセット(Brightness)。指定値分シフトする(-255〜255)
    gamma_y ガンマ値 (0で等倍)
    gamma_u, gamma_v dummy parameter
    gain_r, gain_g, gain_b 左端(値=0)を基点に拡大縮小(比率は±256で2倍、又は、0)
    コントラストとの違いはセンター値(128)が基点じゃないこと
    cont_r, cont_g, cont_b コントラスト値を指定
    センター(128)を基点に拡大縮小(比率は±256で2倍、又は、0)
    off_r, off_g, off_b オフセット(Brightness)。指定値分シフトする(-255〜255)
    gamma_r, gamma_g, gamma_b ガンマ値 (0で等倍)
    levels スケール補正を文字列で指定する
    (なおgain,off,cont,gammaより先に適用される)
    "TV->PC" : (16-235(240)を0-255に伸張する)
    "PC->TV" : (0-255を16-235(240)に縮小する)
    "TV->PC.Y" :
    "PC->TV.Y" :
    "709->601" : rec. BT.709をBT.601にマトリックス変換する(interlaced指定参照)
    "autoY" : optで指定された範囲に輝度(Y)のみを自動調整する(SSE ONLY)
    "autoYUV" : optで指定された範囲に自動調整する(SSE ONLY)
    "autoY=filepath" : 自動調整の結果を指定ファイルに保存する(SSE ONLY)
    "autoYUV=filepath" : 自動調整の結果を指定ファイルに保存する(SSE ONLY)
    opt 演算結果を飽和指定する
    "coring" : ITU-R rec. BT.601仕様( Y:16-235, UV:16-240 )
    "1-254" : BT.601制御用データを除外( YUV: 1-254 )
    "[prefix:][n1-n2] [,] [prefix:][n3-n4] ..." :
    それぞれの色の制限範囲を指定する。
    prefix = "","Y:","U:","V:","UV:","YUV:"のいずれか。
    prefixなしの場合は、"YUV:"と同等。
    区切り記号として空白、タブ、カンマを使用して良い。
    matrix ピクセル統計情報のRGB値の算出方法を指定する。
    "" (default) : BT.601伸張
    "rec709" : BT.709伸張
    "rec601s" : BT.601ストレート
    "rec709s" : BT.709ストレート
    debug ヒストグラム、データ解析の出力・表示指定
    (左上位置に表示、負値を指定時は左下位置に表示)
    = 0 (default) : none
    = 1 : infoをデバッグメッセージ出力
    = 2 : Histogram(YUV)表示
    = 3 : Histogram(YUV)表示 + info表示
    = 4 : Histogram(RGB)表示
    = 5 : Histogram(RGB)表示 + info表示
    = 6 : Histogram(YUV,RGB)表示 (ただし表示するのは変換後のdstの値のみ)
    = 7 : Histogram(YUV,RGB)表示 + info表示
    = bit4=1 : 表示する情報を少なくする(S.D.と累積min/maxは非表示)
    = bit5=1 : ヒストグラム表示領域をさらに8pixel分余分に拡張する
    [例 debug=$25 , debug=5+32, debug=-$25]
    hscale default=70 : Histogramのscale指定(10-100 %)
    x, y 座標(x,y),(x+1,y),(x+2,y),(x+3,y)
    (x,y+1),(x+1,y+1),(x+2,y+1),(x+3,y+1)のyuv値表示
    (Histogramありの場合に有効)
    interpolation YUV411をYUV422に色差を補間する。(YUY2で4pixel置きに前後のUV値の平均をとる。)
    widthは4の倍数のこと。YUY2の場合のみ有効
    = "411->422" :pixel 4,5,8,9,12,13,...,(w-4),(w-3)が対象
    = "411->422R" :pixel 2,3,6,7,...,(w-6),(w-5)が対象
    interlaced YV12(I420)の場合に有効。ソース形式を指定する
    この指定が意味を持つのは、debug>=1、又は RGB補正指定時、levels="709->601"の時で、 YV12->RGB変換が絡む場合のみ。
    = false (default): progressive source
    = true : interlaced source

    • 一応、off,gainはAviUtl,gammaはTMPGEncに似せてある。
      (ただしAviUtlでのU,Vのgainは、cont_u,cont_vに相当する)
    • gain,off,cont,gamma指定には、実数指定有効。(例 cont_y=20.5)
    • RGB補正を指定すると、若干処理は重くなる。

    • 補正の順序は
      1. YUV411->YUV422色補間
      2. 709->601変換
      3. levelsスケール補正
      4. YUVのoffset(brightness), gain, contrast(YUV補正ありの場合)
      5. ( Yのgamma ) [RGB補正ありの場合はYUVは16bit値で変換]
      6. ( Coring 範囲カット、RGB補正有り時は16bit値で計算しカットなし)
      (これ以降は、RGB補正ありの場合)
      7. YUV->RGB変換
      なお、RGB値は4倍値となり、通常範囲:+0 to +1023 最大:-2048 to +3071 )
      8. RGBのoffset(brightness), gain, contrast
      9. RGBのgamma
      10. RGB->YUV変換
      11. Coring 範囲カット
      なお、YUV->RGB,RGB->YUV変換にはAvisynthの変換係数と異なった値を採用している。
      (値の指定は 絶対値が0.00001より大きいとき指定したことになる)

    • YUV411->YUV422色補間の方法は
      連続する4つのピクセルの色差が同じ場合に使うことを前提にしている。
      UV値のみを前後から平均化する。
      例えば、U値が左から、0,0,2,2,4,4,6,6(計16pixel)となっていた場合
      "411->422"の場合、右から左へ順次補正していく
      (4+6)/2=5,(2+4)/2=3,(0+2)/2=1
      0,0,1,2,3,4,5,6と補正される。 [補間式 ( (n-1) + (n+1) ) / 2]
      "411->422r"の場合、左から右へ順次補正していく
      (0+2+1)/2=1,(2+4+1)/2=3,(4+6+1)/2=5
      0,1,2,3,4,5,6,6と補正される。 [補間式 ( (n-1) + (n+1) + 1) / 2]
      (なお、DVでは411->422rの方を使うと良いようです)

    • Levels Auto自動調整機能
      初回の0フレーム表示時に、全フレームの最大・最小値をスキャンし、 optで指定された範囲に値を伸縮する
      この機能はソースのフレーム数が多いとかなり時間が掛かる危険な機能です
      VirtualDub以外でのこの機能の使用は止めておくことをお勧めします
      進行状況(progress)をデバッグメッセージに出力する
      ( [Auto Level] scanning... frame No. = 60 ( 20 %) )
      debug=3,5,7指定時には、画面上に "Range (Y:xx-xx U:xx-xx V:xx-xx)"と
      スキャン結果が表示される

      filepathが指定された場合、
      ファイルが存在した場合は起動時に読み込み設定値を変換テーブル(LUT)に反映する
      (ファイルの中のLUT指定有効(Enable_LUT_Y=1など)時は、debugの"Range"は表示しない)
      ファイルが存在しない場合は、初回0フレーム表示時に全フレームをスキャンする
      スキャン後に指定されたファイルに結果を保存する

      min/maxからoff,gain,contの計算方法
      (UVの補正は、UVを同じ倍率で伸縮し、最大・最小の4点がoptで指定された
      範囲を超えないようにする)
      (Y_min,Y_max : データの最大・最小値)
      (Y_lo,Y_hi : optパラメタ値)

      double gainY = 0;
      double gainC;
      double gainUL = 99999./256+1;
      double gainUH = 99999./256+1;
      double gainVL = 99999./256+1;
      double gainVH = 99999./256+1;
      if(Y_max > Y_min) gainY = ((double)Y_hi - Y_lo) / (Y_max - Y_min);
      if(U_lo < 128 && U_min < 128) gainUL = ((double)128 - U_lo) / (128 - U_min);
      if(U_hi > 128 && U_max > 128) gainUH = ((double)U_hi - 128) / (U_max - 128);
      if(V_lo < 128 && V_min < 128) gainVL = ((double)128 - V_lo) / (128 - V_min);
      if(V_hi > 128 && V_max > 128) gainVH = ((double)V_hi - 128) / (V_max - 128);
      gainC = MIN(MIN(gainUL, gainUH), MIN(gainVL,gainVH));
      if(gainC > 99998./256+1) gainC = 1.0;
      off_y = (Y_lo-Y_min)*gainY;
      gain_y = (gainY-1)*256;
      cont_u = cont_v = (gainC-1)*256;

      【注意】
      sseをサポートしたCPUでのみ動作する(PIII,P4,Celeron,Xeon,Athlon)
      auto指定時には、RGB補正の指定は無効となり、YUV補正のみとなる
      さらにautoYの場合は、Yに関する指定も、autoYUVの場合は、YUV指定全てが無効となる
      interpolation="411->422(r)"とlevels="709->601"のみ有効となる
      ただし、スキャンは何も効果をかけない状態で行うので、同時に指定しない方が良い
      (自動調整後には、411->422補間、709->601変換、LUT変換という順で適用される)
      また、0フレームを表示する前(自動調整実行前)でも、RGB補正の指定は無効となる

      Avisynth v1.0x/2,0x系では、キャッシュの制御関係で画像が壊れるみたいで 使用しない方が良い

    • デバッグメッセージは(DONALD Graftのwebページから DebugView utility を入手して見て下さい。
      (Koepi氏のXviDのページからも別リンクがあります)
      起動時に、YUVそれぞれの変換テーブルダンプ(256*3)を出力、
      各フレーム処理時は,YUVそれぞれで、フィルタ前-後の最小、最大、平均値を出力
      また、RGB変換時の最小、最大、平均値とフロー数も出力
      (オーバーフロー: Y > 235, UV > 240, RGB > 255)
      (アンダーフロー: YUV < 16, RGB < 0)

    UPDATE : 2003/09/06
    新規
    debugパラメタの指定に、bit4=1 ,bit5=1を追加
    (累積max/min値の追加)
    levels="autoY=filepath","autoYUV=filepath"を追加
    Bug fix:
    mmx CPUで、YV12(I420)のinfo情報でwidthが8の倍数でない場合の
    RGB値を正しく表示されるように修正(制限解除)
    自動調整のスキャン中のデバッグメッセージを修正(flame->frame)
    ※ YV12 progressive時、levels="709->601"は高さ(Height)が4の倍数でなければ
    ならないのは仕様とする
    UPDATE : 2003/09/06-2
    Bug fix:
    自動調整で、出力される情報のcont_yをgain_yに修正
    UPDATE : 2003/09/06-3
    Bug fix:
    データのUVのmin(max)が128より大きい(小さい)時、
    又はoptの指定値が、UVの下限(上限)が128より大きい(小さい)時、
    自動調整の算出式の考慮から外すように修正


    DNR2 - Dynamic Noise Reduction 2 ( YUY2/RGB32/YV12 )

    Download DNR2 v0.7 (included Source files)

    VirtualDub plugin - dynamic noise reduction (MMX) by Steven Don and Avery Leeの移植版

    DNR2( threshY_hi, threshY_lo, threshU_hi, threshU_lo, threshV_hi, threshV_lo, type )

    threshY_hi 一つ前の累積されたフレームデータのpixelとの輝度(Y)のしきい値1
    [ default = 8 ]
    threshY_lo 一つ前の累積されたフレームデータのpixelとの輝度(Y)のしきい値2
    [ default = threshY_hi / 2 + 1 ]
    threshU_hi 一つ前の累積されたフレームデータのpixelとの色差情報U(Cb)のしきい値1
    [ default = threshY_hi * 3 / 4 (YUY2/YV12) : threshY_hi (RGB) ]
    threshU_lo 一つ前の累積されたフレームデータのpixelとの色差情報U(Cb)のしきい値2
    [ default = threshU_hi / 2 + 1 ]
    threshV_hi 一つ前の累積されたフレームデータのpixelとの色差情報V(Cr)のしきい値1
    [ default = threshY_hi * 3 / 4 (YUY2/YV12) : threshY_hi (RGB) ]
    threshV_lo 一つ前の累積されたフレームデータのpixelとの色差情報V(Cr)のしきい値2
    [ default = threshV_hi / 2 + 1]
    type "DNR2" (又は "" ) [default] or "DNR1"

    • MMXをサポートしているCPUではMMXが使われる。
    • threshold_hi の推奨値 7 - 12
    • なお、RGB32の場合は、それぞれY:U:V = R:G:Bに対応する。
    • 処理概要から解るように、本フィルタはprogressive,interlaced両方が処理可能。

    処理概要
    現在のフレームの各点と1つ前のDNR処理済フレームの同じ位置の点を比較し、
    加重平均化する。その差が閾値以内かどうかで処理が異なる。

    case1 : type="" or "dnr2"(default)
    現在フレームのpixel = current , 一つ前フレームのpixel = previous とすると
    if |current - previous| < threshold_hi
    if |current - previous| > threshold_lo
    then new = ( 2 * current + previous ) / 3      //current値寄り
    else new = ( current + 3 * previous ) / 4       //previous値寄り
    else new = current

    case2 : type="dnr1"
    現在フレームのpixel = current , 一つ前フレームのpixel = previous とすると
    if |current - previous| < threshold_hi
    if |current - previous| > threshold_lo
    then new = ( 2 * current + previous ) / 3      //current値寄り
    else new = previous
    else new = current

    typeのDNR1とDNR2の違いは、DNR2の方が高画質ではあるがMPEG圧縮の助けにはならず、
    DNR1の方がMPEG圧縮という点に関しては高圧縮の助けになる。

    _2DCleanYUY2 - 2D Cleaner Noise Reduction
    (YUY2 Only 要MMX2,SSE)

    Download _2DClenYUY2 v0.10 (included Source files)

    VirtualDub plugin - Jim Casaburi's 2D Cleaner 及び Jaan Kalda's Optimized 2D Cleaner のロジックを参考にAvisynth用に1から作成したものです。

    _2DCleanYUY2( interlaced, thresholdY, radiusX, radiusY, dmode, thresholdU, thresholdV )

    interlaced = 0 ( Default )
    = 1 (比較対象ラインを1ラインおきとする)
    thresholdY 輝度情報の閾値 default = 9
    thresholdU 色差情報(Cb,B-Y)の閾値 省略するとthresholdYと同じ
    128が原点なのであまり大きい値だと色が無くなっていくことに注意
    (例えば閾値を250にすると、|10 - 250| < 250 => 平均値=130となるがこれはほぼニュートラル)
    thresholdV 色差情報(Cr,R-Y)の閾値 省略するとthresholdYと同じ
    128が原点なのであまり大きい値だと色が無くなっていくことに注意
    radiusX 比較する点の横の範囲を指定 default=2 radiusX=0-3
    radiusY 比較する点の縦の範囲を指定 default=2 radiusY=0-9
    dmode = 0 (通常)
    = 1(エッジを黒で表示)
    = 2 (dmode = 1 に加えてエッジ以外は白で表示)
    = 3 (エッジは、元の値と処理値との平均  new = (current + new + 1) / 2 )
    = 4 (エッジは、元の値。つまり処理しない new = current)

    処理概要
    フレームの各点について、radiusX,radiusYで指定された近傍の点と差分をとり、
    その差が閾値以内の値だけを対象に平均化する。
    conditional average とかいう方法みたい。
    現在フレームのpixel = current , 近傍の点pixel = around
    (radiusX,Y=2の場合は縦横 5 * 5 の25点が対象)
    (インターレース指定時は、Y方向は-4,-2,0,2,4のラインが対象となる)
    if |current - around| < Threshold ( Y, U, V の全てが範囲内の場合)
    sum(Y,U,V) += around , count++
    new(Y,U,V) = ( sum(Y,U,V) + ( count / 2 ) ) / count

    元の2DCleanは、各色単位に閾値判定しているが、2DCleanOptは全ての色が閾値以内か どうかで判定している。
    ここではOptと同じ方法を採用した。
    エッジは、このcountが近傍の点の半分より少ない場合、黒(dmode=1,2) 多い場合、白(dmode=2)で表示しています。


    AddRange - AddRange (trimming) filter

    Download AddRange v0.5 (included Source files)

    VirtualDubでカット編集して保存した環境ファイル(vcf file)を読み込み、trimmingするフィルタです。
    AddRange()又はTrim()を記述するのが面倒くさい人向けのフィルタです。
    Nandubで編集出力したvcfファイルにも対応。

    AddRange( filename )

    filename "foo.vcf" (VDub vcfファイルのパスを指定する)


    • AddRangeの数は、256個まで処理できます。
    • 形式の許容範囲は、
      VirtualDub.subset.AddRange ( 999 , 999 )
      VirtualDub.subset.AddFrame ( 999 , 999 )
      VirtualDub.subset.AddMaskedRange ( 999 , 999 )
      など、行頭とトークンの間に空白とタブを挟むことは可能となっています。
      また、フレームの順は前後していてもかまいません。
      VirtualDub.subset.AddRange(300,10)
      VirtualDub.subset.AddRange(100,10)
      VirtualDub.subset.AddRange(100,10)
      VirtualDub.subset.AddRange(200,10)
      でも良い。

    • エラーメッセージ
      AddRange: file not found - "foo.vcf"
      AddRange: read error - "foo.vcf"
      AddRange: format error - "foo.vcf"(line:999) : (999,999)の形式以外
      AddRange: 2nd value read error - "foo.vcf"(line:999) : 該当行の2つ目の数値が0の場合
      AddRange: AddRange too many(max 256) - “foo.vcf" : AddRange行が256個以上存在する
      AddRange: file too big - “foo.vcf" > 128KB : vcfファイルが128KB以上のサイズ
      AddRange: error(%d) - "foo.vcf" : unknown error

    • 従来のAddRange関数も、パラメタの種類や数が異なれば別関数として取り扱われるので
      function AddRange(clip clip, int "startframe", int "offset")
      {
      return clip.Trim( default(startframe,0), ((default(offset,0)==0)? 0 : startframe+offset-1) )
      }
      AddRange(999,9999)とかの併用も可能。
      例】AddRange("test.vcf")
      例】AddRange("test.vcf") + AddRange(0,3000)

    カット編集Tips
    VDubでのカット編集には、キーボード操作を覚えると格段に楽になります。
    (当たり前の機能なんですが活用されていない人もいるようなのでここで取り上げます)
    基本操作
    ALT + Right forward 50 frames
    ALT + Left back 50 fraes
    Right forward 1 frame
    Left back 1 frae
    Home 開始位置を設定
    End 終了位置を設定
    Delete 選択範囲を削除
    その他にも便利な機能がキーにアサインされています。詳しくはEditメニュを見て下さい。
    一番下のreset frame subsetは、編集操作をリセットして始めの無編集の状態に戻します。
    (Editメニュからでしか使えない機能もあります)
    また、画面下のボタンも使えます。ただしシーンチェンジ移動については、
    options-preferences-sceneで閾値の設定を調整する必要があるかも知れません。

    UPDATE : 2003/11/03
    vcfファイルの大きさを128KBまで許容するように変更した。
    Mask範囲指定の処理を追加した。(AddMaskedRange)
    Nandubで出力したvcfファイルにも対応した。(AddFrame)
    UPDATE : 2003/11/03-2
    1番目の範囲指定の処理が不正だった。
    (開始フレーム位置が0固定になり、AddMaskedRangeはAddRangeと見なされた)

    Befa - 時報除去 Band Eliminate Filter for Audio
    [8/16bit stereo/mono] (None/YUY2/RGB24/RGB32/YV12)

    Download Befa v0.3 (included Source files)

    特定周波数帯のみを消して、時報を除去することを目的とした プラグインです
    茂木和洋 (MOGI, Kazuhiro)氏作成の時報除去 AviUtl フィルタプラグインの移植版です。
    今のところ、WarpSharp.dllでは音声フィルタが使用できないみたいなので作ってみました。
    お遊び機能として、スペクトル表示し、目で調整できるようにした。


    Befa( sec, freq, bandwidth, freq2, bandwidth2, dftsize, fade, window, mode, show, scale, plevel )

    sec default : 1.3 [ 0.0 to xxx (sec)]
    効果をかける時間を秒(second)で指定する。
    0.0を指定時はBefaは無動作となる。
    mode=1の場合には指定は意味を持たない。
    freq default : 1000 [0 to (sampling freq/2) (Hz)]
    第一除去周波数を設定する。0を指定時は帯域阻止しない。
    bandwidth default : 40 [0 to 512]
    第一除去周波数の幅を設定する。
    幅の1単位は、= サンプリング周波数 / 2 / (2^dftsize) [Hz]
    freq2 default : -1 [-1 to (sampling freq/2) (Hz)]
    第二除去周波数を設定する。0を指定時は帯域阻止しない。
    -1を指定時は、= freqの値 * 2 (但し freq < 9000Hzの場合)
    なお、第一除去周波数とは独立しているので、第一除去周波数帯と同じ
    帯域を指定すると、その帯域は2度除去されることになる。
    window指定してて効果が薄い場合、そのようにしてみるのも面白いかも。
    bandwidth2 default : -1 [-1 to 512]
    第二除去周波数の幅を設定する。
    -1を指定時は、= (bandwidth+7)/8
    dftsize default : 11 [8 to 14]
    フーリエ変換の際のブロックサイズを設定する。
    単位は 2^n で、9 の場合 FFT サイズは 512 に、11の場合は 2048 になる。
    fade default : 25
    フェードイン処理を行う長さを指定する。単位は (sec)時間の%
    mode=1の場合、約1secの%となる。
    window default : 1 [0 to 3]
    帯域阻止フィルタに窓関数を乗算するかどうか指定する。
    中央(freq)を最大カットし、指定帯域の縁にいくに従ってなだらかな特性を持たせる。 チェックする場合は、幅を通常よりも広げて使用してください。
    = 0 : 単純に指定した周波数帯域を全て0にする。
    = 1 : Hann(Hanning) window (茂木氏のプラグインのものと同じ)
    = 2 : Hamming window
    = 3 : Blackman window (広帯域向き、シャープさに欠ける。時報除去用途には不向き)
    mode default : 0 [0 to 1]
    動作モードを指定する。
    = 0 : 先頭から指定した(sec)秒を対象にし、以降はスルー出力。
    = 1 : 全体にフィルタを掛ける。
    show default : 0 [0 to 2]
    Spectrum graph 表示する。
    なお、実際には正負の値をとるが絶対値(gain)にして表示する。
    注意すべきは、フィルタ後のグラフは逆DFT前のものなので、
    実際にこのとおりにカットされて出力されるわけではない。
    = 0 : 表示なし
    = 1 : 周波数帯域成分のスペクトルを画像に重ねて表示する
    = 2 : 画面幅に合わせて表示する周波数帯を制限する
    scale default : 1024 [1 to ?]
    Spectrum graph の値のスケーリングファクタを指定する。
    小さい値ほど敏感になる。
    plevel default : 100 [0 to 100]
    Spectrum graph 表示の背景の画像の輝度レベルを % 指定する。
    グラフが見づらい場合はゲインを下げると見易くなる。


    指定例
    #------------------------
    # CT5880(SB PCI 128 digital)で44.1kHzでサンプリングした場合、以下の設定値で消えた
    #------------------------
    Befa(freq=990) # 先頭から1.3秒間フィルタリングし、そのうち0.3秒間はフェードインする。

    #------------------------
    # 周波数分布を見る。グラフはdftziseで指定された1ブロック分単位(約42ms)
    #------------------------
    WavSource("foo.wav")
    Befa(show=1, mode=1, freq=0, scale=512, plavel=50) # spectrum analysis

    #------------------------
    # 途中にフィルタ掛けする場合、前後2フレーム分は緩衝領域として捨ててください
    #------------------------
    last.trim(0,99) + last.trim(98,201).Befa(mode=1,fade=0).trim(2,101) + last.trim(200,0)


    処理概要
    このフィルタは、実離散フーリエ変換(DFT)による直線位相(群遅延平坦)特性
    をもつFIR filterとして実装されている。
    入力系列とフィルタのインパルス応答の積を畳み込んで逆DFTして出力系列を求める
    というわけである。

    dftsizeに指定された値(defaultでは2048点)を1ブロックとして、1/4ブロック分を重ね
    合わせてブロック単位に分割して随時実行する。(オーバーラップ方式)
    なお、重なった部分は、前ブロックが直線的に比率を減じ、後のブロックが比率を増加させて
    最終的に足し込んでいる。
    実数DFTによりdftzise個の周波数成分に分解し、指定周波数帯域成分を中心に半径
    (bandwidth+1)の帯域を阻止する。
    (defaultでは、一つの帯域幅は、サンプリング周波数/2/dftsizeになり、
    44.1KHzで10Hz(48KHzで11Hz)
    なので、1000Hzを中心に-400〜+400Hzの帯域と2000Hzを中心に-110〜+110Hzを阻止する。)
    ただ、単純に矩形で阻止した場合、ギブス現象と呼ばれる周波数特性の振動(ノイズ)が発生
    するので、その防止策として、窓関数を乗算したインパルス系列を使用することもできるよう
    になっている。(この原因は有限回のフーリエ係数で打ち切っているため)
    なお、入力系列はAudio 16bit形式で、実変換時正規化していないため、実際より32768倍の
    数値で計算が行われる。
    (実は良く判っていない。今後暇な時に勉強する予定)
    (データを補間水増したりすればより精度向上が期待できるが、今ので十分か?)

    UPDATE : 2003/09/24
    変更
    secとbandwidth2のdefault値を変更した(freqとsecの範囲チェックを甘くした)
    計算は全てdouble型で行い、整数に変換時に四捨五入するようにした
    Bug fix:
    mode=0で指定範囲直後の音声が途切れる場合があったのを修正
    freq2=0を指定しても、第二除去周波数帯が無効にならなかったのを修正

    Script Sample : 私のスクリプトサンプル

    #Import("vdfilters.avs")
    Import("vfapi.avs")
    LoadPlugin("decomb.dll")
    LoadPlugin("MPEG2DEC.dll")
    LoadPlugin("TomsMoComp.dll")
    LoadPlugin("Convolution3d.dll")
    LoadPlugin("IT.dll")
    LoadPlugin("De.dll")
    LoadPlugin("lanczos3.vdf")
    LoadPlugin("anticomb.dll")
    LoadPlugin("warpsharp.dll")
    LoadPlugin("ColorYUY2.dll")
    LoadPlugin("Dnr2.dll")
    LoadPlugin("_2DCleanYUY2.dll")
    LoadPlugin("AddRange.dll")

    terget = "title_name"
    OpenDMLSource(terget + ".avi")
    #VFAPISource("aup",terget+".aup")
    #AudioDub(Mpeg2Source(terget+".d2v") , WAVSource(terget+".wav") ) # DVD2AVI v1.76 project file
    #Mpeg2video(terget+".mpg") # m2v.vfp
    #subtitle( last.GetParity() ? "top_first":"bottom_first" , font="" )
    AssumeFrameBased().ComplementParity()
    #AddRange(100,10000)+AddRange(15000,20000)
    AddRange(terget + ".vcf")
    #Crop(0,58,640,360) # 16:9

    #--- 30i(24p) source : animation ---
    #DeDotA()
    IT(fps=24, ref="TOP", blend=false)
    #IT(fps=30, ref="TOP", blend=false).decimate(mode=2)
    #FrameCache(9).Auto24FPS(true,24,16,"",false)
    #AntiComb()
    #DNR2(7,3,5,3,5,3,"dnr1")
    FrameCache(4).Convolution3d( "animeHQ" )
    #FrameCache(5).TemporalSmoother(2,3)
    _2DCleanYUY2(0,7,2,2,0,4,4)
    WarpSharp(depth=56, blur=2, bump=96, cubic=-0.6)
    #Lanczos3Resize(480,360)
    ColorYUY2(debug=0,x=-1,y=-1,gain_y=15,gamma_y=15,cont_y=10,cont_u=15,cont_v=16)
    #FadeIn2Ex(n=ceil(last.framerate()), color=$ffffff, addframes=0) #white-fadein
    #FadeOut2Ex(n=20, color=$ffffff, addframes=0) #white-fadeout
    return last

    #--- 30i source ---
    FrameCache(3).TomsMoComp(1,5,1)
    #FrameCache(9).AutoDeint(mode="")
    #DNR2(8,4,6,3,6,3,"dnr1")
    FrameCache(4).Convolution3d( 0, 6, 4, 6, 4, 2.7, 0)
    #FrameCache(5).TemporalSmoother(2,3)
    _2DCleanYUY2(0,4,2,2,0,2,2)
    #return last

    #--- reverse field order ---
    #SeparateFields
    #top = SelectEven
    #bottom = SelectOdd
    #top = top.DeleteFrame(0)
    #Interleave(top,bottom)
    #Weave

    function AddRange(clip clip, int "startframe", int "offset")
    {
    return clip.Trim( default(startframe,0), ((default(offset,0)==0)? 0 : startframe+offset-1) )
    }

    function FadeOut2Ex(clip clip, int "n", int "color", int "addframes") # "addframes" valid in ver.2.0
    {
    color=default(color,$000000)
    n=default(n,round(clip.framerate))
    n=(clip.framecount>n)?n:clip.framecount
    addframes=default(addframes,0)
    newclip=(addframes>0)?clip.Loop(addframes+1,clip.framecount-1,clip.framecount-1):clip
    return Dissolve(newclip,newclip.BlankClip(n+2,color=color),n)
    }

    function FadeIn2Ex(clip clip, int "n", int "color", int "addframes") # "addframes" valid in ver.2.0
    {
    color=default(color,$000000)
    n=default(n,round(clip.framerate))
    n=(clip.framecount>n)?n:clip.framecount
    addframes=default(addframes,0)
    newclip=(addframes>0)?clip.Loop(addframes+1,clip.framecount-1,clip.framecount-1):clip
    newclip=(addframes>0)?clip.Loop(addframes+1,0,0):clip
    newclip=newclip.DelayAudio(addframes/newclip.framerate)
    newclip=(addframes>1)?newclip.trim(0,addframes-1).Amplify(0)+newclip.trim(addframes,0):newclip
    return Dissolve(newclip.BlankClip(n+2,color=color),newclip,n)
    }


    QX エディタ用マクロ

    AddRange挿入
    QVCF.MAC をQXエディタのMACROフォルダに格納し、
    メニュに追加する場合、qxkey.iniファイルを以下のように変更する。
    使用方法:avsファイルを開いて挿入したい位置にカーソル移動後、
    メニュ - 挿入 - AddRange入力を選択し、ターゲットのvcfファイルを指定する

    AddRangeは、"AddRange("pathname.vcf")"をカーソル位置に挿入する。
    AddFrameは、"Trim(start1,-range1)+Trim(start2,-range2)+..." をカーソル位置に挿入する。

    menubar "挿入(&I;)"
    	"AddRange入力"		$QVCF.MAC,Vcf_AddRange	<--この行を追加
    	"AddRange(Trim)入力"		$QVCF.MAC,Vcf_AddFrame	<--この行を追加
    	"日付の入力(&D;)"		CharDate
    	"時間の入力(&T;)"		CharTime
    
    ポップアップメニュ(右クリックメニュ)に追加する場合:
    [PopupMenu]
    Popup "ファイル"
    	"UNDO"		Undo
    	"REDO"		UndoUndo
    	"AddRange入力"		$QVCF.MAC,Vcf_AddRange	<--この行を追加
    	"AddRange(Trim)入力"		$QVCF.MAC,Vcf_AddFrame	<--この行を追加
    

    GPL について

    以下のfaqにあるように、ver. 1.0x/2.0x用のプラグインにGPLでなければなりません。
    ただし、ver 2.5x(以降)用のプラグインにはGPL以外でも許容される条項が追加されました。
    参考サイト
    GNU General Public License

    プラグインに関係するFAQ

    If a program released under the GPL uses plug-ins, what are the requirements for the licenses of a plug-in.

    It depends on how the program invokes its plug-ins. If the program uses
    fork and exec to invoke plug-ins, then the plug-ins are separate programs,
    so the license for the main program makes no requirements for them.
    If the program dynamically links plug-ins, and they make function calls
    to each other and share data structures, we believe they form a single program,
    so plug-ins must be treated as extensions to the main program. This means
    they must be released under the GPL or a GPL-compatible free software license.

    If the program dynamically links plug-ins, but the communication between them is
    limited to invoking the `main' function of the plug-in with some options and
    waiting for it to return, that is a borderline case.

    GPLの下で公開されていたプログラムがプラグインを使うとして、プラグインのライセンス
    にはどのような条件がありますか?


    それはプログラムがどのようにプラグインを呼び出すかに依ります。プログラムがforkや
    execでプラグインを呼び出すならば、プラグインは別のプログラムであり、メインプログラム
    のライセンスはそれらにはなんの条件も課しません。
    もしプログラムがプラグインと動的にリンクされており、お互いにファンクションコールを
    使ってデータ構造を共有している場合、それらは単一のプログラムを形成していると見なさ
    れますので、プラグインはメインプログラムの拡張部分として扱われなければなりません。
    すなわち、それらはGPLかGPLと矛盾しないフリーソフトウェアライセンスの下で公開されな
    ければならないということです。

    プログラムがプラグインと動的にリンクされているが、それらの間のコミュニケーションは
    いくつかのオプションとともにプラグインの「main」関数を呼び出して返値を待つだけとい
    う場合は、境界線上で微妙なケースとなります。

    Can I use the GPL for a plug-in for a non-free program?

    If the program uses fork and exec to invoke plug-ins, then the plug-ins are separate
    programs, so the license for the main program makes no requirements for them.
    So you can use the GPL for a plug-in, and there are no special requirements.
    If the program dynamically links plug-ins, and they make function calls to each other
    and share data structures, we believe they form a single program, so plug-ins must be
    treated as extensions to the main program. This means that linking the GPL-covered
    plug-in with the main program would violate the GPL. However, you can resolve that
    legal problem by adding an exception to your program's license which gives permission
    to link it with the non-free main program.

    For more details, see the question above that starts with, "I am writing free software
    that uses a non-free library."

    フリーではないプログラム向けのプラグインにGPLを適用することはできますか?

    もしプログラムがforkやexecでプラグインを呼び出すならば、プラグインは別のプログラム
    ですから、メインプログラムのライセンスは何の条件も課しません。ですからあなたはプラ
    グインにGPLを適用できますし、特別な要件はありません。
    プログラムがプラグインと動的にリンクされ、お互いにファンクションコールを使ってデータ
    構造を共有している場合、それらは単一のプログラムを形成していると見なされますので、
    プラグインはメインプログラムの拡張部分として扱われなければなりません。このことは、
    GPLで保護されたプラグインをメインプログラムとリンクするのはGPL違反となることを意味
    しています。しかし、あなたはこの法的問題を、あなたのプログラムのライセンスにフリー
    ではないメインプログラムとのリンクを許可する例外を加えることで解決できます。

    より詳しくは、「フリーではないライブラリを利用するフリーソフトウェアを書いています」
    という項目で始まる既出の質問をご覧ください。


    © Created by kiraru2002 2002/04/27