デルタ・シグマ

世の中、スマホ・バッテリィー劣化推進アプリ が狂ったように流行してますなあ。 そんなのオイラーにゃ、関係ねぇぞ。

オイラーはカメラの趣味は無いけど、ニコンがやってるカメラ博物館の訪問報告を 興味深く読んだ。 日本のものづくりとカメラの歴史がわかる! ニコンミュージアムに行ってきた

ニコンって、日光 から、言葉を頂いて付けたって初めて知った。プチ物知りになった 気分。最初、レンズを作っていたのね、それからボディも作るようになったとな。

特殊カメラの部類になる、菊門を突破するカメラとか胃カメラって、どのメーカーの発明だったかな? 昔、開発 物語を読んだ記憶が有るんだけど、すっかり記憶が蒸発しちゃってる。 それから、盗撮用特殊カメラってやっていないんですかね?

そこらの変態なにーちゃんが使うような物ではなく、CIAとかMI5とかKGBとかモサドや モナドとかディーク東郷が使う ような、プロ仕様のやつ。多分やってるだろうけど、そういうの、堂々と博物館に 展示する訳にはいかないな。

ああ、そういう危ないカメラは連中が直接依頼する事はあるまい。prxyな人を5人ぐらい 介してtorするような依頼方法を取るだろね。多分、そういうのは禁制品。ココムに 引っかかるようなヤバイ技術の塊だろうから、足が付かないように細心の注意が払われて いるに違いないな。

開発終了したら、開発部隊は、5年間某所に拉致されて 秘密が洩れないようになってるのかな。闇夜でも写るんですってどの軍隊も 欲しいだろうからね。闇夜でも写る技術はCCDだけでは完成しないだろう。チェレメンコ 発光だかを捉えて、ノーベル物理学賞を頂いた、浜松フォトニクスだかの光粒子倍増菅の 技術と 連携させてるに違いない。世界が欲しがる日本の技術ですよ。

オイラーにカメラの趣味は無いと書いたけど、海外出張をしてた頃は、簡単カメラを 持って行ってたなあ。勿論液晶じゃなくて、フィルム式のやつ。レンズカバーが無くて おおいをスライドすると、すぐに撮影出来るお手軽バージョン。

最初の海外の時は、めずらしくてパチパチ撮りまくっていたな。暗い所でフィラッシュ 禁止みたいな教会とかだと、現像しても何が映っているか不鮮明。

同僚のカメラ好きに聞いたら、そういう時は、フィルム感度が高いのを使うといいよ って教えられ、AS400だかを常用してた。

出張から帰ってくると、土産の酒を供出して、帰国報告会を内輪でやるんだけど、 それに間に合うように、必死こいて現像・焼付けしてもらった。

で、何枚も撮った写真の中に、傑作と呼べる1枚が混じっていたらしい。同僚が 絶賛してくれた。雨上がりで傘をさそうか止めようか迷っている、金髪の女の子 (推定5歳)が、振り返った瞬間を撮ったもの。

構図といいピント具合といい、最高だと、お褒めの言葉を頂いた。本人は狙って 撮ったものはないので、余り印象には残っていない。

でも、言われてみれば、傑作かなあと思えるようになった。後にも先にも、 あれだけですねぇ。遠い過去の思い出でした。

MOS FET

前回は、雷様駆動っつう事で、トランスをスイッチングするのにトランジスタを想定 してたんだけど、 MOS FET なんてのを見ると、時代はトランジスタよりもPowerMOSに移りつつあるようだ。 浦島太郎状態である。 SiCとかSiN とかで作られたMOSが幅を利かせる時代ってのは、未来の事なのかな。

取りあえず、 J-FET,MOS-FETを詳しく解説MOS-FETによるスイッチング とか DC-DCコンバータに良く効くMOS をミロ。

試してガッテン系の総本山(電気・電子系)なら、CQ出版のトラ技って定番が有るな 。忘れてもらっては困りますがなと言われたので、 パワーデバイスSW駆動テクニック あたりだな。まとめ読みCDを昔は見てたんだけどな。

