パラメトリックカーブに極と零点を分布させることによるフィルター設計


17

AN N番目の順バターワースローパスフィルタのカットオフ周波数ωc分配することにより設計することができるNパラメータに対して均一極を0<α<1 s平面パラメトリック曲線上のf(α)=ωcei(π/2+πα)、半円形です。

バタワースフィルター
図1. 6次バターワースフィルターの極(CC BY-SA 3.0 Fcorthay)

同じパラメトリック曲線を、正規化されていない伝達関数を与える任意のフィルター次数使用できることは注目に値しNます。

(1)H(s)=k=1N1sf(2k12N),

そして、結果のフィルターは常にバターワースフィルターであること。つまり、同じ数の極と零点をもつ他のフィルターは、周波数ω=0およびでの振幅応答の消失導関数の数が多くなりませんω=。同一のカットオフ周波数有するバターワースフィルタの組ωcバタワースのサブセットを形成するには、パラメトリック曲線たフィルタf(α)固有のものです。Nには上限がないため、サブセットは無限です。

より一般的には、パラメトリックカーブに由来する場合を除き、極と零点を無限に数えない、NNp極とNNz零点、Nは整数、Nz/Npは整数の非負の分数を持つフィルターは、正規化されていない形式の伝達関数:

(2)H(s)=k=1NNz(sfz(2k12NNz))k=1NNp(sfp(2k12NNp)),

ここで、fp(α)およびfz(α)は、極限における極と零点の分布を記述するパラメトリックカーブですN

  • 質問1:バターワース以外のフィルタータイプには、いくつかの最適性基準で定義され、式ごとに分数Nz/Npとパラメトリック曲線fp(α)およびのペアでそれぞれ定義される無限のサブセットがありますfz(α)。2、フィルターはだけ異なるNタイプI チェビシェフフィルター、はい; これらの場合、極はパラメトリック角楕円の半分に存在しαます。バターワースとタイプIおよびタイプIIのチェビシェフフィルターはどちらも楕円フィルターの特殊なケースです。。明確にするために、「無限のサブセット」とは、無限の数のサブセットではなく、無限のサイズのサブセットを意味します。
  • 質問2:非バターワース非チェビシェフ楕円フィルターには、このような無限のサブセットがありますか?
  • 質問3:すべての楕円フィルターはそのような無限のサブセットにありますか?

すべての楕円フィルターの無限集合が、極を配置するための単一のパラメトリックカーブとゼロを配置するための単一のパラメトリックカーブ、および零点から極への場合、楕円フィルターを得るための数値最適化は、特定の次数のフィルターではなく、パラメトリック曲線を最適化することで実行できます。最適な曲線を複数のフィルター次数に再利用して、最適性を維持できます。上記の「if」が質問2と3を尋ねる理由です。質問1は、他の最適性基準へのアプローチの拡張に関するものです。

確かに、楕円フィルターの極-零点プロットは、基本的な曲線があるように見えます。

楕円フィルター
図2. s平面上の楕円ローパスフィルターの対数振幅。白い点は極であり、黒い点はゼロです。

1つのリードは、Eqごとです。1、特定の値、したがって特定の極とゼロの位置を複数のフィルター間で共有する必要があります。α

アルファとフィルター次数
図5. 異なるフィルター次数Nに対して曲線パラメーターによって取得された値。いくつかのフィルター次数に対して、たとえばα = 0.5またはα = 0.25およびα = 0.75があることに注意してくださいαNα=0.5α=0.25α=0.75.

具体的には、持っているフィルタのため極または零点を、それらがすべて持っているフィルタでも現れる3 N N同一のをここでnは任意の正の整数です。N3nNn


非常にドライなユーモアを実証し、ユーザーA_Aのリクエストごとに、ベルヌーイのレムニスカイトをs面パラメトリックカーブの例として見ました。

ベルヌーイのレムニスケート
図4.ベルヌーイのレムニスケート

次のパラメトリック曲線は、ベルヌーイのレムニスケートの左半分を示し、パラメーターあり、s = 0で開始および終了します0<a<1s=0

f(α)=2sin(πα)cos2(πα)+1+i2sin(πα)cos(πα)cos2(πα)+1

極にこのパラメトリックカーブを使用して、式得られた振幅応答を異なるN間で比較したいと思います。1. 1 番目の方法は、N番目のルートを調べることですH I ω | 振幅周波数応答の1 / N。また、N での様子を覗くことができます。NN|H(iω)|1/NN

振幅周波数応答のN番目の根
図3. ベルヌーイのレムニスケート上に曲線のパラメーターに関して均一に極が分布しているN極フィルターの振幅周波数応答の番目のルート。表示されている周波数よりも高い周波数では、プロットはすべて-6 dB / oct(-20 dB /ディケード)の勾配に従います。制限でNは、でのプロットの誘導体の不連続があるω = 0 S = 0はレムニスケートとして(2回)、その時点でS-平面虚軸と交差します。NNNω=0s=0

N としての伝達関数(式1)の大きさの番目の根の極限は、次のよう に計算されました。NN

(3)limN|H(s)|1/N=01|1sf(α)|dα=e01log(|sf(α)|)dα,

ここで、は自然対数、積分、指数関数で計算できる積積分表します。積分の場合と同様に、ベルヌーイのレムニスケートについて数値的に評価しなければならない積分の記号表現はありませんでした。全体として、結果として得られる振幅周波数応答は、この「ランダムに選択された」パラメトリックカーブではかなり役に立たないように見えます。


ユーザーMatt L.はLernerフィルターについて言及しました。私がそれらについて見つけたもの、わずかな解釈:

H(s)=k=1mBk(s+a)(s+a)2+bk2B1=1/2,Bm=(1)m+12Bi=(1)k+1 for k=2,,m1,

磁極位置とようにBのM - BのM - 1 = B 2 - B 1 = 1a+ibkすべての3<k<m1に対して。これらの極は、線上に分布しているように見えますが、完全なフィルターの極ではなく、平行セクションの極です。システム全体の極が何であるか、またはラーナーフィルターが有用な意味で最適であるかどうかは確認していません。参照:CM Rader、B。Gold、MIT Lincoln Laboratory Technical Note 1965-63、Digital Filter Design Techniques、1965年12月23日bmbm1=b2b1=12(bkbk1)3<k<m1


4
私の英語は今朝揺れているので、あなたが何を言おうとしているのかよくわかりませんが、もしそれが楕円フィルターを計算する複数の方法についてなら、ウィキペディアの楕円でLutovacから本を見つけることをお勧めしますフィルターノート(Dimopoulosも)、それは非常に目を見張るものです:楕円フィルターを設計するには7つの方法があります。これが意図したものでない場合は、私のコメントを無視してください。
関係市民

2
ラーナーフィルターは、虚軸に平行な線上にすべての極を持ちます。それらには、ほぼ線形の位相応答があるという利点があります。
マットL.

