TNJ-053:LTspice でやってみるデジタル・フィルタ解析(後編)ΣΔADC でのsinc フィルタってホントにsinc?
はじめに
前回の技術ノートではLTspiceを使って平均化フィルタについて考えてみました。平均化フィルタはsinc フィルタになることがご理解いただけたかと思いますし、LTspice での怪しい(?)テクニックもご高覧いただけたものかと思います。
今回はここまでの理解と怪しいLTspice テクニックをツールとして、実際のΣΔADC で用いられているsinc フィルタについて解析していきたいと思います。
ΣΔADC で用いられているフィルタ形状は、回路構成としては「平均化フィルタ」には見えないものなのですが、これがsinc フィルタになる理由や、サンプリング定理から考えてちょっと不思議に思われる話題などを掘り下げてみたいと思います。
ΣΔ変調器のADC を取り上げる
アナログ・デバイセズでは、「実際のΣΔADC」としてAD 変換した結果を出力するADC以外に、iCoupler®技術(デジタル・アイソレータ技術)を用いて直流をアイソレーションしたうえで、AD変換結果をΣΔ変調器のビット・ストリーム出力として、そのまま吐き出す「ΣΔ変調器」という派生製品があります。
一例とすると、
…
AD7402:シグマ・デルタ変調器、16 ビット、絶縁型
http://www.analog.com/jp/ad7402
【概要】
AD7402 は、アナログ入力信号を高速の1 ビット・データストリームに変換する高性能、2 次のΣΔ変調器で、アナログ・デバイセズのiCoupler®技術を用いたデジタル絶縁機能を内蔵しています。AD7402 は、4.5 V~5.5 V(VDD1)電源で動作し、±250mV(フルスケール±320 mV)の差動入力信号に対応します。差動入力はガルバニック絶縁が要求される高電圧アプリケーションでのシャント電圧モニタリングに適しています。
アナログ入力は高精度アナログ変調器によって連続的にサンプリングされ、データレート10 MHz の0 と1 のコード密度としてデジタル出力ストリームに変換されます。元の情報は、適切なデジタル・フィルタによって再構築され、39 kSPS で87 dB のS/N 比(SNR)を達成することができます。
(後略)
…
が挙げられます。データシートに記載のあるブロック図を図1に示します。初段部分にΣ-ΔADCとは書かれていますが、ここは単なるΣΔ変調器であり、AD7402 の出力はビット・ストリームが出ています。なおトランスで分離されているイメージがデジタル・アイソレータであることを示しています。

このAD7402 の出力は、その後段に配置するFPGA などを用いたデジタル・フィルタで、本来のデジタル値(16 ビットとか24ビット)でフィルタリング操作がおこなわれ、そのフィルタ出力として実際のAD変換結果が得られます。
「単なるΣΔ変調器のビット・ストリーム…。ん?ビット?ストリーム?」という点は、別に難しいことを考える必要はなく、ΣΔ変調器から出てくる情報が1 ビット情報であり、これを「ビット・ストリーム」と呼ぶだけの話しです。アナログ的に考えれば、このビット・ストリームをアナログLPF でフィルタしたときに得られる直流電圧がAD 変換結果です。つまり「ビット・ストリームの電圧平均値がAD 変換結果だ」という理解で十分です。
これをデジタル的に行うものがデジタル・フィルタという話しなだけなのです。
AD7402 のデータシートに記述のあるsinc3 フィルタ
さてAD7402 のデータシートには、上記に説明したデジタル・フィルタの回路例(RTL; Register Transfer Level 言語)が掲載されています。この回路(RTL)は「sinc3」つまりsinc フィルタが3 段従属接続されたフィルタになってるのですが、「ホントにsinc フィルタなのかいな?」と思わせる構造のものなのです。
それこそ私もアナログ・デバイセズに入社したころは、もともとRFエンジニアだったこともあり、「ホントかいな?」と思ったものでした(笑)。またこの回路には、以降に示すような疑問もあり、どうもうまく自己解決できなかったのでした。
それでは、その回路構成について考えてみましょう。ちなみに私はVHDL 言語人なので、Verilog は今ひとつよく判らずなのでした…(汗)。