これで、現代に追いついた? 後は、石の特性から適当にmodelを選んできて、回路に 落とし込めばいいのだな。

delta sigma converter

そろをろ雷様の秋田んでと思ってたら、 デルタ・シグマなんて言葉が目の前を過ぎった。、 デルタシグマって、デルタスターと親戚? なにせオイラーは浦島太郎ですからね。 三相交流の結線方式でも勉強して電検でも受験するのかと思ったら、さにあらず。

日本人による発明であるアナログをデジタルに変換する方式である。xspiceのサンプルを 見ていたら出ていたので、やってみる次第。

それに先立って、変換方式にはどんなものがあるか復習しておく。 AD converter が、網羅的でよかった。

最近話題のハイレゾ・オーディオは、ほぼこのデルタシグマ方式一択と言ってよいだろう。 各社からICも発売されているし、大学の卒業研究でもICを作る時代ですからね。 デルタシグマ変調器の設計と評価

勿論、LTSPICEで解析されている方がおられた。 デルタシグマ A/D 変換 (ltspice)

他にも、 ΔΣ(デルタ・シグマ)型ADコンバータ とか、 デルタシグマDACの動作原理 なんてのが多数見つかる。

少し詳しいΔΣ変調② 始めにΔ変調ありき

C言語でデルタシグマ

探したら、旨い具合に fftwでいろいろ実験 がヒットしてきたので、有り難く利用させて頂く。

入力範囲が、 -1.0 to 1.0 の信号をデルタシグマ変換する。

#include <stdio.h>

int     main(int argc, char *argv[])
{
  int    out=0;
  double in, delta, sigma=0;

  while (scanf("%lf", &in) != EOF) {
    delta = in - out;
    sigma += delta;
    out = (sigma > 0) ? 1 : -1;
    printf("%d\n",out);
  }
  return 0;
}

このプログラムをds1とすると(原本では、outが初期化されていないため、正常に動かなかったので、 プチ修正した)

sakae@ub:~/fftw3$ ./dds 1000 | ./ds1 | head -2000 | gnuplot gp_wav > z.png
sakae@ub:~/fftw3$ gpicview z.png

これで、変換後の波形を確認出来る。と言っても、0か1かのデジタル値でしか ないので、見ても興味は沸かないだろう。

そこで、そのデジタル値の列をFFTして周波数領域へ持って行ってみる。 また、デルタシグマ変換をかけない、DDSから出た生アナログ波形もFFTしてみる。 両者のFFTの画面を眺めてみると、ちゃんと基本波が乗っているでは ないか。

似ても似つかない波形のくせに、同じ波形を表している。これは面白いな。

sakae@ub:~/fftw3$ ./dds 1000 | ./ds1 | ./fftw | gnuplot gp_fft > z.png
sakae@ub:~/fftw3$ ./dds 1000 | ./fftw | gnuplot gp_fft > y.png

上記はウブでの実験なんだけど、FreeBSDでも確認しとく。fftw3はMIT製なんで、きっと パッケージになってるはず。

$ pkg search fftw3
fftw3-3.3.3_2                  Fast C routines to compute the Discrete Fourier Transform
fftw3-float-3.3.3_2            Fast Discrete Fourier Transform (Single Precision C Routines)
fftw3-long-3.3.3_2             Fast Discrete Fourier Transform (Long Double Precision C Routines)
fftw3-quad-3.3.3_2             Fast Discrete Fourier Transform (Quad Precision C Routines)
rubygem-fftw3-0.3              Ruby interface to the FFTW ver.3

精度違いの版が色々用意されてるなあ。でも、デフォのダブルで十分な気がするので 素直にfftw3-3.3.3_2を入れた。

pngのビューアーは、昔懐かしいxvを入れたよ。パッケージに有って良かったねってなもんだ。 付属のhelpを見たら、しっかりキーバインドの説明が載ってた。マウスも使えるようには なってるけど、キーボード主体で操作するって言う、古色蒼然としたアプリです。

