オペアンプの動き、言葉で説明
オペアンプは、図1のような記号で書かれ、Vout には、 Vin+ と Vin- の差が ゲインG 倍されて出てきます。 Vout = (Vin+ ー - Vin-) * G 。
G は大変大きい( 100,000 倍以上)ので、
- Vin+ > Vin- のときは、Vout は + の電源電圧に張り付きます。(1)
- Vin+ < Vin- のときは、Vout は - の電源電圧に張り付きます。(2)
次に、図2の回路を考えます。 今 Vin+ を 1[v] の直流電圧に繋ぎます。
Vout は、Vin- が 1[v] より少し小さいと、(1) から、Vout が + の電源電圧に張り付こうとしますが、この時、Vout (=Vin-) が 1[v] より大きくなると、(2)から - の電源電圧に張り付こうとします。 この時 Vout(=Vin-)が 1[v] とより少し大きくなると、(1)から + の電源電圧に張り付こうとします。この時 Vout(=Vin-) が 1[v] より少し小さくなると、、、、(1[v] になる動作)
これを繰り返して、図2に回路では、Vin+ = Vin- = Vout = 1[v]に落ち着きます。
また、この時何かの拍子に(例えば、ノイズ)で、Vout が 1[v] から少しだけずれるても、(1[v] になる動作)をして、Vout = 1[v] に落ち着きます。
図3で、同様に Vin+ = 1[v], R1=R2=1K[Ω] とします。 この時、落ち着く先は、Vin+ = Vin- = 1[v] です。 よって、Vin - = Vout*R1/(R1 + R2) = Vout /2 となり、Vout = 2[v] が落ち着く先です。
このとき、何かの拍子(例えばノイズ)で、Vout が 2[v] より少し上がったとします。そうすると、Vin- も1[v] より少し上がります。Vin+(1[v] < Vin- となるので、Vout の電圧は下がる方へ動きますが、全帰還のときよりも下がる方への動きが半分になります。Vout が下がって Vin+(1[v]) > Vin- になると、Vout は、電圧が上がる方向へ動きますが、全帰還のときよりも下がる方への動きが半分になります。これを繰り返して、Vout は2[v] 近傍で安定します。
図3では、Vout(2[v]) は Vin+(1[v]) の2倍ですが、Vout のノイズの修正する大きさは、図2の全帰還の半分になっています。
まとめ
重畳保留法(overlap save method)と重畳加算法(overlap add method) とそれぞれの split block processing の帰納法的説明
畳み込みの計算をFFTを使って効率よく(計算回数を減らす)計算する方法を説明します。 畳み込み(離散畳み込み)、フーリエ変換(離散フーリエ変換:DFT)、フーリエ逆変換(離散フーリエ逆変換:IDFT)は、知っているものとします。 (以降、フーリエ変換、フーリエ逆変換という言葉を使います。)
説明は、数式処理ソフト maxima での計算例で示します。( maxima はフリーソフトです。)
畳み込み、フーリエ変換の関係式の整理
のフーリエ変換を、それぞれ とすると、フーリエ変換(左側)、フーリエ逆変換(右側)は次のようになる。
が、フィルタに入力された時の出力をとすると、 は、と の畳み込みで表される。
リアルタイムに(4)式の畳み込みを、効率よく(計算量を減らす)行える、フーリエ変換・逆変換を使う手法、重量保留法と重畳加算法を説明する。以下関係式を整理する。
(4) 式の両辺をフーリエ変換する。
(6)式の両辺をそれぞれ逆フーリエ変換する。
畳み込みをフーリエ変換、フーリエ逆変換を使って計算する
次のような4点の入力系列と、4点のフィルタ の畳み込みを行う。
数式処理ソフト maxima で使う。maxima コードの説明をしよう。フーリエ変換フーリエ逆変換を使って、入力 と フィルタ の畳み込みを行う。 と は、それぞれ4点のデータで、残りはゼロ埋めをしている。入力4点とフィルタ4点のデータを畳み込むと7点のデータとなる。maxima では、それぞれ を定義して、それぞれをフーリエ変換する。それぞれのフーリエ変換の結果を掛算し()、その結果を逆フーリエ変換(7式)すると畳み込みが求まる。(maxima コードのコメント参照)
maxima コード
N : 8; c : (2.0 * %pi / N)$; ef(kn) := cos(c*kn) - %i * sin(c*kn)$; F : matrix([ef(0), ef(0), ef(0), ef(0), ef(0), ef(0), ef(0), ef(0)], [ef(0), ef(1), ef(2), ef(3), ef(4), ef(5), ef(6), ef(7)], [ef(0), ef(2), ef(4), ef(6), ef(8), ef(10), ef(12), ef(14)], [ef(0), ef(3), ef(6), ef(9), ef(12), ef(15), ef(18), ef(21)], [ef(0), ef(4), ef(8), ef(12), ef(16), ef(20), ef(24), ef(28)], [ef(0), ef(5), ef(10), ef(15), ef(20), ef(25), ef(30), ef(35)], [ef(0), ef(6), ef(12), ef(18), ef(24), ef(30), ef(36), ef(42)], [ef(0), ef(7), ef(14), ef(21), ef(28), ef(35), ef(42), ef(49)] )$; FF : trigsimp(F)$; eg(kn) := cos(c*kn) + %i * sin(c*kn)$; I : matrix([eg(0), eg(0), eg(0), eg(0), eg(0), eg(0), eg(0), eg(0)], [eg(0), eg(1), eg(2), eg(3), eg(4), eg(5), eg(6), eg(7)], [eg(0), eg(2), eg(4), eg(6), eg(8), eg(10), eg(12), eg(14)], [eg(0), eg(3), eg(6), eg(9), eg(12), eg(15), eg(18), eg(21)], [eg(0), eg(4), eg(8), eg(12), eg(16), eg(20), eg(24), eg(28)], [eg(0), eg(5), eg(10), eg(15), eg(20), eg(25), eg(30), eg(35)], [eg(0), eg(6), eg(12), eg(18), eg(24), eg(30), eg(36), eg(42)], [eg(0), eg(7), eg(14), eg(21), eg(28), eg(35), eg(42), eg(49)] )$; II : trigsimp(I)$; x : transpose(matrix([x0, x1, x2, x3, 0, 0, 0, 0])); /* input x_n */ X : FF . x; /* X = DFT(x) */ h : transpose(matrix([h0, h1, h2, h3, 0, 0, 0, 0])); /* filter h_n */ H : FF.h; /* H = DFT(h) */ Y : H*X; /* Y = H*X */ y : ratsimp(ratsimp((II.Y)/N)); /* y = IDFT(Y) */
を、maxima は次のように出力する。
重畳保留法(overlap save method)
重畳保留法は、 を、4点づつ次のように取る。
_
_
_
_
は同じである。
それぞれの_のフーリエ変換と、 のフーリエ変換を掛け算する。 その結果の逆フーリエ変換を取り、 それぞれの の index 4 から 7 までを取って並べたものが、畳み込みになっている。maxima コードと結果を示す。結果の黄色の部分を使い、その他は捨てる。
maxima コード
/* [wxMaxima batch file version 1] [ DO NOT EDIT BY HAND! ]*/ /* [ Created with wxMaxima version 19.05.7 ] */ /* [wxMaxima: input start ] */ N : 8; c : (2.0 * %pi / N)$; ef(kn) := cos(c*kn) - %i * sin(c*kn)$; F : matrix([ef(0), ef(0), ef(0), ef(0), ef(0), ef(0), ef(0), ef(0)], [ef(0), ef(1), ef(2), ef(3), ef(4), ef(5), ef(6), ef(7)], [ef(0), ef(2), ef(4), ef(6), ef(8), ef(10), ef(12), ef(14)], [ef(0), ef(3), ef(6), ef(9), ef(12), ef(15), ef(18), ef(21)], [ef(0), ef(4), ef(8), ef(12), ef(16), ef(20), ef(24), ef(28)], [ef(0), ef(5), ef(10), ef(15), ef(20), ef(25), ef(30), ef(35)], [ef(0), ef(6), ef(12), ef(18), ef(24), ef(30), ef(36), ef(42)], [ef(0), ef(7), ef(14), ef(21), ef(28), ef(35), ef(42), ef(49)] )$; FF : trigsimp(F)$; eg(kn) := cos(c*kn) + %i * sin(c*kn)$; I : matrix([eg(0), eg(0), eg(0), eg(0), eg(0), eg(0), eg(0), eg(0)], [eg(0), eg(1), eg(2), eg(3), eg(4), eg(5), eg(6), eg(7)], [eg(0), eg(2), eg(4), eg(6), eg(8), eg(10), eg(12), eg(14)], [eg(0), eg(3), eg(6), eg(9), eg(12), eg(15), eg(18), eg(21)], [eg(0), eg(4), eg(8), eg(12), eg(16), eg(20), eg(24), eg(28)], [eg(0), eg(5), eg(10), eg(15), eg(20), eg(25), eg(30), eg(35)], [eg(0), eg(6), eg(12), eg(18), eg(24), eg(30), eg(36), eg(42)], [eg(0), eg(7), eg(14), eg(21), eg(28), eg(35), eg(42), eg(49)] )$; II : trigsimp(I)$; _x0 : transpose(matrix( [ 0, 0, 0, 0, x0, x1, x2, x3] )); /* input, a part of x_n */ _x1 : transpose(matrix( [x0, x1, x2, x3, x4, x5, x6, x7] )); _x2 : transpose(matrix( [x4, x5, x6, x7, x8, x9, x10, x11] )); _x3 : transpose(matrix( [x8, x9, x10, x11, x12, x13, x14, x15] )); X0 : FF._x0; /* X0 = DFT(_x0) */ X1 : FF._x1; X2 : FF._x2; X3 : FF._x3; /**** x0_ : ratsimp(ratsimp(( II.X0 )/N)); x1_ : ratsimp(ratsimp(( II.X1 )/N)); x2_ : ratsimp(ratsimp(( II.X2 )/N)); x3_ : ratsimp(ratsimp(( II.X3 )/N)); *****/ _h : transpose(matrix( [h0, h1,h2, h3, 0, 0, 0, 0] )); /* filter, a part of h_n */ H : FF._h; /* H = DFT(_h) */ /**** h_ : ratsimp(ratsimp((II.H)/N)); ***/ Y0 : H*X0; /* Y0 = H * X0 */ Y1 : H*X1; Y2 : H*X2; Y3 : H*X3; y0_ : ratsimp(ratsimp(( II.Y0 )/N)); /* y0_ = IDFT(Y0) */ y1_ : ratsimp(ratsimp(( II.Y1 )/N)); y2_ : ratsimp(ratsimp(( II.Y2 )/N)); y3_ : ratsimp(ratsimp(( II.Y3 )/N)); /* [wxMaxima: input end ] */ /* Old versions of Maxima abort on loading files that end in a comment. */ "Created with wxMaxima 19.05.7"$
maxima 出力
重畳保留法でフィルタ系列をブロックに分割する方法(overlap save method for split block processing)
と を次のように取る。この方法では、 も分割する。
_
_
_
_
_
_
結果は、maxima 出力と、その次の図をみてほしい。
maxima コード
/* [wxMaxima batch file version 1] [ DO NOT EDIT BY HAND! ]*/ /* [ Created with wxMaxima version 19.05.7 ] */ /* [wxMaxima: input start ] */ N : 8; c : (2.0 * %pi / N)$; ef(kn) := cos(c*kn) - %i * sin(c*kn)$; F : matrix([ef(0), ef(0), ef(0), ef(0), ef(0), ef(0), ef(0), ef(0)], [ef(0), ef(1), ef(2), ef(3), ef(4), ef(5), ef(6), ef(7)], [ef(0), ef(2), ef(4), ef(6), ef(8), ef(10), ef(12), ef(14)], [ef(0), ef(3), ef(6), ef(9), ef(12), ef(15), ef(18), ef(21)], [ef(0), ef(4), ef(8), ef(12), ef(16), ef(20), ef(24), ef(28)], [ef(0), ef(5), ef(10), ef(15), ef(20), ef(25), ef(30), ef(35)], [ef(0), ef(6), ef(12), ef(18), ef(24), ef(30), ef(36), ef(42)], [ef(0), ef(7), ef(14), ef(21), ef(28), ef(35), ef(42), ef(49)] )$; FF : trigsimp(F)$; eg(kn) := cos(c*kn) + %i * sin(c*kn)$; I : matrix([eg(0), eg(0), eg(0), eg(0), eg(0), eg(0), eg(0), eg(0)], [eg(0), eg(1), eg(2), eg(3), eg(4), eg(5), eg(6), eg(7)], [eg(0), eg(2), eg(4), eg(6), eg(8), eg(10), eg(12), eg(14)], [eg(0), eg(3), eg(6), eg(9), eg(12), eg(15), eg(18), eg(21)], [eg(0), eg(4), eg(8), eg(12), eg(16), eg(20), eg(24), eg(28)], [eg(0), eg(5), eg(10), eg(15), eg(20), eg(25), eg(30), eg(35)], [eg(0), eg(6), eg(12), eg(18), eg(24), eg(30), eg(36), eg(42)], [eg(0), eg(7), eg(14), eg(21), eg(28), eg(35), eg(42), eg(49)] )$; II : trigsimp(I)$; _x0 : transpose(matrix( [ 0, 0, 0, 0, x0, x1, x2, x3] )); /* input, a part of x_n */ _x1 : transpose(matrix( [x0, x1, x2, x3, x4, x5, x6, x7] )); _x2 : transpose(matrix( [x4, x5, x6, x7, x8, x9, x10, x11] )); _x3 : transpose(matrix( [x8, x9, x10, x11, x12, x13, x14, x15] )); X0 : FF._x0; /* X0 = DFT(_x0) */ X1 : FF._x1; X2 : FF._x2; X3 : FF._x3; /**** x0_ : ratsimp(ratsimp(( II.X0 )/N)); x1_ : ratsimp(ratsimp(( II.X1 )/N)); x2_ : ratsimp(ratsimp(( II.X2 )/N)); x3_ : ratsimp(ratsimp(( II.X3 )/N)); *****/ /* _h : transpose(matrix( [h0, h1,h2, h3, 0, 0, 0, 0] )); */ _h0 : transpose(matrix( [h0, h1, 0, 0, 0, 0, 0, 0] )); /* filter, a part of h_n */ _h1 : transpose(matrix( [h2, h3, 0, 0, 0, 0, 0, 0] )); H0 : FF._h0; /* H0 = DFT(_h0) */ H1 : FF._h1; /***** h0_ : ratsimp(ratsimp((II.H0)/N)); h1_ : ratsimp(ratsimp((II.H1)/N)); *****/ Y00 : H0*X0; /* Y00 = H0 * X0 */ Y01 : H1*X0; Y10 : H0*X1; Y11 : H1*X1; Y20 : H0*X2; Y21 : H1*X2; Y30 : H0*X3; Y31 : H1*X3; y00_ : ratsimp(ratsimp(( II.Y00 )/N)); /* y00_ = IEFT(Y00) */ y01_ : ratsimp(ratsimp(( II.Y01 )/N)); y10_ : ratsimp(ratsimp(( II.Y10 )/N)); y11_ : ratsimp(ratsimp(( II.Y11 )/N)); y20_ : ratsimp(ratsimp(( II.Y20 )/N)); y21_ : ratsimp(ratsimp(( II.Y21 )/N)); y30_ : ratsimp(ratsimp(( II.Y30 )/N)); y31_ : ratsimp(ratsimp(( II.Y31 )/N)); /* [wxMaxima: input end ] */ /* Old versions of Maxima abort on loading files that end in a comment. */ "Created with wxMaxima 19.05.7"$
maxima 出力
上記の結果を次のように加算する。 左の数字が の に対応する。 の場合は、その3行目を足せばよい。
(下の * は、掛け算を表す。)
y00_ y01_ y10_ y11_ ============================================================= 0 h0*x0 1 h0*x1 + h1*x0 2 h0*x2 + h1*x1 h2*x0 3 h0*x3 + h1*x2 h2*x1 + h3*x0 4 h2*x2 + h3*x1 h0*x4 + h1*x3 5 h2*x3 + h3*x2 h0*x5 + h1*x4 6 h0*x6 + h1*x5 h2*x4 + h3*x3 7 h0*x7 + h1*x6 h2*x5 + h3*x4 8 h2*x6 + h3*x5 9 h2*x7 + h3*x6
重畳加算法(overlap add method)
重畳加算法は、 を次のように取る。
_
_
_
_
は、
それぞれの_ のフーリエ変換と、 のフーリエ変換を掛け算する。 その結果の逆フーリエ変換を取り、隣の逆フーリエ変換の結果と加算する。maxima コードと maxima の計算結果と加算の図を次に示す。
maxima コード
/* [wxMaxima batch file version 1] [ DO NOT EDIT BY HAND! ]*/ /* [ Created with wxMaxima version 19.05.7 ] */ /* [wxMaxima: input start ] */ N : 8; c : (2.0 * %pi / N)$; ef(kn) := cos(c*kn) - %i * sin(c*kn)$; F : matrix([ef(0), ef(0), ef(0), ef(0), ef(0), ef(0), ef(0), ef(0)], [ef(0), ef(1), ef(2), ef(3), ef(4), ef(5), ef(6), ef(7)], [ef(0), ef(2), ef(4), ef(6), ef(8), ef(10), ef(12), ef(14)], [ef(0), ef(3), ef(6), ef(9), ef(12), ef(15), ef(18), ef(21)], [ef(0), ef(4), ef(8), ef(12), ef(16), ef(20), ef(24), ef(28)], [ef(0), ef(5), ef(10), ef(15), ef(20), ef(25), ef(30), ef(35)], [ef(0), ef(6), ef(12), ef(18), ef(24), ef(30), ef(36), ef(42)], [ef(0), ef(7), ef(14), ef(21), ef(28), ef(35), ef(42), ef(49)] )$; FF : trigsimp(F)$; eg(kn) := cos(c*kn) + %i * sin(c*kn)$; I : matrix([eg(0), eg(0), eg(0), eg(0), eg(0), eg(0), eg(0), eg(0)], [eg(0), eg(1), eg(2), eg(3), eg(4), eg(5), eg(6), eg(7)], [eg(0), eg(2), eg(4), eg(6), eg(8), eg(10), eg(12), eg(14)], [eg(0), eg(3), eg(6), eg(9), eg(12), eg(15), eg(18), eg(21)], [eg(0), eg(4), eg(8), eg(12), eg(16), eg(20), eg(24), eg(28)], [eg(0), eg(5), eg(10), eg(15), eg(20), eg(25), eg(30), eg(35)], [eg(0), eg(6), eg(12), eg(18), eg(24), eg(30), eg(36), eg(42)], [eg(0), eg(7), eg(14), eg(21), eg(28), eg(35), eg(42), eg(49)] )$; II : trigsimp(I)$; _x0 : transpose(matrix( [x0, x1, x2, x3, 0,0,0,0] )); /* input, a part of x_n */ _x1 : transpose(matrix( [x4, x5, x6, x7, 0,0,0,0] )); _x2 : transpose(matrix( [x8, x9, x10, x11, 0,0,0,0] )); _x3 : transpose(matrix( [x12, x13, x14, x15, 0,0,0,0] )); X0 : FF._x0; /* X0 = DFT(_x0) */ X1 : FF._x1; X2 : FF._x2; X3 : FF._x3; /**** x0_ : ratsimp(ratsimp(( II.X0 )/N)); x1_ : ratsimp(ratsimp(( II.X1 )/N)); x2_ : ratsimp(ratsimp(( II.X2 )/N)); x3_ : ratsimp(ratsimp(( II.X3 )/N)); *****/ _h : transpose(matrix( [h0, h1,h2, h3, 0, 0, 0, 0] )); /* filter h_n */ H : FF._h; /* H = DFT(h_n) */ /**** h_ : ratsimp(ratsimp((II.H)/N)); ***/ Y0 : H*X0; /* Y0 = H*X0 */ Y1 : H*X1; Y2 : H*X2; Y3 : H*X3; y0_ : ratsimp(ratsimp(( II.Y0 )/N)); /* y0_ = IDFT(Y0) */ y1_ : ratsimp(ratsimp(( II.Y1 )/N)); y2_ : ratsimp(ratsimp(( II.Y2 )/N)); y3_ : ratsimp(ratsimp(( II.Y3 )/N)); /* [wxMaxima: input end ] */ /* Old versions of Maxima abort on loading files that end in a comment. */ "Created with wxMaxima 19.05.7"$
maxima 出力
(下の * は、掛け算を表す。)
y0_ y1_ y2_ ================================================================ 0 h0*x0 1 h0*x1 + h1*x0 2 h0*x2 + h1*x1 + h2*x0 3 h0*x3 + h1*x2 + h2*x1 + h3*x0 4 h1*x3 + h2*x2 + h3*x1 h0*x4 5 h2*x3 + h3*x2 h0*x5 + h1*x4 6 h3*x3 h0*x6 + h1*x5 + h2*x4 7 0 h0*x7 + h1*x6 + h2*x5 + h3*x4 8 h1*x7 + h2*x6 + h3*x5 9 h2*x7 + h3*x6 10 h3*x7 11 0
重畳加算法でフィルタ系列をブロックに分割する方法
(overlap add method for split block processing)
を次のように分割する。
_
_
_
_
を次のように分割する。
_
_
それぞれの_ のフーリエ変換と、 のフーリエ変換を掛け算する。 その結果の逆フーリエ変換を取り、近くの逆フーリエ変換の結果と加算する。maxima コードと、maxima の計算結果と加算の図を次に示す。
maxima コード
/* [wxMaxima batch file version 1] [ DO NOT EDIT BY HAND! ]*/ /* [ Created with wxMaxima version 19.05.7 ] */ /* [wxMaxima: input start ] */ N : 8; c : (2.0 * %pi / N)$; ef(kn) := cos(c*kn) - %i * sin(c*kn)$; F : matrix([ef(0), ef(0), ef(0), ef(0), ef(0), ef(0), ef(0), ef(0)], [ef(0), ef(1), ef(2), ef(3), ef(4), ef(5), ef(6), ef(7)], [ef(0), ef(2), ef(4), ef(6), ef(8), ef(10), ef(12), ef(14)], [ef(0), ef(3), ef(6), ef(9), ef(12), ef(15), ef(18), ef(21)], [ef(0), ef(4), ef(8), ef(12), ef(16), ef(20), ef(24), ef(28)], [ef(0), ef(5), ef(10), ef(15), ef(20), ef(25), ef(30), ef(35)], [ef(0), ef(6), ef(12), ef(18), ef(24), ef(30), ef(36), ef(42)], [ef(0), ef(7), ef(14), ef(21), ef(28), ef(35), ef(42), ef(49)] )$; FF : trigsimp(F)$; eg(kn) := cos(c*kn) + %i * sin(c*kn)$; I : matrix([eg(0), eg(0), eg(0), eg(0), eg(0), eg(0), eg(0), eg(0)], [eg(0), eg(1), eg(2), eg(3), eg(4), eg(5), eg(6), eg(7)], [eg(0), eg(2), eg(4), eg(6), eg(8), eg(10), eg(12), eg(14)], [eg(0), eg(3), eg(6), eg(9), eg(12), eg(15), eg(18), eg(21)], [eg(0), eg(4), eg(8), eg(12), eg(16), eg(20), eg(24), eg(28)], [eg(0), eg(5), eg(10), eg(15), eg(20), eg(25), eg(30), eg(35)], [eg(0), eg(6), eg(12), eg(18), eg(24), eg(30), eg(36), eg(42)], [eg(0), eg(7), eg(14), eg(21), eg(28), eg(35), eg(42), eg(49)] )$; II : trigsimp(I)$; _x0 : transpose(matrix( [x0, x1, x2, x3, 0,0,0,0] )); /* input, a part of x_n */ _x1 : transpose(matrix( [x4, x5, x6, x7, 0,0,0,0] )); _x2 : transpose(matrix( [x8, x9, x10, x11, 0,0,0,0] )); _x3 : transpose(matrix( [x12, x13, x14, x15, 0,0,0,0] )); X0 : FF._x0; /* X0 = DFT(_x0) */ X1 : FF._x1; X2 : FF._x2; X3 : FF._x3; /**** x0_ : ratsimp(ratsimp(( II.X0 )/N)); x1_ : ratsimp(ratsimp(( II.X1 )/N)); x2_ : ratsimp(ratsimp(( II.X2 )/N)); x3_ : ratsimp(ratsimp(( II.X3 )/N)); *****/ /* _h : transpose(matrix( [h0, h1,h2, h3, 0, 0, 0, 0] )); */ _h0 : transpose(matrix( [h0, h1, 0, 0, 0, 0, 0, 0] )); /* filter, a part of h_n */ _h1 : transpose(matrix( [ 0, 0, h2, h3, 0, 0, 0, 0] )); H0 : FF._h0; /* H0 = DFT(_h0) */ H1 : FF._h1; /***** h0_ : ratsimp(ratsimp((II.H0)/N)); h1_ : ratsimp(ratsimp((II.H1)/N)); *****/ Y00 : H0*X0; /* Y00 = H0 * X0 */ Y01 : H1*X0; Y10 : H0*X1; Y11 : H1*X1; Y20 : H0*X2; Y21 : H1*X2; Y30 : H0*X3; Y31 : H1*X3; y00_ : ratsimp(ratsimp(( II.Y00 )/N)); /* y00_ = IDFT(Y00) */ y01_ : ratsimp(ratsimp(( II.Y01 )/N)); y10_ : ratsimp(ratsimp(( II.Y10 )/N)); y11_ : ratsimp(ratsimp(( II.Y11 )/N)); y20_ : ratsimp(ratsimp(( II.Y20 )/N)); y21_ : ratsimp(ratsimp(( II.Y21 )/N)); y30_ : ratsimp(ratsimp(( II.Y30 )/N)); y31_ : ratsimp(ratsimp(( II.Y31 )/N));
maxima 出力
(下の * は、掛け算を表す。)
y00_ y01_ y10_ y11_ y20_ ================================================================= 0 h0*x0 0 1 h0*x1 + h1*x0 0 2 h0*x2 + h1*x1 h2*x0 3 h0*x3 + h1*x2 h2*x1 + h3*x0 4 h1*x3 h2*x2 + h3*x1 h0*x4 0 5 0 h2*x3 + h3*x2 h0*x5 + h1*x4 0 6 0 h3*x3 h0*x6 + h1*x5 h2*x4 7 0 0 h0*x7 + h1*x6 h2*x5 + h3*x4 8 h1*x7 h2*x6 + h3*x5 9 0 h2*x7 + h3*x6 10 0 h3*x7 ?? 11 0 0 ??
その他
と の分割方法は他にもある。
定点観測 5月21日 今日のコロナ君
明日から、第2波までお休み。
全国と感染数上位8都道府県の、新規感染者数と累計感染者数を、地図の北から表示しています。 都道府県別新型コロナウイルス感染者数マップ Coronavirus COVID-19 Japan Case (2019-nCoV) の CSV データを使っています。
定点観測 5月20日 今日のコロナ君
全国と感染数上位8都道府県の、新規感染者数と累計感染者数を、地図の北から表示しています。 都道府県別新型コロナウイルス感染者数マップ Coronavirus COVID-19 Japan Case (2019-nCoV) の CSV データを使っています。
定点観測 5月19日 今日のコロナ君
全国と感染数上位8都道府県の、新規感染者数と累計感染者数を、地図の北から表示しています。 都道府県別新型コロナウイルス感染者数マップ Coronavirus COVID-19 Japan Case (2019-nCoV) の CSV データを使っています。
定点観測 5月18日 今日のコロナ君
全国と感染数上位8都道府県の、新規感染者数と累計感染者数を、地図の北から表示しています。 都道府県別新型コロナウイルス感染者数マップ Coronavirus COVID-19 Japan Case (2019-nCoV) の CSV データを使っています。