初段のアキュムレータ・ブロック
図2はsinc3デジタル・フィルタ初段の部分のRTLです。Z変換のブロックで表記したもの(データシート抜粋)も図3に示します。mclk1(図中では太字表記)がシステム・クロック(ΣΔ変調器の動作クロック)で、各段ごとにフィードバックされ、それぞれ各37ビット(この幅にRTL内で指定されています)のレジスタに累積されていきます。「acc1 <= acc1 + ip_data1」という記述からも分かります。
図中のコメントある「Accumulator」は累積という意味です。累積は「積」という漢字が用いられていますが、掛け算するわけではなく、足し算が積み重なるという意味です。累積という操作は「積分」操作でもあり、図2のRTLでもコメントに「Integrator」と記載が見えます。
またそれぞれの経路が各37ビットとなっていますが、その源となる図2のip_data1(図中では太字表記)のさらにその源は、図4のようにΣΔ変調器からの入力信号である1ビットのビット・ストリーム(mdata1)を37ビット(ip_data1)にビット拡張したものです。
後段のディファレンシエータ・ブロック
図2の「acc3」、図3のACC3+出力は、後段のディファレンシエータ・ブロックの入力になります。ディファレンシエータ・ブロックのRTLを図5に示します。図中の「Differentiator」とは微分とか差異という意味です。この回路の入力にはアキュムレータ・ブロックの出力(acc3)がつながっていることも確認できます。これをZ変換のブロックで表記したものを図6に示します。
この回路(図5)をよくみてみると、図2ではmclk1がシステム・クロックであったものが、この図5ではword_clk(図中では太字表記)がシステム・クロックになっています(図6ではWORD_CLK)。
このディファレンシエータ・ブロックは、mclk1が分周されたクロック速度、もっとデジタル信号処理的にいうと「デシメート(間引き)された」クロックで動作しているのです…。つまりword_clkのレートで1遅延(𝑧−1)とすると、デシメートされた分(これを「デシメーション・レート」𝐷𝑅とします) とします) とします) とします) とします) 、 𝐷𝑅分で遅延(𝑧−𝐷𝑅)されていることになります。
後段のディファレンシエータ・ブロックのクロック生成
このword_clkがどう生成されているかを、あらためてRTLで見てみると、図7、図8の構成になっています。
図7はカウンタを構成するブロックで、word_countという16ビットのカウンタがmclk1のレート(ΣΔ変調器の動作クロック)でカウント・アップし、dec_rate(デシメーション・レート𝐷𝑅)の設定値と同じカウント数でword_countがカウントを繰り返すことになります。
つづいて図8のword_clkを見てみましょう。このRTLから、word_countの1周に同期してword_clkが生成されています。
話しを戻すと、これが図5、図6のディファレンシエータ・ブロックのクロックになります。




デシメートという用語を辞書で引いてみると
このRTLを見て個人的には、「word_clkを作ることなく、ディファレンシエータ・ブロックもmclk1をシステム・クロックとして、一方でword_countでストローブ・パルスを作って、それで完全同期回路として動かしたいなあ」とか余計な想いを巡らせてしまいました…。
まあ、それは良しとして、「しかしこの『デシメート』という言葉は一体どういう意味だったのか?」と今更ながらふと思い、辞書を引いてみました…。辞書はTNJ-036でも紹介した、アナログ・デバイセズ入社時に購入した、Oxford Advanced Learner’s Dictionary 7th Edition(オックスフォード現代英英辞典[第7版][1])です。
そこに現れた言葉は…、
- [usually passive] to kill large numbers of animals, plants or people in a particular area.
- [informal] to severely damage something or make something weaker.
これ(上の1の部分)を訳してみると「ある特定の地域に存在する動物、植物や人間を多数殺す」なんて恐ろしい意味が掲載されています…。デシメートというと、日本語的には「間引く」ということで、多数生えた植物の一部を間引くとか、多数生(な)った果実の実を摘果するとかいうふうにとらえますが、結構恐ろしい意味なのですね…(汗)。