最近の若者の、跳ね上げるだとか摘むだとかのゼスチャー系操作に慣れた人には、いかにも 古いと思われるな。レトロアプリ。

mod1-ct-test.cir

xspiceに付属のデルタシグマを試して見る。count-latch-dac.cirとmod-ct.cirの2つが 孫ボード。後は孫ボードの評価系が2つと、本番のdelta-sigma-1.cirが付属。

このうちの本命、mod-ct.cirをテストするアプリを実行してみる。暫く走って、結果が 3枚のグラフになって出てきた。元データを保存しておきたいなあ。

やってみると、そんなベクターは無いとか言われる。今参照で切るベクターは、displayで 確認出来るんだけど、指定したベクターが無かった。

ngspice 209 -> display
Here are the vectors currently active:

Title: * first-order delta sigma modulator
Name: sp2 (Spectrum)
Date: Sat Jul 30 05:16:29  2016

    frequency           : frequency, real, 262145 long [default scale]
    xmod.adffq          : notype, complex, 262145 long

ngspiceは、今どんな設定で動いているか? setってコマンドで確認出来るようだ。 (変数に設定するコマンドとばかり、思っていたぞ)

ngspice 210 -> set
  brief
* curplot       sp2
* curplotdate   Sat Jul 30 05:16:29  2016
* curplotname   Spectrum
* curplottitle  * first-order delta sigma modulator
  height        1E+09
  history       10000
  noaskquit
  noglob
  nomoremode
* plots ( const tran1 tran2 sp2 )
  program       ngspice
  prompt        ngspice ! ->
  sourcepath    ( . /usr/local/share/ngspice/scripts )
  width 132
  x11lineararcs

頭にスターマークが付いているのは、起動後変更された状態だなと、emacsの某画面を 連想したよ。で、よく見ると、plotのための切り替えが付いているようだ。プログラムの 進行によって、グラフがどんどん表示されて行くけど、それに要したベクターも 切り替わるのね。

で、グラフに応じた場面に切り替えてみる。

ngspice 211 -> setplot tran2
ngspice 212 -> display
Here are the vectors currently active:

Title: * first-order delta sigma modulator
Name: tran2 (Transient Analysis (linearized))
Date: Sat Jul 30 05:13:45  2016

    time                : time, real, 500001 long [default scale]
    xmod.adffq          : voltage, real, 500001 long

余りベクターが見えないじゃん。

* modulator integrator out, digital out
plot xmod.outintp-xmod.outintn xmod.adffq xlimit 0.140m 0.148m

これを表示するための舞台なのね。それじゃ、一番最初の場面に移ってみる。

ngspice 213 -> setplot tran1
ngspice 214 -> display
Here are the vectors currently active:

Title: * first-order delta sigma modulator
Name: tran1 (Transient Analysis)
Date: Sat Jul 30 05:13:45  2016

    in+                 : voltage, real, 1706268 long
    in-                 : voltage, real, 1706268 long
    time                : time, real, 1706268 long [default scale]
    xmod.adffq          : voltage, real, 1706268 long
    xmod.outintn        : voltage, real, 1706268 long
    xmod.outintp        : voltage, real, 1706268 long

これが一番最初のグラフを作るための舞台裏って事だな。やっとマニュアルの言わんと してる事が理解出来たよ。

ngspice界からunix界へ

ngspiceのprintで出力されるものには、冒頭に余計なヘッダーが付いていて、unixの パイプに流すにはちょっと都合が悪い。(ご丁寧な事に、データ取得日まで入っている)

何とか、このヘッダーを取り除いて、かつ必要なデータだけを流したい。 こういう場合は、awkの出番だな。

$ awk 'NR>5 { print $3 }' int.txt | head -4096 | fftw | gfft > z.png
$ awk 'NR>5 { print $3 }' int.txt | head -10000 | gwav > y.png

種の int.txtは、

  :
