ライター:mpcsp079さん(最終更新日時:2016/4/28)投稿日:2016/4/4
.
ΔΣDAコンバータのシミュレーション集
https://sonofsamlaw.hatenablog.com/entry/2024/10/26/072013?_gl=1*3rx3q6*_gcl_au*NjcxMDc5NjMxLjE3MjQ2NjkyOTg.
今回は最小値付近の信号がどうなるかをシミュレーションしてみた。いままでは8倍オーバーサンプルでやってたが、128倍にした。
図2の1、2次でやった。いままでは8倍OSであったが、128倍とした。116bitの最小値、1/(65536*2)とそれの2倍の振幅の1kHzの正弦波を入れた。uとvを10kHzの3次ローパスフィルタを通したものをみた。かなり再現できている。下記の質問にあるような懸念はない。
■2次
図1 2次
図2
図3
図4
■1次
図5
図6
図7
■考察
16ビットの最低値は再現できている。これはOSの倍数には関係ない、ただOSが小さいとノイズが大きくなり、またその周波数が信号に近くなるので、ローパスフィルタで撮れなくなる。
どうして、OSに関係なく小さな値が再現できるのか?たとえば正弦波を出したいとき、その周波数に対応した周期の大きさ1のパルスを1つだけだせばいい。これをローパスフィルタを通せば正弦波になる。これが最低の振幅である。
しかし、もう2つのこれとは位相が違う振幅が同じ正弦波をつくり、これらを合成すれば位相関係を変えるだけでこれより小さい任意の正弦波を作れる。最小値は=0である。これがこの方式の利点である。しかし、ノイズが重なってくる。このため、OSを上げ、ノイズシェイピングをして、使用帯域内のノイズを小さくするのである。
http://oshiete.goo.ne.jp/qa/6772888.html
にはこうある。
ーーー引用ーーーー
■質問
1bitΔΣ型のDA変換で、例えばfs(ビットクロック)の1/256の周波数の信号をアナログに変換しようとする時、1周期分のビットストリームは256bitしかありませんから、どんなデジタル処理でノイズシェーピングしたとしても、256段階以上の種類の振幅を表現することは不可能ではないかと思います。そうすると任意の信号が入力された場合には、少なくとも最大振幅の1/512の量子化ノイズは避けられないことになります。
実際、以前ここのQ&Aで教えていただいたURL
http://www.okuma.nuee.nagoya-u.ac.jp/~murahasi/d …
でfs(ビットクロック)の1/256の周波数でのノイズレベルを計算すると、0.0245と、さらに大きな値になります。
1bitΔΣ型DA変換のノイズシェーピングには、何か上の計算よりもノイズレベルを削減できるような理屈があるのでしょうか?
■回答
ご提示URLの内容からしますと、1次のΔΣをシミュレーションされたのでしょうか。
より効果の把握し易い 2次-1bit のノイズシェーピングを、ぜひ試して見て下さい。量子化ノイズは、あなたの理屈より小さく成り得ると思います。(念のため書き添えますが、ノイズ評価のフーリエ変換の際、対象信号数周期と窓関数は必須です。)
アルゴリズム例:
http://jaco.ec.t.kanazawa-u.ac.jp/edu/digi/pdf/5 …
http://www.beis.de/Elektronik/DeltaSigma/SigmaDe …
ところで不条理の件ですが、もし256bit同一パターンが繰り返されるなら、振幅ダイナミックレンジは仰る通りかもしれません。しかしその考察では、暗黙の内に位相ノイズを零に拘束してしまっていませんか。 振幅性ノイズと同量の位相ノイズが許容されてしかるべきです。パターンが幾分変わって繰り返される事で、位相ノイズ追加の代わりに、振幅自由度が獲得できるのではありませんか。
■お礼
ありがとうございます。位相ノイズというのは位相ひずみと考えてよいのでしょうか。思い及びませんでした。確かに私のパラドックスは位相を拘束しています。御陰様で長年の疑問が解決するか知れません。大変参考になりました。ノイズシェイピングは通過帯域内での群遅延を許容していることになるのでしょうか。
リンク先のJAVAを使ったシミュレーションも試しましたが、質問の数値はリンク先に記載されている、1次ノイズシェーピング後のノイズの数式から数値計算したものです。教えていただいたリンクはこれから読んでみます。
ーーーーーーーーーーーーーーー
ーーーープログラム2次ーーーーーーー
REM 2次 44.1kHz 3次フィルタ10000Hz 最後をとる
REM s=100,cは3.6になる,
REM 128倍
REM IN小さくして分解能見る、WINDOW変えた
DIM v(1000000),c(1000000),e(1000000),u(1000000)
DIM vv(1000000),vvv(1000000),vvvv(1000000)
LET n=1000000
LET t=1.77E-7
LET tt=0
REM Hz
LET f=1000
LET OM=2*PI*f
LET v(1)=0
LET c(1)=0
LET e(1)=0
LET m=10000000/f
LET MAX=0
LET z=2*1.53E-5
SET WINDOW 0,m,-z,z
FOR i=3 TO n
LET tt=tt+t
LET u(i)=(z/2)*SIN(tt*OM )
LET c(i)=u(i)-e(i-2)+2*e(i-1)
REM-----------------
LET s=100
IF c(i)>s THEN
LET c(i)=s
ELSE
END IF
IF c(i)<-s THEN
LET c(i)=-s
ELSE
END IF
REM-----------------
IF MAX<c(i)THEN LET MAX=c(i)
REM-----------------------------------------
REM-----------------------------------------
LET w=1
IF c(i)>0 THEN
LET v(i)=w
ELSE
LET v(i)=-w
END IF
REM-------------
LET e(i)=c(i)-v(i)
REM-----------------
LET w=100
IF e(i)>w THEN
LET e(i)=w
ELSE
END IF
IF e(i)<-w THEN
LET e(i)=-w
ELSE
END IF
REM-----------------
NEXT I
REM------fiter---
LET a=2*PI*10000
FOR I=3 TO n
LET vv(i)=(v(i)+v(i-1)-vv(i-1)*(1-2/(t*a)))/(2/(t*a)+1)
NEXT i
FOR I=3 TO n
LET vvv(i)=(vv(i)+vv(i-1)-vvv(i-1)*(1-2/(t*a)))/(2/(t*a)+1)
NEXT i
FOR I=3 TO n
LET vvvv(i)=(vvv(i)+vvv(i-1)-vvvv(i-1)*(1-2/(t*a)))/(2/(t*a)+1)
NEXT i
REM---------------
REM----PLOT-------------------------------
FOR I=n-m TO n
PLOT LINES: i-n+m, u(i);
NEXT I
PLOT POINTS:0,0
REM FOR I=3 TO m
REM PLOT LINES: i, v(i);
REM PLOT LINES:i+1,v(i);
REM NEXT I
PLOT POINTS:0,0
FOR I=n-m TO n
PLOT LINES: i-n+m, vvvv(i);
PLOT LINES:i+1-n+m,vvvv(i);
NEXT I
REM--------------
REM PRINT max
END
ーーー1次ーーーーーーーー
REM 1次 44.1kHz 3次フィルタ10000Hz 最後をとる
REM s=100,cは3.6になる,
REM 128倍
REM IN小さくして分解能見る、WINDOW変えた
DIM v(1000000),c(1000000),e(1000000),u(1000000)
DIM vv(1000000),vvv(1000000),vvvv(1000000)
LET n=1000000
LET t=1.77E-7
LET tt=0
REM Hz
LET f=1000
LET OM=2*PI*f
LET v(1)=0
LET c(1)=0
LET e(1)=0
LET m=10000000/f
LET MAX=0
LET z=2*1.53E-5
SET WINDOW 0,m,-z,z
FOR i=3 TO m
LET tt=tt+t
LET u(i)=(z/2)*SIN(tt*OM )
LET c(i)=u(i)+e(i-1)
REM-----------------
LET s=100
IF c(i)>s THEN
LET c(i)=s
ELSE
END IF
IF c(i)<-s THEN
LET c(i)=-s
ELSE
END IF
REM-----------------
IF MAX<c(i)THEN LET MAX=c(i)
REM-----------------------------------------
REM-----------------------------------------
LET w=1
IF c(i)>0 THEN
LET v(i)=w
ELSE
LET v(i)=-w
END IF
REM-------------
LET e(i)=c(i)-v(i)
REM-----------------
LET w=100
IF e(i)>w THEN
LET e(i)=w
ELSE
END IF
IF e(i)<-w THEN
LET e(i)=-w
ELSE
END IF
REM-----------------
NEXT I
REM------fiter---
LET a=2*PI*10000
FOR I=3 TO m
LET vv(i)=(v(i)+v(i-1)-vv(i-1)*(1-2/(t*a)))/(2/(t*a)+1)
NEXT i
FOR I=3 TO m
LET vvv(i)=(vv(i)+vv(i-1)-vvv(i-1)*(1-2/(t*a)))/(2/(t*a)+1)
NEXT i
FOR I=3 TO m
LET vvvv(i)=(vvv(i)+vvv(i-1)-vvvv(i-1)*(1-2/(t*a)))/(2/(t*a)+1)
NEXT i
REM---------------
REM----PLOT-------------------------------
FOR I=3 TO m
PLOT LINES: i, u(i);
NEXT I
PLOT POINTS:0,0
REM FOR I=3 TO m
REM PLOT LINES: i, v(i);
REM PLOT LINES:i+1,v(i);
REM NEXT I
PLOT POINTS:0,0
FOR I=3 TO m
PLOT LINES: i, vvvv(i);
PLOT LINES:i+1,vvvv(i);
NEXT I
REM--------------
REM PRINT max
END