この回路の構成
気を取り直して…。もとの話題に戻りましょう(汗)。
おのおの同じ回路が3段直列に接続されている
図3、図6から分かることは、おのおの同じ回路が3段直列に接続されているということです。全体をひとつのZ変換の式で書いてみると、
と表すことができます。ここで𝐻𝐴(𝑧)はアキュムレータ・ブロックのひとつの回路、𝐻𝐷(𝑧)はディファレンシエータ・ブロックのひとつの回路です。
アキュムレータ・ブロックのひとつの回路だけを考える
ここでアキュムレータ・ブロックのひとつの回路𝐻𝐴(𝑧)だけを考えてみます。アキュムレータ・ブロックに相当するデジタル・フィルタの構造は、図9に記載する無限インパルス応答(Infinite Impulse Response; IIR)フィルタになります。入力・出力それぞれの𝑛番目の サンプルを𝑥(𝑛),𝑦(𝑛)とすると
これをZ変換で表すと、
𝑦(𝑛−1)が1サンプル過去になりますから、𝑧−1𝑌(𝑧)となりま す。こ から 伝達関数 𝐻𝐴(𝑧)を求めると 、
となります。
データシートの図のアキュムレータ・ブロックは標準のIIRフィルタとは異なっている
ところで気が付かれた方もいらっしゃるかと思いますが、この図9や式(2)~式(5)と、図2/図3の表記は同じではありません。この図2/図3の表記は、式(2)的には
というような感じで表されるものです。式の右辺は同じですが、左辺で得られるサンプルが1サンプル古いものです。
とはいえこの遅延は、結局𝐻𝐴(𝑧) のひとつの回路内で吸収される事象なので、デジタル・フィルタの実動作としては問題ありません。
ディファレンシエータ・ブロックのひとつの回路だけを考える
つづいてディファレンシエータ・ブロックのひとつの回路𝑋𝐷(𝑧)だけを考えると
となります。𝐷𝑅はデシメーション・レート(間引き率)です。これをZ変換で伝達関数として表すと
となります。
𝑯𝑨(𝒛)と𝑯𝑫(𝒛)をひとつ ずつ従属接続したものはsincフィルタになっている
これらの検討により、アキュムレータ・ブロックのひとつの回路𝐻𝐴(𝑧)とディファレンシエータ・ブロックのひとつの回路𝐻𝐷(𝑧)を従属接続したものは
として伝達関数で表されることが分かります。
この式が単純な多項式になるように、分子を分母で割ってみます。計算の見切りが良くなるように、𝐷𝑅=4とし て定数にとし て定数にとし て定数にとし て定数にとし て定数にとし て定数にとし て定数にてみます。 さらに 次数を降順しておくと、
さて、それではやってみましょう。
ちゃんと割り切れるのですね…。つまり
となり、な、なんと…、ひとつ前のTNJ-052の図5の平均化フィルタ(sincフィルタ)そのものになっていることが分かります。これを図で描くと図10のようになります。ということで、アキュムレータ・ブロックのひとつの回路とディファレンシエータ・ブロックのひとつの回路を従属接続したものは、sincフィルタになっていることが分かりました!
LTspiceでシミュレーションしてみる
図10の上の回路をLTspiceで作ってシミュレーションしてみました。シミュレーション回路を図11に示します。上がアキュムレータ・ブロックで、下がディファレンシエータ・ブロックです。アキュムレータ・ブロックは連続時間系でのシミュレーションなので、数値が飽和しないように0.999倍としてあります。
この回路で、𝐻𝐴(𝑧),𝐻𝐷(𝑧),𝐻𝐴𝐷(𝑧)をシミュレーションしてみます。
アキュムレータ・ブロック𝐻𝐴(𝑧)のシミュレーション結果を図12に示します。数値が大きくなるので縦軸は対数表示にしてあります。図13はディファレンシエータ・ブロック𝐻𝐷(𝑧)のシミュレーション結果です。
![図10. 𝐻𝐴(𝑧)𝐻𝐷(𝑧)は平均化(sinc)フィルタになる [上:𝐻𝐴(𝑧)𝐻𝐷(𝑧)をひとつずつ従属接続したもの。 下:平均化(sinc)フィルタ]](/jp/_/media/analog/jp/education/web-lab/tnj053/tnj053_10.jpg?h=353&w=450&rev=d0326ca8cbdd40f6b9665b400c275e1a)
続いて図 14は、全体[𝐻𝐴𝐷(𝑧)=𝐻𝐴(𝑧)∙𝐻𝐷(𝑧)]のシミュレーション結果です(というより、グラフ機能で𝐻𝐴(𝑧)∙𝐻𝐷(𝑧)を計算させたものです)。 sinc関数になっていることが分かります。なお 0Hz, 1Hzのところで数値がゼロになっていますが、 sinc(𝑥)=sin(𝑥)/𝑥であり、𝑥=0とした場合、本来はsinc(0)=1になります。