Index   time            xmod.outintp-xm
-----------------------------------------------------------------------
0       0.000000e+00    0.000000e+00
1       1.000000e-10    3.999965e-04
2       2.000000e-10    7.999935e-04
3       4.000000e-10    1.599988e-03
:

細かすぎる分解能だなあ。また、コメントになってる行を生かすと、イベントログを 取得出来る。

eprint dv dclk > digi1.txt
sakae@ub:~/examples/xspice/delta-sigma$ wc digi1.txt
  72683  218020 2107473 digi1.txt

sakae@ub:~/examples/xspice/delta-sigma$ cat digi1.txt
**** Results Data ****

Time or Step
dv
dclk

0.000000000e+00     0s    0s
1.024000000e-07     0s    1s
1.044000000e-07     1s    1s
2.044000000e-07     1s    0s
3.024000000e-07     1s    1s
3.044000000e-07     0s    1s
4.044000000e-07     0s    0s
5.024000000e-07     0s    1s
5.044000000e-07     1s    1s
6.044000000e-07     1s    0s
7.024000000e-07     1s    1s
7.044000000e-07     0s    1s
8.044000000e-07     0s    0s
  :

パイプで思い出した。パイプの終端でpngファイルを作成してるけど、それを止めて、 表示機に直結出来ないかな? ウブに入れた、gpicviewだと

sakae@ub:~/fftw3$ cat z.png | gpicview

で、表示出来た。同じ事をxvでやってみたら、xvのクレジット画面が表示されるだけだった。 何かオプションを付けると動くのかな? 某ソフトのあれを思い出して

$ cat a.png | xv -

で、いけた。fehなんて言うviewerも軽くてよさそう。

デルタシグマ観賞

折角ngspice用のコードが有るので、眺めてみる。まずは上でやったもの。 コメントがしっかり入っているので、迷う事は無い。

変換する信号は、13kHzで振幅0.3Vのサイン波。これを5MHzでサンプリングする。200nSの 時間間隔って事だな。シュミレーション時間は5msの、まあ微小な時間だ。この時間を 10nS毎に計算してる。膨大な計算量。最近TOP500で、中国のスパコンが一位になったけど、 オイラー、あれ欲しい。

孫ボードとのインターフェースは

Xmod in+ in- dclk dv dvb mod1

と言う事なので、孫ボードの配線(mod1-ct.cir)を見ておく。

アナログ入力は、豪華に差動入力になってます。dclkってのがサンプリングクロック。 dv及びdvbは、アナログコンパレータの出力をDタイプのFFでラッチ(サンプリング)した、 Q及び、その反転出力(ngspice風に書くと ~Q かな)になる。

* integrator and summer
Ri1 ainn inintn 500
Rf1 adffq inintn 500
Cint1 outintp inintn 1n
.IC v(outintp) = 0 v(inintp) = 0
*
Rshunt1 outintp 0 100Meg
Rshunt2 initn 0 100Meg

2入力の加算器と帰還回路がCになってる(全体で)積分器。Rshuntは、DC的に 閉回路が出来るように入れたダミー抵抗。 同様なのがもう一回路ある。 それらの回路が、オペアンプ相当につながって、デルタシグマ完成。ああ、オペアンプは 2回路分有るんだな。

aint %vd(inintp inintn) %vd(outintp outintn) amp
.model amp gain ( in_offset =0.0 gain =100000
+ out_offset = 0)

次は、コンパレータとD-FFか。

* latched comparator (code model or B source, analog in, digital out)
BComp acompout 0 V = (V(outintp) - V(outintn)) >= 0 ? 1 : -1

abridge2 [acompout] [dcompout] adc_buff
.model adc_buff adc_bridge(in_low = 0 in_high = 0)
*
* D flip flop: data clk set reset out nout
adff1 dcompout dclk ds drs ddffq ddffqb flop2
.model flop2 d_dff(clk_delay = 1e-9 set_delay = 1.0e-9 reset_delay = 1.0e-9 ic = 0 rise_delay = 1.0e-9 fall_delay = 1e-9)