2
完全なフィルター。しかし、すべての平行セクションの極が同じ線上にある場合、完全なフィルターもその線上にすべての極を持ちます。あなたは参照について正しいです。RaderとGoldによるテクニカルノートがあります。
マットL.

1
OK、私たちはどのジャーナルに行きますか?:Dこれには指針がありますか?たとえば、ある面で楕円よりも優れたパラメトリックを探していますか?(たとえば、遷移帯域とリップル)。「おもしろい」かもしれない別の家族は、*サイクロイドです...しかし、「順序付けの原則」なしでは、それらのどれも「最悪、悪い、良い、最高」と呼ぶことはできません:)
A_A

2
コメントスレッドが長すぎます。ただし、パラメトリックで投げるだけです フィルタウェーブレットDaubechiesのための場所ams.org/journals/proc/1996-124-12/S0002-9939-96-03557-5/...を|4y(1y)|=1
ローラン・デュバル

回答:


6

答え全体を通して、数学表記、つまり周波数領域でフィルターの振幅応答を表現するのと同等数学表記を使用します。このため、の代わりに使用されますjはωより良いおおよそのフィルターに数学的なパラメトリック曲線を見つけることについてオッリの質問@反映させるために、。これは、フィルタ設計ではないので、コーナー周波数はしたがって、ユニティに正規化されたxは代わりにω / ω Pxjωxω/ωp


これがあなたが探している答えであるかどうかはわかりませんが、一般的な伝達関数を介して任意のフィルターを表すことができます:

H2(x)=11+ϵp2R2(x)

ここで、であり、Rxは特性減衰関数です。ApはdB単位の通過帯域の減衰/リップルですが、Cauer / Elliptic、Inverse Pascal、またはInverse Chebyshev(別名「Chebyshev Type II」)の阻止帯域に存在する場合もあります。後者は次のように表されます:ϵp=10Ap/101R(x)Ap

H2(x)=11+1ϵs2TN2(x)

あなたが見たように、バターワースの場合:

R(x)=xN

チェビシェフそれのための、またはチェビシェフ多項式(COS / A C O ためのX 1及びCOSH / A C O 時間のために、X > 1)、楕円のは次のとおりです。R(x)=TN(x)cosacosx1coshacoshx>1

R(x)=cd(NK1Kcd1(x,k),k1)

Lutovacの本には、楕円フィルターの厳密に等価な関数による非常に単純化された表現があります。たとえば、2次伝達関数は次のように正確に表すことができます。

R(x)=(1k2+1)x21(1k21)x2+1

ここで、唯一の依存関係はモジュラスです。k

これらは既知のタイプです。たとえば、Legendre、などのあまり知られていないタイプの場合、P Nx はルジャンドル多項式です。Pascalフィルターの場合、Pascalのシフトおよび正規化バージョンがあります。多項式:R(x)=PN(x)PN(x)

(N+12x+N12N)

リストは続きます。近似が異なるものもあります。たとえば、ガウスは、これはMacLaurinシリーズで展開され、ベッセルの場合とほぼ同じで、ラプラス式exp s から分母項に展開されます:|H(x)|2=exp(x2)exp(s)

ai=(2N1)!2Nii!(Ni)!

また、Papoulis(Optimum L)やHalpernなど、伝達関数を推定するためのよりエキゾチックな方法もあります。どちらも、伝達関数が高いフィルター選択性で単調減少するようにLegendre多項式を使用して応答を統合します。パポウリスの場合:

R(x2)=i=12x21(i=0kaiPi(x))2

ここで、あるN - 1 / 2 、及びiがいるかどうかに応じて、いくつかの巧妙に選択された用語であるN、またはK、両方、偶数/奇数です。k(N1)/2aiNk

指摘したようによう、これらすべては、表現のための周波数領域を使用していない数学でのx、実数、虚数ないjはω。根を解くいずれか交換する場合、単に伝達関数の極(及びゼロ)を見つけることによって行うことができるX線jはω、従って見つける。H S H - とHurwitzの多項式を選択する、または単にによりxの数式の根を見つけるxxjωxjωH(s)H(s)x(以下の2番目のコメントのリンクを参照)。これにより、根が90度回転します。つまり、実数部と虚数部を切り替えて、右手側を選択するだけです。

この答えはあなたが探していたものに近いですか?


現時点では、人々がマップにダーツを投げてポールをマークダウンしているため、フィルターが存在しないと言うことが重要だと思います。彼らは念頭に置いた目標について慎重に検討した後です。

たとえば、バターワースフィルターは、品質がほぼ向上するにつれて、減衰が単調に増加する設計が簡単なフィルターが必要になったためです。Linkwitz-Rileyは、(巧妙な)変装のバターワースに他なりません。そのため、同じコーナー周波数でローパスとハイパスを合計すると、フラットな応答が得られ、オーディオアプリケーションに役立ちます。

チェビシェフ(IおよびII)は、通過帯域または遮断帯域のリップルを犠牲にして、より良い減衰を持つように設計されました。ルジャンドル、超球面、パスカル(および他の可能性のあるもの)はリップルを最小化するため、減衰がわずかに減少しますが、群遅延が改善されます。

PapoulisとHalpernは、通過帯域リップルと単調に増加する減衰を組み合わせたものとして開発され、通過帯域の垂下を犠牲にして、コーナー周波数付近の減衰を改善しました。

Cauer / Ellipticフィルターは、通過帯域と阻止帯域の両方でリップルを利用して、同じまたはより良い減衰のために必要な次数を最小化します。

これらはすべて周波数領域にあり、ほとんどのフィルターがそうです。彼らは向かって収束して他の道を行く、ベッセルフィルタは、理由のアナログディレイを近似する必要があることになりましたオーダーが増加すると、ガウスフィルタはゼロオーバーシュート、これ彼らおおよそのために作成している間のexp - x 2昇順。exp(jω)exp(x2)

もちろん、誰かが提案したように、ポールを振りかけ、何が出るかを見ることができます。多分それらを星、またはいくつかのハニカムパターンとして設定し、お気に入りのレムニスケートを選択しますが、フィルターが必要な場合はそれを行う方法ではありませんそれから。確かに、100万人中1人のケースとして、誰がどこで知っているのかさえ当てはまるかもしれないエキゾチックな反応を得るかもしれませんが、それは本当に特定のケースにすぎません。最初に設計目標を課し、物理的に実現可能なフィルターに関してその目標をどのように達成できるかを確認します。それが、who-knows-whereに適用可能なフィルターを考え出すことを意味する場合でも。:-)


@Olliからの最近の答えを考えて、たとえばのために設計されたバターワースフィルターの単純なケースを考えてみましょう0.9@fp=1, 0.1@fs=5。計算は次のようなものです。

Ap=20log10(0.9)=0.91515 dBAs=20log10(0.1)=20 dBϵp=10Ap/101=0.48432ϵs=10As/101=9.94987F=fsfp=51=5N=logϵsϵplogF=1.878