sincフィルタを3段接続することでsinc3フィルタになる
式(2) ~ 式(9)で示したように、sincフィルタはアキュムレータ・ブロックのひとつの回路𝐻𝐴(𝑧)と、ディファレンシエータ・ブロックのひとつの回路𝐻𝐷(𝑧)を従属接続したもので、
一方で式(1)で表されたAD7402のsinc3フィルタは
でしたが、この並べる順番を変えれば、
として、sincフィルタが3段従属接続された回路になっていることが分かります。
Cascaded Integrator Comb (CIC)フィルタとも呼ばれる
このフィルタ形状は、Cascaded Integrator Comb (CIC) Filterとも呼ばれるものです。デジタル信号処理を習い始めたころ勉強した書籍[2]にCIC filterの説明があり、「なるほど」とは思っていたのですが、sincフィルタとCICフィルタが同じ特性(同じもの)だと分かった、気が付いたのは、アナログ・デバイセズに入社してからだいぶ経ったころだったのでした…。
この部分でデシメートしてよいものか
その、アナログ・デバイセズに入社したころ、このAD740xシリーズのデータシートを初めて見ることとなりました。VHDLは知っていたため、ここで紹介したVerilogのコードもある程度は読めたので、またそこにブロック図の記載もあったので、その動作を追うことができました。


最初にお話ししたとおり、もともとRFエンジニアだったこともあり、そのときは、「これでホントにsincフィルタなのかいな?」と思ったものでした(このことは上記の検討で解決できたわけですが)。そしてさらに、以降に示すような別の疑問も生じてきたのでした。
ディファレンシエータ・ブロックはクロック分周で簡素化されている
先に示したように、ディファレンシエータ・ブロックでは、図7や図8のように、もともとのシステム・クロックmclk1(これはイコールΣΔ変調器の動作クロック、ビット・ストリームのレートでもあります)をdec_rate(デシメーション・レート𝐷𝑅)だけ分周(間引き)した、このブロック用のクロックword_clkが使われます。
このクロックword_clk(ここまでの例では𝐷𝑅=4で 1/4に分周したもの)により、図15のように、4遅延(𝑧−4)の遅延系の構成を1遅延(𝑧−1)に縮小できます。シフト・レジスタの段数を減らして簡素化できているのです。
なお最終的なAD変換結果出力速度についても、デシメーション・レート𝐷𝑅でシステム・クロック速度からデシメーションされて出てきます。そのため図16のように、デシメーション操作をディファレンシエータ・ブロックで行っても、この出力のところで行っても、操作としては同じです。
ディファレンシエータ・ブロックで折り返しが生じるのではないか
上記の操作は、サンプリング周波数が1/𝐷𝑅だけ遅くなることになります(この例では1/4)。ここで疑問が生じたのでした。「ナイキスト帯域外の信号成分が折り返して、ナイキスト帯域内に現れるのではないか」という疑問です。