abridge1 [ddffq ddffqb dclk] [adffq adffqb aclk] dac1
.model dac1 dac_bridge(out_low = -1 out_high = 1 out_undef = 0 input_load = 5.0e-12

アナログ世界とデジタル世界を橋渡しするブリッジが入っていて、ちょっとごちゃごちゃ してるけど、コンパレータの出力がD入力に入って、サンプリングされてる事と Q出力が、アナログ世界に引き戻されて、デルタ回路に戻ってる事を知れば十分だ。

例には、もう一つ孫ボードが付属してた。count-latch-dac.cir 欲張りで3つの機能が 内蔵されてた。10Bitのカウンター、ラッチ回路、そしてそれらの出力をD/A変換して アナログ値で、カウント具合を知らせてくれる回路。ロジックアナライザーだと、10本の タイミングチャートで表示すべきなんだろうけど、そんな事されたって眩暈がするだけ なんで、こういう機能は、有り難い。

カウンターはJK-FFとandゲートの寄せ集め。リセット機能付き。ラッチ回路はD-FFで構成して有る 普通のやつ。特に見所は無い。興味有るのは、D/Aコンバーターの作り方。

** emulation of 10 bit DAC
.subckt dac10  din1 din2 din3 din4 din5 din6 din7 din8 din9 din10 aout
.param vref=1
abridge1 [din1 din2 din3 din4 din5 din6 din7 din8 din9 din10]
+ [ain1 ain2 ain3 ain4 ain5 ain6 ain7 ain8 ain9 ain10] dac1
BVout aout 0 V = 'vref'*(v(ain10)/2 + v(ain9)/4 + v(ain8)/8 + v(ain7)/16 + v(ain6)/32 +
+ v(ain5)/64 + v(ain4)/128 + v(ain3)/256 + v(ain2)/512 + v(ain1)/1024)

.model dac1 dac_bridge(out_low = 0 out_high = 1 out_undef = 0.5
+ input_load = 5.0e-12 t_rise = 1e-9 t_fall = 1e-9)

10Bit分のデジタル値をブリッジで、アナログ値に変換する。そのアナログ値を重み付けして、 足し算したものが、変換出力だよとな。din10がMSBで、din1がLSBに対応してる。

これら2つの孫ボードを組み合わせて、製品版のデルタシグマコンバーターになってる。 delta-sigma-1.cir がそれだ。1が付いているのは、1次の変換、デルタシグマを1回だけ やるって意味。どこかのメーカーが売ってるやつは、3回ぐらい変換を繰り返して、高性能化を 実現してる。

製品版で眼を引くのは、

** sample clock cycles
.param samples=500

が、新規で追加されてる事。この使い方を追ってみると、

* digital divider dclk/samples
adivn dclk ddivn divider
.model divider d_fdiv(div_factor = 'samples' high_cycles = 1
+ i_count = 0 rise_delay = 1e-9 fall_delay = 1e-9)

* clock delays
adelay ddivn ddivndel1 buff1 ; set latch
adelay2 ddivndel1 ddivndel2 buff1 ; reset counter
.model buff1 d_buffer(rise_delay = '1/clkfreq/8' fall_delay = '1/clkfreq/8'
+ input_load = 0.5e-12)

サンプリングクロックを500発数えて、ラッチ信号とカウンターのリセット信号を作って いる事。このラッチ信号とかで、デルタシグマから出て来る、ストリーム信号を、10Bit分に まとめている。

すなわち、シリアルーパラレル変換してるって事だ。これを気取って、デシメーションとか 言うらしい。これで、おおまかなデルタシグマは解ったな。

xspiceでアナログ回路とロジック回路が融合したので、手軽に最先端のシュミレーションが 出来るな。嬉しい事です。

etc

時系列分析入門~季節調整モデル編~ RとPythonで実装

時系列解析

プログラムでデジタルフィルタ

ham radio

https://www.renesas.com/ja-jp/doc/products/mpumcu/apn/003/rjj05b0899_splug.pdf