は切り上げとして計算されるため、 N = 2です。つまり、フィルターの応答を通過帯域に一致させると、遮断帯域@fsの減衰が大きくなります。最初の式を使用すると、attemption @ fsは次のようになります。NN=2

H(fs)=11+0.48432252N=0.08231<0.1

0.1@fsを得るために阻止帯域を一致させる必要がある場合、周波数補正を適用する必要があります。

ωscale=(ϵsϵp)1/Nfpfs=9.949870.5=0.9065H(5ωscale)=0.1

だから、異なることができます10.9065と次の2つの両極端の間にあるすべての無限の可能性を得ることができます。それできますか?はい。その価値はありますか?たとえ1つか2つの議論を見つけたとしても、一般的な答えはまだノーです。これはどうして可能だったのでしょうか?バターワースフィルターの初期応答が既に取得されているため、単調に減少する周波数減衰を持つフィルターの解析式があり、伝達関数の分母から極を検出することになります。等しい角度の円上にあります。ωscale10.9065


@Olliからの最近の回答を考えると、綴りが必要なものがいくつかあります。第一に、これはすべて、数学的な観点または物理的な実現可能性の観点から見たフィルター設計に関するものです。

それが数学的なものである場合、その理論には興味深い部分があります。つまり、元のフィルターを再設計する必要なく同じフィルターから異なる次数を取得します。

しかし、物理的な実現可能性の観点から見ると、プロセス全体は、余分な不要な作業を意味し、同じ結果をもたらすはずです。これは、正確に、新しいものを取得するためのフィルターの順序の増加/減少に関する部分です。私の主張は次のとおりです。

コアのフィルターは、電気的、機械的、またはその他の物理量の不要な周波数をフィルターするのに役立ちます。その目的は、スペクトル(または群遅延、または時間応答)を変更することです。そのようなデバイスが必要な場合、そのデバイスは、単にあらゆる種類のフィルターを投入するだけでは設計できません。「そこに置いておくだけで、ものをフィルターで除外します」。その設計は、ほとんどの場合、非常に複雑です。ただし、このプロセスはすべて要件から開始する必要があります。つまり、最初に「超えるすべてをフィルター処理する」、または「赤外光のみを通過させる」など、特定の目標を設定する必要があります。作業。100 Hz

以下の周波数フィルタアウトする必要があった場合は迅速な例として、以上3000  ヘルツは、1だけで、減衰も、指定する必要があり、それらのコーナー周波数を持つバンドパスフィルタで投げていないかどうか、通過帯域内のリップル、またはストップバンド、またはその両方が必要または受け入れられます。位相が線形であるかどうか、グループ遅延がこのすべてにどのように影響するかなどです。したがって、まず、フィルターの設計に必要な特定のパラメーターがあります。300 Hz3000 Hz

パラメーターが指定されたら、フィルターはどのように設計されますか?12次の楕円ローパスフィルターが必要であり、低次のフィルターを高次のものに増やす可能性があると仮定しましょう(@Olliの答えを参照)。4次を12次に変換するプロセスは完璧なものであり、4次フィルターの設計パラメーターを、変換後に結果の12次が終わるように指定する方法があるとしましょうそれらの条件を満たす。「計画的思考」。

来る質問はこれです:4次フィルタはどのように設計されますか?答えは、それを設計する既知の方法を通してのみ可能です。また、他の方法がある場合、またはまだ発明されていない場合、その4次フィルターを設計するために、最初にそれらを適用する必要があります。その後のみ、12次を計算できます。最初から想定したように、完璧な変換プロセスであっても、設計全体が収束しようとする結果のフィルターである12次は、2つの設計ステップを必要とすることを意味するだけです:1次、4次、および2次、12次のフィルターは、最初は4次のメソッドを使用して簡単に設計できたため、12次の場合、プロセス全体が不必要に邪魔になります。