TNJ-052でも示したように、また一般的によく知られているように、アナログ信号のスペクトルはサンプリング定理により折り返されてデジタル信号として現れます。
sinc3フィルタの伝達関数は図17のようになります。デシメーションにより、同図中に赤破線で示された「デシメートされたサンプリング周波数word_clk」で再サンプルされます。そうするとword_clk/2~2×word_clkあたりのスペクトルが、word_clkのレートのナイキスト帯域に折り返されるのではないかというのが私の疑問でした。
アキュムレータ・ブロックを見ると問題なさそうに感じるけれども?
これについて考えてみましょう。図18に図12のアキュムレータ・ブロック𝐻𝐴(𝑧)の伝達関数のプロットに加筆したものを再掲します。後段のディファレンシエータ・ブロックのことは考えず、ここではこのブロックのみを考えます。
このブロックはmclk1でサンプリングされ、積分器(累積 = 積分なので)としての周波数特性が図のように形成されます。また図中の緑破線のように、外部に設置するアンチ・エイリアシング・フィルタ(Anti-Aliasing Filter; AAF)によりナイキスト帯域外の余計な成分は落とされます。これらの合成がアキュムレータ・ブロック単体で得られる周波数特性です。図19に図18の周波数軸を対数としたものも示してみます。
ディファレンシエータ・ブロックに入るところでデシメーションされると
この信号は、つづいて後段のディファレンシエータ・ブロックでword_clkのレートでデシメーションされます(同図中の赤破線)。このレートにおけるナイキスト帯域外の周波数(word_clk/2~2×word_clkの2nd, 3rd, 4thナイキスト・ゾーンあたり)が折り返されますが、word_clkのナイキスト帯域内の伝達率の大きさに比べて、折り返される帯域外の振幅レベル(伝達率)は十分に小さく「は」なっています(「は」というところが意味深な…。以降につながるストーリでありまして)。ここだけ見ると、折り返しはとくに問題なさそうに見えますが…。
ディファレンシエータ・ブロックの伝達関数も考慮すると
つづいてディファレンシエータ・ブロックを見てみましょう。この部分はデシメーションされたレートで動作しています。
このブロックの伝達関数を図11の回路を使ってシミュレーションしてみます。その結果が図20です。DCでは信号伝達率がゼロ、そして0.25Hzステップでゼロとなる点(これをヌル点といいます)が繰り返し生じています。「櫛(くし)状」になっていますね。このためにCascaded Integrated Comb(櫛)と呼ばれるわけです。
この伝達関数でアキュムレータ・ブロック𝐻𝐴(𝑧)の出力がフィルタリングされ、デシメーションによりword_clk(mclk1/4)で折り返されます。
ここでDCのあたりを見てください。DCのところは伝達率がゼロです。DCでは、アキュムレータ・ブロック𝐻𝐴(𝑧)とこのディファレンシエータ・ブロック𝐻𝐷(𝑧)との合算(掛け算)で、出力は1になります。実はせっかく𝐻𝐴(𝑧)での積分動作により低域の伝達量が増大しているのもかかわらず、それが𝐻𝐷(𝑧)での微分動作で、その増大を打ち消してしまっているのですね…。

その結果として、sincフィルタ形状の周波数特性が結果的には形成されてしまいます。
アキュムレータ・ブロックで低域の伝達率がとても大きくなることから、「高域の折り返しの影響が低減するだろう」とおもいきや、結局はsincフィルタ形状となり、それがそのままデシメーションで折り返されるという「もとの木阿弥」状態になっていることが分かります。なんと、というか、なるほど、という感じです。
答えをいうと「sincフィルタの周波数特性とデシメーションにより折り返しがみえてくる」
ということが、私が感じていた疑問に対する答えのようです…。
アキュムレータ・ブロックの伝達率がディファレンシエータ・ブロックの伝達率でキャンセルされる。それにより「sinc形状そのものの周波数特性が折り返される」。sincフィルタには意外な折り返しの問題があったのですね…。
それでも実際のΣΔADC回路では、DCに近い低域のところしか取り扱わないことが多いと考えられます。またある程度周波数が上昇してくると、sincフィルタの特性により、検出される信号の振幅が低下するという問題点もあります。そのためこの折り返しはあまり問題にならないと考えられるものです。
それでもこのような折り返しが生じるんだということは理解しておくとよいでしょう。
ΣΔ変調器で生じる折り返しは外部にアンチ・エイリアシング・フィルタを設置しておく
示したように、もともとのシステム・クロックmclk1(ΣΔ変調器の動作周波数、ビット・ストリームのレート)で生じるエイリアシングは、ΣΔ変調器の前段に配置されるアンチ・エイリアシング・フィルタで除去する必要があります。
逆にいうとこのmclk1でもエイリアシングが起こるため、mclk1のレートに対するアンチ・エイリアシング・フィルタは外部に必要だということです。これはΣΔADCでもSAR ADCの場合と同じく注意が必要なことです。
外部にアンチ・エイリアシング・フィルタを設置すれば、システム・クロックmclk1のレートで発生するエイリアシングは問題になることはありません。
アキュムレータとディファレンシエータの並べる順番は?
一般的にはアキュムレータ・ブロックを前段に、(デシメーションした)ディファレンシエータ・ブロックを後段に配置することが多くの解説書やwebページで説明されており、また「どちらを先にしても回路動作としては変わらない」という説明も多くみかけます。
しかし、ディファレンシエータ・ブロックを前段に配置して、そこでデシメーションすれば、ここで示したような特性が実現できないことが分かります(デシメーションしなければ問題ありません)。つまりデシメーションを行うのであれば、順番としては、アキュムレータ・ブロックを前段に、ディファレンシエータ・ブロックを後段に配置することが必須となります。
一方で説明してきたように、ディファレンシエータ・ブロックを後段に配置し、ここでデシメーションすれば、シフト・レジスタの段数を減らすことができ(出力ワードのビット幅だけ必要なのでロジック数が増えるため)、良好という点もあります。といっても現在のSoC FPGAではこの増加は無視できるものでしょうが…。
ところで、どの書籍か記憶がないのですが、ディファレンシエータ・ブロックを先に置くと問題があるという記述を読んだことが(読んだような記憶が)あります。今思えば、引き算処理による残差の伝搬(アキュムレータ・ブロックでの累積)のことかなと思いますが、定かではありません。
まとめ
前回と今回でLTspiceを使って平均化フィルタとsincフィルタ/CICフィルタについて考えてみました。CICフィルタはそのZ変換の式を割り算してみると、平均化フィルタと等価になっていること、まさしくsincフィルタになっていることがご理解いただけたかと思います。
ディファレンシエータ・ブロックでデシメートすることについては、sincフィルタ/CICフィルタの回路構成として、折り返しが生じてしまうことが分かりました。探究していけばいくほど、あらたな気づきを得ることができるわけですね。
ちょっとオマケ(オーバ・フローについて)
ちなみに図9のような構成でアキュムレータ・ブロック(積分回路)を作れば、DC成分が加わったときに、アキュムレータの値がオーバ・フローしてしまいます。「ここは注意すべき」という記述を見ますが、CICフィルタ構成として図5のように後段のディファレンシエータ・ブロックで差分計算が行われることを考えると、unsigned int(符号なし整数)でacc3が構成されているため、差分計算としてはオーバ・フローの前後でも正しい差分量を計算できることにも気がつきます。簡単な回路ですが、ホント、良くできてますね。
著者について
デジタル回路(FPGAやASIC)からアナログ、高周波回路まで多...
この記事に関して
{{modalTitle}}
{{modalDescription}}
{{dropdownTitle}}
- {{defaultSelectedText}} {{#each projectNames}}
- {{name}} {{/each}} {{#if newProjectText}}
-
{{newProjectText}}
{{/if}}
{{newProjectTitle}}
{{projectNameErrorText}}