もう少し進んで、もう少し仮定してみましょう。結果の12次の極は楕円上にあり、零点は虚軸上にあります。それらの間の距離は、楕円フィルターを制御する基礎となる楕円関数によって正確に定義されます。@Olliが望んでいるように、これらの曲線を定義する方法があると仮定します。これらの曲線を単に使用することで、最初からフィルターを1ショットで簡単に設計できるようになります。ポールの配置が完了しました。ここまでは順調ですね。ただし、これらの曲線を最初に計算する必要があり、それらを解くパラメーターは、フィルター設計に使用される正確なものであり、既知または未既知の他の方法でフィルターを生成するものと同じです。さらに、計算はまだ行われていません。最も可能性が高いのは、これらのパラメトリックカーブの基本的な定義が楕円形である必要があり、そうでない場合は楕円フィルターが出力されないことです[注#1]。これは、楕円フィルターの極は既に閉形式の表現を持っているため、プロセス全体が楕円フィルターの設計のさらに別の方法に過ぎないことを意味します。

誤解しないでください。1つのフィルターを1つの方法で設計できる場合、同じ方法で別のフィルターを設計できます。これは、「まだ知られている」方法の1つです。発明者にブラボー。しかし、この設計方法が、別の方法の場合と同じ結果に収束するために余分なステップを必要とする場合、実行可能なアプローチとは思えません。そして注意してください:結果が正しく、メソッドが正しい限り、どのメソッドを使用しているかは実際には関係ないので、フィルター設計について話しているときは名前や説明ラベルを使用せず、一般的な名前だけを使用しています設計プロセスの邪魔になりません。

[note#1]:ポールを配置するために一般的な曲線をたどるだけでは不十分です。バターワースフィルターに関連する2つの例を示します。チェビシェフI型フィルターは、バターワースの角度で楕円に極が配置されていますが、楕円をインターセプトするまで虚軸に投影されます。極間の距離を変更すると、等リップルではない動作が発生し、フィルターが非チェビシェフ型になります。同様に、最小Q楕円フィルターの極は下にある円上に配置されますが、それはバターワースであることを意味しません(楕円フィルターのリップルが最小の場合でも)、角度間の距離が等しくないためです。最後の1つについては、こちら」

Butterworth vs min-Q elliptic

全体的に、質問がもたらす真の関心にもかかわらず、フィルター設計を扱う部分にうまく適合しないため、理論的な価値、せいぜい教育的な価値しかないことを恐れています。もちろん、それが実際の価値があると証明する必要がある場合は、間違っていることが証明されてうれしいです。既存のフィルター設計よりも優れたフィルター設計の新しい方法があるからです。


@OlliNiemitaloはい、それは非二乗バージョンです。司祭が言うことではなく、司祭が言うことをしてください。:-) Apはの通過帯域の減衰/リップルですがdB、Cauer / Elliptic、逆チェビシェフ、または逆パスカルの場合は、阻止帯域にも使用できます。他にも軽微な間違いがあるので、それらを編集します。
関係市民

1
Olli、TchebyshevsとButterworthの両方に素敵な閉形式表現があります。しかし、エリプティカル/カウアーフィルターについてはそれほどではありません。そのために明確に定義された藻類(極と零点の軌跡)を取得することは(どういうことでしょうか?)交尾する雌犬です。
ロバートブリストージョンソン

1
@ robertbristow-johnson正確な科学的同義語にもかかわらず、Cauerの極を表すには少なくとも3つの方法があります。1つは近似値(Antoniou?、Dimopoulos ?、不明)です。これが最も広く使用されていると思います。その後、正確楕円関数を、以下のバラスの方法は、すなわちゼロがあります±j/(ksn(iK/N,k)),i=1,2,..(異なる奇数/偶数)、しかし、それはシータ関数とwhatnotを使用する必要があり、それはCPUに関して非常に「ふわふわ」になります。次に、Lutovacがいます。彼は、たとえ素数を使用できなくても、それらを大幅に単純化しますが、順序が大きくなるにつれて大きくなります。
関係市民

1
@robertbristow-johnson Me neither, as mentioned at the end of the original edit, and in one of the comments, but it looks like it got edited along the way, I'll correct it. As for the elliptic functions, Burrus and another one (forgot the name, Paarman?) use the sn(K+sn1()) version, but sn(K+x)=cd(x), the shifted Jacobi sine, a fact noted by Lutovac. So, to avoid the need to calculate an extra complete elliptic integral, one can write cd(), there's no difference. A simple plot can show it (k1=ϵp/ϵs,k=fp/fs,K1=K(k1),K=K(k)).
a concerned citizen

1
xx in any mathematical software will get you the magnitude, without going into frequency domain. I left outside replacing x=jω, making H(s)H(s), and selecting only the Hurwitz criterion poles/zeroes, that is for filter design. Besides, you can get the poles without that, just as well (see link in comment#2).
a concerned citizen

2

私は直感的に、何が必要かを理解していると感じていますが、それを表現するのに苦労しています。これが自分の制限によるものなのか、実際に問題が難しいのか、それとも不適切なのかはわかりません。私はそれが不適切だと感じています。だから、ここに私の試みがあります:

  1. 目的はフィルターを作成することです。つまり、何らかの合理的な形式の係数のセットを計算します。

H(s)=B(s)A(s)=m=0MbmsmsN+n=0N1ansn

(Please note, it doesn't have to be over the s-plane, it could be over the z-plane too. And also, simpler forms of it could be considered (e.g. H(s) to have only poles). Let's run with the s-plane for the moment and let's keep the nominator in too).

  1. Digital filters are characterised by their frequency and phase responses, both of which can be completely determined by the values (or, positions on the s-plane) of their an,bm coefficients. The discussion so far seems to be focusing on the frequency response so let's consider that one for the moment.

  2. Given a set of some an,bm and some point σ+jω on the s-plane, the geometric way of deriving the frequency response at that point is to form "zero vectors" (from the locations of the zeros, towards the specific point) and "pole vectors" (similarly for the poles), sum their magnitudes and form the ratio as in the equation above.

  3. To ask "What [...] filter types defined by some optimality criterion have infinite subsets defined by parametric curves [...]" is to ask "What is the pair of some parametric curves A(s,Θ),B(s,Θ) whose locations also result in a magnitude response curve with specific desired characteristics over Θ (e.g. slope, ripple, other). Where Θ is the parameter(s) of the...parametric.

  4. A note, at this point: On the one hand, we are looking for A(s),B(s) that satisfy two constraints. First of all they have to satisfy the constraints of the parametric (easy) and secondly they have to satisfy the constraints specified by the magnitude response characteristic (difficult).

  5. I think that the problem, in its current form, is ill-posed because there is no analytic way to connect the frequency response constraints with the parametrics A(s,Θ),B(s,Θ), except the direct evaluation of it. In other words, it is impossible at the moment to specify some constraints on the frequency response curve and through that, work backwards and find those parametrics that satisfy these constraints. We can go the other way around, but not backwards.

  6. Therefore, what (i think that) realistically can be done, at the moment, is to accept A(s,Θ),B(s,Θ) of some specific form and then, either check how do they fare as filters OR, iteratively move their coefficients around as much as their parametric allow, to squeeze the best performance they can offer out of a particular range of their Θ. However, we might find that given the worked out characteristics of elliptics (for example), a given iterative scheme on a parametric might choose to "bend" the coefficients as close as possible to some "elliptic" region characteristic. This is why earlier on, I mention that we might find that a complex parametric might be possible to be broken down to a "sum of elliptics" or a "sum of curves with known characteristics". Perhaps a third constraint is required here, reading "Stay away from known configurations of A(s),B(s)", in other words, penalise solutions that start looking like elliptics (but still in an iterative scheme).

Finally, if this path is not too wrong so far then we are somewhere close to something like Genetic Algorithms For Filter Design, or some other informed "shoot in the dark" technique by which the coefficients of a filter satisfying specific criteria might be derived with. The above is just an example, there are more publications along these lines out there.

Hope this helps.


+1 I like your program. For your point #4 and others, the optimization goal could be stated in terms of limN(H(iω))1/N, or usually its absolute value. Then again it would mean we are already relying on the the viability of the approach, which is in question. So it would be necessary to also check with some finite N filters. In point #7, I don't think "repulsion of elliptics" would help as it would give sub-optimal near-elliptic filters. Rather, the optimization goal should be changed.
Olli Niemitalo

1
Thank you. I agree that the optimisation goal is crucial here. "Repulsion of the eliptics" should be used more often... :)
A_A

2

i don't think it's particularly remarkable that Butterworth filters, defined as all-pole filters that are maximally flat at ω=0 (for LPF prototype, meaning the most possible derivatives of |H(jω)| are zero at ω=0), have s-plane poles that lie equally spaced on the left half-circle of radius ω0.

from the "maximally flat" and "no zeros", you can derive

|H(jω)|2=11+(ωω0)2N

for the Nth-order Butterworth.

so

|H(s)|2=11+(sjω0)2N

s=pn is a pole when the denominator is zero.

1+(pnjω0)2N=0

or

(pnjω0)2N=1

pn2N=(jω0)2N

|pn|=ω0

2Narg{pn}=π+2Nπ2+2πn

arg{pn}=π2+πN(n12)

for Nth-order Tchebyshev (Type 1, which is all-pole), it's like this:

|H(jω)|2=11+ϵ2TN2(ωωc)

where

TN(x){cos(Narccos(x)),if |x|1cosh(Narccosh(x)),if x1(1)Ncosh(Narccosh(x)),if x1

are the Nth-order Tchebyshev polynomials and satisfy the recursion:

T0(x)=1T1(x)=xTn+1(x)=2xTn(x)Tn1(x)nZ1

and ωc is the "passband cutoff" frequency and not to be confused with the -3 dB frequency ω0. (but the two are related.)

the passband ripple parameter is ϵ=10dBripple101

analytic extension again:

|H(s)|2=11+ϵ2TN2(sjωc)

and again s=pn is a pole when the denominator is zero.

1+ϵ2TN2(pnjωc)=0

or

TN(pnjωc)=±jϵ

(because cos(θ)=cosh(jθ) we can use either cos() or cosh() expression for TN()

cosh(Narccosh(pnjωc))=±jϵ

Narccosh(pnjωc)=arccosh(±jϵ)

since

y=cosh(x)=12(ex+ex)
and
x=arccosh(y)=log(y±y21)

then

Nlog(pnjωc±(pnjωc)21)=log(±jϵ±(±jϵ)21)

Nlog((pn)+j(pn)jωc±((pn)+j(pn)jωc)21)=log(±j(1ϵ±1ϵ2+1))

Nlog(j(pn)+(pn)ωc±(j(pn)+(pn)ωc)21)=log(±j(1ϵ±1ϵ2+1))

oh dear i might not get this blasted out in 12 hours

i've decided that i am too lazy to grok through this. if anyone wants to pick it up, feel free to. lotsa conversion between rectangular and polar notation of complex values. remember when

w=± z 
then
|w|=+|z|
and
arg{w}=12arg{z}+arg{±1}=12arg{z}+π2(1±1)

and remember

log(z)=log|z|+jarg{z}+j2πnnZ

you may add any integer multiple of 2π (say "2πn") to any arg{} (choose the right-hand log() which is how you can get different poles for pn).

if you like mathematical masturbation with complex variables, knock yourself out.


+1 for the interesting observation, but since this doesn't address the questions I hope there will be other candidates for the bounty.
Olli Niemitalo

so Olli, you can see how the derivation of the poles for Tchebyshev 1 and poles/zeros for Tchebyshev 2 is similarly done?
robert bristow-johnson

the Jabobi Elliptical is a bitch. i dunno how to evaluate it without looking it up in Antonio. and it ain't gonna be closed form.
robert bristow-johnson

Yes, the zeros of Tchebyshev 2 are uniformly distributed on parametric curve f(α)=j/cos(πα) for cutoff 1.
Olli Niemitalo

and how do you get that result and the loci of the poles for either Tchebyshev 1 or 2?
robert bristow-johnson

0

12th order elliptic to 4th order elliptic

(I'm not eligible to the bounty.) I tried to produce a counterexample to question 3 in Octave but was pleasantly surprised that I couldn't. If the answer to the question 3 is yes, then according to Fig 5. of the question, specific poles and zeros should be shared between an elliptic filter of order 4 and an elliptic filter of order 12, here shown explicitly: Shared poles and zeros
Figure 1. Poles and zeros potentially shared between elliptic filters of order N=12 and N=4, in blue and numbered in order of ascending parameter α of a parametric curve f(α).

Let's design an order 12 elliptic filter with some arbitrary parameters: 1 dB pass band ripple, -90 dB stop band ripple, cutoff frequency 0.1234, s-plane rather than z-plane:

pkg load signal;
[b12, a12] = ellip (12, 0.1, 90, 0.1234, "s");
ra12 = roots(a12);
rb12 = roots(b12);
freqs(b12, a12, [0:10000]/10000);

12th order filter magnitude frequency response
Figure 2. The magnitude frequency response of the 12th order elliptic filter designed using ellip.

scatter(vertcat(real(ra12), real(rb12)), vertcat(imag(ra12), imag(rb12)));

Poles and zeros, filter order 12
Figure 3. Poles (red) and zeros (blue) of order 12 elliptic filter designed using ellip. Horizontal axis: real part, vertical axis: imaginary part.

Let's construct an order 4 filter by reusing select poles and zeros of the order 12 filter, per Fig. 1. In the particular case, ordering the poles and zeros by the imaginary part is sufficient:

[~, ira12] = sort(imag(ra12));
[~, irb12] = sort(imag(rb12));
ra4 = [ra12(ira12)(2), ra12(ira12)(5), ra12(ira12)(8), ra12(ira12)(11)];
rb4 = [rb12(irb12)(2), rb12(irb12)(5), rb12(irb12)(8), rb12(irb12)(11)];
freqs(poly(rb4), poly(ra4), [0:10000]/10000);

Fourth order filter magnitude frequency response
Figure 4. Magnitude frequency response of the 4th order filter that has all poles and zeros identical to certain ones of those of the 12th order filter, per Fig. 1. Zooming in gives a characterization of the filter: 3.14 dB pass band equiripple, -27.69 dB stop band equiripple, cutoff frequency 0.1234.

It is my understanding that an equiripple pass band and an equiripple stop band with as many ripples as the number of poles and zeros allows is a sufficient condition to say that the filter is elliptic. But let's try if this is confirmed by designing an order 4 elliptic filter by ellip with the characterization obtained from Fig 3 and by comparing the poles and zeros between the two order 4 filters:

[b4el, a4el] = ellip (4, 3.14, 27.69, 0.1234, "s");
rb4el = roots(b4el);
ra4el = roots(a4el);
scatter(vertcat(real(ra4), real(rb4)), vertcat(imag(ra4), imag(rb4)));

That against:

scatter(vertcat(real(ra4el), real(rb4el)), vertcat(imag(ra4el), imag(rb4el)), "blue", "x");

4th order filter pole/zero comparison
Figure 5. Comparison of pole (red) and zero (blue) locations between an ellip-designed 4th order filter (crosses) and a 4th order filter (circles) that shares certain pole and zero locations with the 12th order filter. Horizontal axis: real part, vertical axis: imaginary part.

The poles and zeros coincide between the two filters to three decimal places, which was the precision of the characterization of the filter derived from the order 12 filter. The conclusion is that at least in this particular case both the poles and zeros of the order 4 elliptic filter and those of the order 12 elliptic filter could have been obtained, at least up to a precision, by uniformly distributing them on the same parametric curves. The filters were not Butterworth or Chebyshev I or II type filters as both the pass band and the stop band had ripples.

4th order elliptic to 12th order elliptic

Conversely, can the poles and zeros of the 12th order filter be approximated from a pair of continuous functions fitted to the poles and zeros of the 4th order ellip filter?

If we duplicate the four poles (Fig. 5) and flip the sign of the real parts of the duplicates, we get an oval of sorts. As we go round and round the oval, the pole locations that we pass give a periodic discrete sequence. It is a good candidate for periodic band-limited interpolation by zero-padding its discrete Fourier transform (DFT). Of the resulting 24 poles the ones with a positive real part are discarded, halving the number of poles to 12. Instead of the zeros, their reciprocals are interpolated, but otherwise the interpolation is done the same way as with the poles. We start with the same ellip-designed 4th order filter as earlier (approximately identical to Fig. 4):

pkg load signal;
[b4el, a4el] = ellip (4, 3.14, 27.69, 0.1234, "s");
rb4el = roots(b4el);
ra4el = roots(a4el);
rb4eli = 1./rb4el;
[~, ira4el] = sort(imag(ra4el));
[~, irb4eli] = sort(imag(rb4eli));
ra4eld = vertcat(ra4el(ira4el), -ra4el(ira4el));
rb4elid = vertcat(rb4eli(irb4eli), -rb4eli(irb4eli));
ra12syn = -interpft(ra4eld, 24)(12:23);
rb12syn = -1./interpft(rb4elid, 24)(12:23);
freqs(poly(rb12syn), poly(ra12syn), [0:10000]/10000);

Magnitude frequency response of the 4->12th order interpolated filter
Figure 6. Magnitude frequency response of a 12th order filter with the poles and zeros sampled from curves matched to those of the 4th order filter.

It is not an accurate enough of a mockup of the Fig. 2 response to be useful. The stop band fares pretty well but the pass band is tilted. The band edge frequencies are approximately correct. Still, this shows potential considering the parametric curves were only described by 4 degrees of freedom each.

Let's have a look at how the poles and zeros match those of the N=12 ellip-generated filter:

[b12, a12] = ellip (12, 0.1, 90, 0.1234, "s");
ra12 = roots(a12);
rb12 = roots(b12);
scatter(vertcat(real(ra12), real(rb12)), vertcat(imag(ra12), imag(rb12)), "blue", "x");
scatter(vertcat(real(ra12syn), real(rb12syn)), vertcat(imag(ra12syn), imag(rb12syn)));

Comparison of poles and zeros for N=12
Figure 7. Comparison of pole (red) and zero (blue) locations between an ellip-designed 12th order filter (crosses) and a 12th order filter (circles) that was derived from the 4th order filter. Horizontal axis: real part, vertical axis: imaginary part.

The interpolated poles are quite a bit off, but zeros are matched relatively well. A larger N as the starting point should be investigated.

6th order elliptic to 18th order elliptic

Doing the same as above but starting at 6th order and interpolating to 18th order shows a seemingly well-behaved magnitude frequency response, but still has trouble in the pass band when examined closely:

[b6el, a6el] = ellip (6, 0.03, 30, 0.1234, "s");
rb6el = roots(b6el);
ra6el = roots(a6el);
rb6eli = 1./rb6el;
[~, ira6el] = sort(imag(ra6el));
[~, irb6eli] = sort(imag(rb6eli));
ra6eld = vertcat(ra6el(ira6el), -ra6el(ira6el));
rb6elid = vertcat(rb6eli(irb6eli), -rb6eli(irb6eli));
ra18syn = -interpft(ra6eld, 36)(18:35);
rb18syn = -1./interpft(rb6elid, 36)(18:35);
freqs(poly(rb18syn), poly(ra18syn), [0:10000]/10000);

6th order <code>ellip</code>-generated filter
18th order filter derived from the
Figure 8. Top) 6th order ellip-generated filter, Bottom) 18th order filter derived from the 6th order filter. Zoomed in, the pass band has only two maxima and about 1 dB of ripple. The stop band is nearly equiripple with 2.5 dB of variation.

My guess about the trouble at the pass band is that the band-limited interpolation isn't working well enough with the (real parts of the) poles.

Exact curves for elliptic filters

It turns out that elliptic filters for which NNz=NNp=N provide positive examples to questions 1 and 2. C. Sidney Burrus, Digital Signal Processing and Digital Filter Design (Draft). OpenStax CNX. Nov 18, 2012 gives the zeros and poles of the transfer function of a sufficiently general NNz=NNp=N elliptic filter in terms of the Jacobi elliptic sine sn(t,k). Noting that sn(t,k)=sn(t,k), Burrus Eq. 3.136 can be rewritten for zeros szi, i=1N as:

(1)szi=jksn(K+K(2i+1)/N,k),

where K is a quarter period of sn(t,k) for real t, and 0k1 can be seen as a degree of freedom in the parameterization of the filter. It controls the transition band width relative to pass band width. Recognizing (2i+1)/N=2α (see Eq. 2 of the question) where α is the parameter of the parametric curve:

(2)fz(α)=jksn(K+2Kα,k),

Burrus Eq. 3.146 gives the upper-left quarter-plane poles including a real pole for odd N. It can be rewritten for all poles spi, i=1N with any N as:

(3)spi=cn(K+K(2i+1)/N,k)dn(K+K(2i+1)/N,k)sn(ν0,1k2)×cn(ν0,1k2)+jsn(K+K(2i+1)/N,k)dn(ν0,1k2)1dn2(K+K(2i+1)/N,k)sn2(ν0,1k2),

where dn(t,k)=1k2sn2(t,k) is one of the Jacobi elliptic functions. Some sources have k2 as the second argument for all of these functions and call it the modulus. We have k and call it the modulus. The variable 0<ν0<K´ can be thought of as one of the two degrees of freedom (k,ν0) of the sufficiently general parametric curves, and one of the three degrees of freedom (k,ν0,N) of a sufficiently general elliptic filter. At ν0=0 the pass band ripple would be infinite and at ν0=K´ where K´ is the quarter period of Jacobi elliptic functions with modulus 1k2, poles would equal zeros. By sufficiently general I mean that there is just one remaining degree of freedom that controls the pass band edge frequency and which will manifest itself as uniform scaling of both parametric curve functions by the same factor. The subset of elliptic filters that share fp(α), fz(α), and an irreducible fraction Nz/Pz=1, are transformed to another subset of infinite size in dimension N upon change of the trivial degree of freedom.

By the same substitution as with the zeros, the parametric curve for the poles can be written as:

(4)fp(α)=cn(K+2Kα,k)dn(K+2Kα,k)sn(ν0,1k2)×cn(ν0,1k2)+jsn(K+2Kα,k)dn(ν0,1k2)1dn2(K+2Kα,k)sn2(ν0,1k2).

Let's plot the functions and the curves in Octave, for values of k and ν0 (v0in the code) copied from Burrus Example 3.4:

k = 0.769231; 
v0 = 0.6059485; #Maximum is ellipke(1-k^2)
K = 1024; #Resolution of plots
[snv0, cnv0, dnv0] = ellipj(v0, 1-k^2);
dnv0=sqrt(1-(1-k^2)*snv0.^2); # Fix for Octave bug #43344
[sn, cn, dn] = ellipj([0:4*K-1]*ellipke(k^2)/K, k^2);
dn=sqrt(1-k^2*sn.^2); # Fix for Octave bug #43344
a2K = [0:4*K-1];
a2KpK = mod(K + a2K - 1, 4*K)+1;
fza = i./(k*sn(a2KpK));
fpa = (cn(a2KpK).*dn(a2KpK)*snv0*cnv0 + i*sn(a2KpK)*dnv0)./(1-dn(a2KpK).^2*snv0.^2);
plot(a2K/K/2, real(fza), a2K/K/2, imag(fza), a2K/K/2, real(fpa), a2K/K/2, imag(fpa));
ylim([-2,2]);
a = [1/6, 3/6, 5/6];
ai = round(a*2*K)+1;
scatter(vertcat(a, a), vertcat(real(fza(ai)), imag(fza(ai)))); ylim([-2,2]); xlim([0, 2]);
scatter(vertcat(a, a), vertcat(real(fpa(ai)), imag(fpa(ai))), "red", "x"); ylim([-2,2]); xlim([0, 2]);

Analytic extensions of parametric curve functions for Burrus Example 3.4
Figure 9. fz(α) and fp(α) for Burrus Example 3.4, analytically extended to period α=02. The three poles (red crosses) and the three zeros (blue circles, one infinite and not shown) of the example are sampled uniformly with respect to α at α=1/6, α=3/6, and α=5/6, from these functions, per Eq. 2 of the question. With the extension, the reciprocal of Im(fz(α)) (not shown) oscillates very gently, making it easy to approximate by a truncated Fourier series as in the previous sections. The other periodic extended functions are also smooth, but not so easy to approximate that way.

plot(real(fpa)([1:2*K+1]), imag(fpa)([1:2*K+1]), real(fza)([1:2*K+1]), imag(fza)([1:2*K+1]));
xlim([-2, 2]);
ylim([-2, 2]);
scatter(real(fza(ai)), imag(fza(ai))); ylim([-2,2]); xlim([-2, 2]);
scatter(real(fpa(ai)), imag(fpa(ai)), "red", "x"); ylim([-2,2]); xlim([-2, 2]);

Parametric curves for Burrus Example 3.4
Figure 10. Parametric curves for Burrus Example 3.4. Horizontal axis: real part, vertical axis: imaginary part. This view does not show the speed of the parametric curve so the three poles (red crosses) and the three zeros (blue circles, one infinite and not shown) do not appear to be uniformly distributed on the curves, even as they are, with respect to the parameter α of the parametric curves.

Elliptic filter design by the exact pole and zero formulas given by Burrus is fully equivalent to sampling from the exact fp(α) and fz(α), so methods are equivalent and available. Question 1 remains open-ended. It may be that other types of filters have infinite subsets defined by fp(α) and fz(α) and Nz/Np. Of methods of approximating the elliptic parametric curves, those that do not depend on the exact functional form may be transferable to other filter types, I think most likely to those that generalize elliptic filters, such as some subset of general equiripple filters. For them, exact formulas for poles and zeros may be unknown or intractable.

Going back to Eq. 2, for odd N, we have for one of the zeros α=0.5, which sends it to infinity by sn(2K,k)=0. No such thing takes place with the poles (Eq. 4). I have updated the question to have such zeros (and poles, in case) included in the count NNz (or NNp). At k=0, all zeros go to infinity according to fz(α), which looks to give type I Chebyshev filters.

I think question 3 just got resolved and the answer is "yes". That, as it appears that we can cover all cases of elliptic filter without being in conflict with NNz=NNp, with the new definition of those.


Olli, you can't give yourself the bounty anyway. your 500 points are gone forever. just don't waste them like i did accidentally once at the EE.SE page.
robert bristow-johnson

Comments are not for extended discussion; this conversation has been moved to chat.
jojek

1
Yes, they still are, that is the special case for odd orders, when there's an additional, single, real pole, re/(s+re), to the transfer function. As for the rational function starting from zeroes, only, you have:
R(x)=in/2x2zeroi2jn/2x2k/zeroj2
, where k=fs/fp. For odd orders, R(x)=R(x)x. This will make the filter have unnormalized gain, so it should be scaled by R(0). Poles come from expanding 1+ϵ2R2(x) and finding the roots of the denominator, then selecting the left-hand side, and forming the transfer function.
a concerned citizen

I wasn't sure if I said this. To make the transfer function, it's not really necessary to follow the book by making H(s)H(s), then left-hand side poles, then rational transfer function according to @A_A's formula. Mathematically, and the practical result, is that after finding the roots from 1+ϵ2R2(x) (note: x, not jω, or s), simply select the roots with the positive realparts and either positive or negative imagparts (not both). I.e. for N=4, there would be 4 pairs/8 poles; after selection you have 2 different poles. Then simply:
N(s)=iN/2|pi|2
...
a concerned citizen

(for all-pole filters), where p=σ+jω, and
N(s)=iN/2s2+|zi|2
, where z=jμ (for pole-zero filters), while the denominator:
D(s)=jN/2s2+2Re(pj)s+|pj|2
and
H(s)=N(s)D(s)
. This would be the lowpass prototype.
a concerned citizen

0

It seems that most of the participants in this discussion do not know a type of filter which may be their real solution ! Namely the Paynter filters developed by Henry M.Paynter who was a professor at MIT and partner of Philbrick Reseach. They are the best approach to "running" average filtering and treating non deterministic input signals, far better than Bessel-Thomson. I used them for physiological-medical and sonar applications. Their theories are in the January-July and July-October editions of the "Lightning Empiricist" under the general title: "New approaches for the design of Active Low Pass Filters" by Peter D. Hansen Tables are given for the poles of the 2nd, 4th and 6th order filters. I computed the same for the 8th order.


And it would seem you missed OP's point: to find the Holy Graal of mathematical formulas that can be used to calculate any filter type (or similar). :-)
a concerned citizen

0

I'll add here some notes that may be useful if someone wants to calculate the limit N of the Nth root of magnitude of a transfer function with a multiple of N poles and zeros distributed on arbitrary parametric curves. One could approximate that by using a large N and by distributing the poles and zeros uniformly over the parameter of the parametric curve. Unfortunately the approximation always has infinite error on dB scale at the locations of the poles and zeros of the realizable transfer function. In that sense a better building block is a line segment with uniform pole or zero distribution along its length. Considering just N zeros, distributed on a line segment with start point x0+y0i and end point x1+y1i:

limN|H(0)|1/N=01|(x0+y0i)(1α)+(x1+y1i)α|dα=01((x0(1α)+x1x)2+(y0(1α)+y1α)2)dα=e01log((x0(1α)+x1α)2+(y0(1α)+y1α)2)dα=e((x0y1x1y0)atan2(x0y1x1y0,x0x1+y0y1)(x0x1)2+(y0y1)21)×(x02+y02)(x1(x0x1)+y0(y0y1)+(x0x1)22((x0x1)2+(y0y1)2))×(x12+y12)(x0(x1x0)+y1(y1y0)+(x1x0)22((x1x0)2+(y1y0)2))

Some special cases need to be handled separately. If x0=0 and y0=0 we must use the limit:

=e1x12+y12

Or conversely if x1=0 and y1=0:

=e1x02+y02

Or if the line segment has zero length, x0=x1 and y0=y1, we have just a regular zero:

=x02+y02

To do the evaluation at different argument values of H(z) or H(s), simply subtract that value from the line start and end points.

What this looks like on the complex plane: Magnitude of the transfer function with a single zero
Figure 1. Magnitude of the transfer function with a single zero. 1 dB steps are indicated in turquoise and 10 dB steps in yellow.

The limit N->inf of the Nth root of magnitude of a transfer function with N zeros uniformly distributed on a line segment
Figure 2. The limit N of the Nth root of magnitude of a transfer function with N zeros uniformly distributed on a line segment. There is a crease at the line segment, but the value never goes to zero like with a regular, realizable zero. At sufficient distance this would look like a regular zero. The color code is the same as in Fig. 1.

enter image description here
Figure 3. An approximation of Fig. 2 using discrete zeros: 5th root of the magnitude of a polynomial with 5 zeros distributed uniformly on the line segment. At the location of each zero, the value is zero, because 01/5=0.

Figs. 1 and 2 were generated using this Processing sketch, with source code:

float[] dragPoints;
int dragPoint;
float dragPointBackup0, dragPointBackup1;
boolean dragging, activated;
PFont fnt;
PImage bg;
float pi = 2*acos(0.0);
int appW, appH;
float originX, originY, scale;

int numDragPoints = 2;

void setup() {
  appW = 600;
  appH = 400;
  originX = appW/2;
  originY = appH/2;
  scale = appH*7/16;
  size(600, 400);
  bg = createImage(appW, appH, RGB);
  dragging = false;
  dragPoint = -666;
  dragPoints = new float[numDragPoints*2]; 
  dragPoints[0] = originX-appW*0.125;
  dragPoints[1] = originY+appH*0.125;
  dragPoints[2] = originX+appW*0.125;
  dragPoints[3] = originY-appH*0.125;
  fnt = createFont("Arial",16,true);
  ellipseMode(RADIUS);
  activated = false;
}

void findDragPoint() {
  int cutoff = 49;
  int oldDragPoint = dragPoint;
  float dragPointD = 666666666;
  dragPoint = -666;
  for (int t = 0; t < numDragPoints; t++) {
    float d2 = (mouseX-dragPoints[t*2])*(mouseX-dragPoints[t*2]) + (mouseY-dragPoints[t*2+1])*(mouseY-dragPoints[t*2+1]);
    if (d2 <= dragPointD) {
       dragPointD = d2;
       if (dragPointD < cutoff) {
         dragPoint = t;
       }
    }
  }
  if (dragPoint != oldDragPoint) {
    loop();
  }
}

void mouseMoved() {
  if (activated) {
    if (!dragging) {
      findDragPoint();
      loop();
    }
  }
}

void mouseClicked() {
  if (dragPoint < 0) {
    activated = !activated;
    if (activated) {
      findDragPoint();      
    }
  }
  loop();
}

void mousePressed() {  
  if (dragPoint >= 0) {
    dragging = true;
    dragPointBackup0 = dragPoints[dragPoint*2];
    dragPointBackup1 = dragPoints[dragPoint*2+1];
  } else {
    dragging = false; // Not needed?
  }
  loop();
}

void mouseDragged() {
  if (!activated) {
    dragPoint = -666;
    activated = true;
    findDragPoint();
  }
  if (dragging) {
    int x = mouseX;
    int y = mouseY;
    if (x < 5) {
      x = 5;
    } else if (x >= appW - 5) {
      x = appW - 6;
    }
    if (y < 5) {
      y = 5;
    } else if (y >= appH - 5) {
      y = appH - 6;
    }
    dragPoints[dragPoint*2] = x;
    dragPoints[dragPoint*2+1] = y;
    loop();
  }  
}

void mouseReleased() {
  if (activated && dragging) {
    dragging = false;
    loop();
  }
}

float sign(float value) {
  if (value > 0) {
    return 1.0;
  } else if (value < 0) {
    return -1.0;
  } else {
    return 0;
  }
}

void draw() {
  for(int y = 0; y < appH; y++) {
    for(int x = 0; x < appW; x++) {
      float x0 = (dragPoints[0]-x)/scale;
      float y0 = (dragPoints[1]-y)/scale;
      float x1 = (dragPoints[2]-x)/scale;
      float y1 = (dragPoints[3]-y)/scale;
      float gain;
      if (x0 == x1 && y0 == y1) {
        gain = sqrt(x0*x0 + y0*y0);
      } else if (x0 == 0 && y0 == 0) {
        gain = exp(-1)*sqrt(x1*x1 + y1*y1);
      } else if (x1 == 0 && y1 == 0) {
        gain = exp(-1)*sqrt(x0*x0 + y0*y0);
      } else {
        gain = exp((x0*y1 - x1*y0)*atan2(x0*y1 - x1*y0, x0*x1 + y0*y1)/(sq(x0 - x1) + sq(y0 - y1)) - 1)*pow(x0*x0 + y0*y0, (x1*(x0 - x1) + y0*(y0 - y1) + sq(x0 - x1))/(2*(sq(x0 - x1) + sq(y0 - y1))))*pow(x1*x1 + y1*y1, (x0*(x1 - x0) + y1*(y1 - y0) + sq(x1 - x0))/(2*(sq(x1 - x0) + sq(y1 - y0))));
      }
      int intensity10 = round(log(gain)/log(10)*0x200)&0xff;
      int intensity1 = round(log(gain)/log(10)*(0x200*10))&0xff;
      bg.pixels[y*appW + x] = color(intensity10, 0xff, intensity1);
    }
  }
  image(bg, 0, 0);
  noFill();
  stroke(0, 0, 255);
  strokeWeight(1);
  line(dragPoints[0], dragPoints[1], dragPoints[2], dragPoints[3]);  

  //ellipse(originX, originY, scale, scale);  
  if (!activated) {
    textFont(fnt,16);
    fill(0, 0, 0);
    text("Click to activate",10,20);
    for (int x = 0; x < appW; x++) {
      color c = color(110*x/appW+128, 110*x/appW+128, 110*x/appW+128);
      set(x, 0, c);  
    }
    for (int y = 0; y < appH; y++) {
      color c = color(110*y/appH+128, 110*y/appH+128, 110*y/appH+128);
      set(0, y, c);  
    }
  }

  for (int u = 0; u < numDragPoints; u++) {
    stroke(0, 0, 255);
    if (dragPoint == u) {
      if (dragging) {
        fill(0, 0, 255);
        strokeWeight(3);
        ellipse(dragPoints[u*2], dragPoints[u*2+1], 5, 5);
      } else {
        noFill();
        strokeWeight(3);
        ellipse(dragPoints[u*2], dragPoints[u*2+1], 6, 6);
      }
    } else {
      //noFill();
      //strokeWeight(1);
      //ellipse(dragPoints[u*2], dragPoints[u*2+1], 6, 6);
    }
  }
  noLoop();
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.