Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 92905|回復: 74
打印 上一主題 下一主題

[問題求助] 如何將Hspice資料轉進MATLAB計算

  [複製鏈接]
跳轉到指定樓層
1#
發表於 2007-10-4 22:57:23 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我現在在設計一個三角積分調變器(sigma delta modulator),電路完成後,我用Hspice做FFT(快速傅立葉轉換)求得SNDR(Signal to Noise plus distortion ratio),但我看其他論文秀出來的都是再經Matlab轉出來的圖形,請問,hspice要如何轉換成matlab畫出SNDR及DR(Dynamic Range)?包含方法及指令,愈詳細愈好。拜託有高手能相告。( ]$ B  r3 c% v- v
謝謝!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂13 踩 分享分享
推薦
 樓主| 發表於 2008-4-28 17:19:49 | 只看該作者
志良你好:
4 J1 _+ D% c4 R如果你是要將hspice的波形用matlab叫出來比較,你可以去Matlab網站下載hspice toolbox來用,至於用法,我之前有在網路上搜尋到hspice toolbox的英文及簡體的說明檔,我另外自己也寫了一份繁體中文檔,我把他們全部置於附件中,供你參考,你看完說明檔後,應該就會用了,有問題再發問吧。) }. V; ?8 f* i7 j$ ]2 h
關於你的第二個問題,這說起來可能有點複雜,你可以看一下版面上我之前與版主及副版主的問與答內容,應該可以知道如何從hspice下指令得到所需的資料,matlab程式的寫法,可以去買有關matlab的書來看,到時有問題再發問了。希望對你有幫助。6 x9 B6 p% D. |4 ^, |, M* ]' [* t
+ T' K& p9 r' D3 e8 Z
[ 本帖最後由 緣緣 於 2008-4-28 05:48 PM 編輯 ]

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?申請會員

x

評分

參與人數 1感謝 +5 收起 理由
fechiu + 5 很給力!

查看全部評分

2#
發表於 2007-10-5 18:42:51 | 只看該作者
我之前做ADC再算SNR有用過一個方法 可是很爛 但是還勉強可以用
" v9 ~& L2 d, z6 _6 B/ c就是直接用.print指令把你要量的電壓印出來& D9 s3 _3 k7 f0 f# P
然後再用手動把印出來的資料copy起來" A, G9 }1 @* N9 ?! t% o; W
然後貼在Matlab程式上面 然後就可以做FFT了
3#
 樓主| 發表於 2007-10-5 21:39:18 | 只看該作者

謝謝版主回復

謝謝版主的回覆及支援,我之前有找到一個MATLAB的應用軟體叫做HspiceToolbox,可以將hspice輸出的檔案透過HspiceToolbox將檔案轉入MATLAB中,也可用MATLAB叫出hspice電路中各節點的信號,只是,接下來MATLAB要用何種指令才能算出電路輸出點的SNDR及DR,我知道可以將MATLAB的指令整合成一個副檔名為m的檔案,不知版主或其他高手有沒有這方面的指令寫法或是m檔案,那就感激不盡了。
, y8 k4 |) w  {9 p% d* j
/ @$ V' S  E2 n# H: _6 b& |謝謝!
4#
發表於 2007-10-8 09:40:08 | 只看該作者
Matlab 有 fft 的  program, : T* [  N1 s( C* J; _  \: ]
所以  只要將FFT後的資料  做一些轉換就可以唷!!
% f0 o: H  A4 J9 z# {) ?將主信號找出來!!  然後將"所有的 fft power 加起來 - 主信號的 power"
1 V- l! ?( i9 M! J4 e+ p9 Z4 Z8 {; b就可以換算  SNDR 了!!' Y6 P) p1 k+ d5 A) J' H3 _* J7 m
SNDR is Signal to (Noise + THD) ratio?
5#
 樓主| 發表於 2007-10-11 17:44:50 | 只看該作者
謝謝sjhor版主的回復,我正上Matlab網站努力尋找資料中。
6#
發表於 2007-10-13 08:20:07 | 只看該作者
我以前作DAC的MATLAB部份程式
5 T$ _( W( m9 I7 D我想,應該可以給你一些參考吧
0 k# a+ ~) ^  K, l% [, m3 m2 w
7 _% n7 O1 J- _9 r0 N- n% --------------Using minimum 4-term Blackman-harris Windows -------------
0 S% B2 L2 Y' o. ^1 y4 ]6 F2 H: _% Rnb=1:1ts;
- S; ~9 X  ~1 A  m4 ?. ]1 _- Nkb=0.355768-0.487396*cos(2*pi*nb/(pts))+0.144232*cos(4*pi*nb/(pts))-0.012604*cos(6*pi*nb/(pts));# m8 w$ p3 z. M2 T
win_gain=sum(kb)/pts;  o7 D: i3 [9 b5 q1 @: G0 g: ]
kb=kb/win_gain;
" I$ N% k" u8 m3 k4 @# s' ~# |* H0 U
% --------------- Calculated fft --------------------------, [1 v2 o* @2 c4 e, F( Y& s0 j4 }
yb=kb.*x(ptsttfi);
5 e* J! r% l: B! }5 `6 `6 D% byk=fft(yb);
8 \4 P* p9 K4 w% {( Xfft_no=length(yk);8 C; E* @# r# G8 w1 F+ x
f=fs*(0:fft_no-1)/fft_no;
  d2 ~9 j: s4 {, D! ]7 rPyy=yk.*conj(yk)/((fft_no/2)^2);
+ r  K$ v4 u* y4 }( D8 t: a( |3 Y- A* o. p
% ---------- Calculate THD ----------------------------9 k, ~2 i5 }" f8 U
j=1;
0 S( p8 U% I1 C8 e6 R% |for i=1:1fft_no/2)2 {3 O4 u- O* K$ q* l/ W
    if (f(i) == (fi*j))
4 W5 s0 e$ K" R& I, j, e: S        HD(j)=Pyy(i);     %% find all harmonic distortion components
, e0 T' h* W2 g        j=j+1;
' Y/ b* M# x, Z7 b* l, |    end
6 N' a6 [9 X" ]# Z$ n' \end9 ~& {$ C7 v+ |" \/ K2 U( u
P_hd=sum(HD(2:9));
; H! }7 p( P8 E  c* I4 c4 ]THD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal5 q! v4 B% O/ ~- L
fprintf('THD = %g dB\n',THD);  f; i: ^1 W) c, @
) b1 V3 h$ q0 g1 b" H. }
% ---------- Calculate SNR ----------------------------+ l3 U+ f) p  |$ R3 L2 a+ R& M" t
fundamen_dB=max(10*log10(Pyy(1:fft_no/2)));
- T  H$ X4 b: m# q" }8 B. f1 Sfundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);
' a! @  M. {$ _3 t3 v8 Vspan=max(round(fft_no/200),5);
! z7 L* i* ]7 k$ d6 R) XP_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));/ G2 Y# ~+ x3 q* k: B1 I

7 N! V- M; e: `& M+ v9 |P_noise1=sum(Pyy(1:fft_no/2))-P_sig-P_hd;1 c/ V$ p& [" J) R1 E- u! t
SNR1=10*log10(P_sig/P_noise1);- K3 [7 {3 C! P9 }" p6 C
fprintf('SNR = %g dB\n',SNR1);
7#
 樓主| 發表於 2007-10-15 19:34:54 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
/ p# D( m- ~( V3 A, b# `請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。% E- r9 I4 P) W2 j! _0 u" ~
+ T; W6 L( ?/ W: J
另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:
6 \; p( W7 ^% \* A8 y/ |"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"
8 V1 G2 B  o0 C8 l+ h% g3 J內容為:
$ {" m1 }& q# P6 n& ]9 i+ o压缩文件共有三个文件:两个m文件和一个txt文件
, \. |* r, [/ z% Dspectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。& |5 @  o( ~! v, C5 ?
希望大家喜欢!! ; l. |6 H, ^4 \. ~8 N
附件為:FFT.rar/ I+ B+ v+ c, [3 F( |, ?- ]
6 R4 k3 G( H! v9 \, [# [, U+ B/ m
我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:, x- ]: G2 V& @$ w/ e5 ~

6 O% W* e" z4 w  x# h??? Undefined command/function 'AD10'.# {' O2 T6 l# J. L6 o; w- w' c

( e5 V6 E- }) g  D. ?Error in ==> spectra2 at 43
6 [$ {: h# X! v/ U: Y: Y: N+ Y0 ?d0=round(AD10(start:stepstart+M*step-step),3)/1.8);
& F; l7 j5 b$ T6 O
5 a) Q# y- y, ^: i5 H8 Y由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
9 B% R' i# T# f& d0 ^% G5 k7 b" b* Y: E# `% A
∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~??????? ; G5 b! p3 B4 n4 E# h1 X

2 x7 ^) A  W. Z. ~( ]6 J3 Y6 N[ 本帖最後由 緣緣 於 2007-10-15 07:54 PM 編輯 ]
8#
 樓主| 發表於 2007-10-15 20:54:45 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
7 T9 Z6 U4 f. i: R* Z; T請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。
% K/ t5 f7 b% j5 I另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:
+ y% p9 b" f- K2 K6 S1 l& v$ ?"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"( E" ^1 Z3 ^' s3 Y* M
內容為:6 b: ^; x  j4 M1 w  o9 W& V; _/ R
压缩文件共有三个文件:两个m文件和一个txt文件
1 }5 |4 z  t) Y" B2 Tspectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。
& y5 N5 o& p' W* G- i6 J( U( j希望大家喜欢!!
- l& p: u' `$ ^+ u附件為:FFT.rar
; s( B0 P$ ]9 d6 F & n+ V& z& g, n0 [! K
我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:
; Q4 K9 g  _/ I0 R* B$ b/ B' B1 f/ a# X3 M7 \
??? Undefined command/function 'AD10'.) t5 x% \) b, T. B

" D7 N: ]: x4 X& B5 v& yError in ==> spectra2 at 43) F9 @1 {1 a6 j7 B5 _  r
d0=round(AD10(start:stepstart+M*step-step),3)/1.8);
( f3 S2 l' F9 e9 n5 r
$ r8 d. v# ]$ i8 q* _) S由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
9#
 樓主| 發表於 2007-10-15 22:18:15 | 只看該作者

增加附件

∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????" W  s8 O5 G* e  u& g
附上上帖的附件

評分

參與人數 1Chipcoin +2 收起 理由
chip123 + 2 可能是圖檔太大?縮小再試看看?

查看全部評分

10#
發表於 2007-10-15 22:31:57 | 只看該作者
在回答你的問題前我先稍微解說一下我的MATLAB程式
" |9 |: Y2 q0 Z) l+ k! u  A要作FFT必需是sine waveform或者近似sine waveform,所以,我在作DAC的SNR及THD時,必需是輸出信號為sine waveform的記錄數值" p& ]. R9 v* |7 Y, v" F& w
故而,我利用SPICE中.measure的指令來記錄DAC的輸出信號數值,然後將這些記錄的值存成一個TXT的文字檔,然後再用MATLAB將這個文字檔讀出,再作FFT運算
% y0 z% }. `/ W" T  T2 {0 F% Y  x8 W! r
在MATLAB程式中要作FFT運算時,需注意它必須是2的倍數,同時,我在作FFT運算時,先行利用minimum 4-term Blackman-harris Windows的filter來使DAC的輸出信號平順些,當然,你也可以不加,不過,畫出的waveform會有點怪怪的,再者,因為我們記錄的數值是每隔一段時間所記錄的數值,所以畫成連續的圖形時,會很不連貫,所以,一般都會作windows的filter,而我也問過一些比較資深的analog designer此種作法是否恰當,還沒有人對於這種作法感到奇怪,也許大家都是這個樣子作的吧
0 n  Q* Z3 S4 n% d# `
2 v6 j: ^; i3 W2 R! o, {! U" t我看不到你的附件檔,故而實在無法作出評論
1 {5 }( Q2 F  t. `, g' }而看了一下你所秀出的錯誤訊息,想問一下,MATLAB程式中有AD10這個函式嗎??又或者有沒有AD10這個array??" B8 f2 g7 g$ q  Z% y# }9 M
從錯誤訊息來看,似乎是找不到AD10這個函式或者array,所以才有錯誤
11#
 樓主| 發表於 2007-10-16 15:54:59 | 只看該作者
由於之前一直出現Internet Explorer無法連線訊息~???????
2 f! y0 E% q( }所以重新上傳附件

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?申請會員

x
12#
 樓主| 發表於 2007-10-16 17:02:11 | 只看該作者

有關hspice .measure指令寫法

再請問一下finster副版主,如果我是要將Hspice的電路輸出點Dout,使用.measure指令來記錄ADC的輸出信號數值,暫態分析(TRAN)掃瞄區間:0~3.2msec,
* R: t4 v  l0 Z4 V" P指令的寫法是否為:
: m  v, y. I# a, |0 s+ p) N9 i/ B2 ?3 x# H$ W0 `: s$ D7 _
.MEAS TRAN DIGOUT7 ?  v6 x6 @+ V/ ~4 S7 K, t& B
+TRIG  V (Dout)  VAL=0        RISE=2: _% {/ J$ m5 E, V
+TARG V (Dout)  VAL=3.2m  RISE=2
, N0 L5 E: O$ }3 J) Z) m
5 Q& f+ A0 N7 V2 H' c- J; X% U∼還請指教,謝謝∼, k( a+ v" q. Q; C2 y- s) l

# Z# o- v6 m( g4 G# P! {% p另外,我先使用一個小程式去試.measure這個指令,輸出的*.lis只發現以下的數據:0 g7 k) ]3 E% ?" X* q5 c

) ]. y4 _2 _! y3 G. l9 vdigout=  3.7443E-09  targ=  1.5167E-07   trig=  1.4792E-073 w6 q$ r7 X( O1 a6 x3 Z- f
1 x9 T: e- [7 P/ E7 k
Hspice輸出檔多了一個*.mt0的檔案,該檔內容同上面之敘述,不知是否還有那邊出錯?6 X2 ]' z/ q% P0 h5 Z2 `

  l# d9 f! Y1 y* }+ h% A" C[ 本帖最後由 緣緣 於 2007-10-16 05:34 PM 編輯 ]
13#
發表於 2007-10-16 23:08:40 | 只看該作者
在Hspice執行.measure指令時,它是依據你的.lib的數目來產生相對應的*.mt*檔  s. O+ e4 |' n0 ?* d
故而,如果你的檔案有多出*.mt0的檔案,那表示這是你的.lib的第一個依據.measure所計算出來的資料
6 R: Z) |/ r' T& i; ?- ^所以,請再檢查一下你的HSPICE檔案吧
! i1 J& K+ W, e
6 t8 U% }. Q$ s, i4 h8 f$ K/ @再來,你的.measure指令用法沒有問題" x8 }" E  Q) B% f" M! O; H* w
但,你的取樣點及時間似乎不對
1 j& J/ F6 Q7 `+ e2 m4 S* u你的暫態分析(TRAN)掃瞄區間:0~3.2msec,你所用的指令為:2 j/ S3 C5 v( C
.MEAS TRAN DIGOUT  b/ X! ]: ]5 ^# f) D
+TRIG  V (Dout)  VAL=0        RISE=2
$ @9 F: F" ?9 y+ j$ p+TARG V (Dout)  VAL=3.2m      RISE=2* F& _' i/ w# U2 p! L( J- |$ e
寫法沒錯,但,如果是ADC,那其輸出信號為digital,故而,輸出信號的振幅不是0就是vdd,如果要記綠輸出信號的digital code的話! t: R- {* _- o1 _
那,計算輸出信號的digital code應該依照clock來作取樣時間,而不是0~3.2ms,也就是.measure的VAL要是clock
2 y$ V: M$ M. l" c' Q) c* k另外,若依照你的指令來用,應該會計算不到輸出信號,除非你的模擬時間超過6.4ms,因為你是用RISE=2; w, ]( f5 ?& v
再者,如果是用.measure來計算digital code,那如果以rise edge作基準則應該用RISE=1,而不是RISE=2,這是很嚴重的錯誤,除非你的clock及取樣有delay 1個clock的作用在,如果是以fall edge則是FALL=1,若是以你RISE=2,那你取樣出來的digital code應該都是錯誤的
14#
 樓主| 發表於 2007-10-17 14:02:04 | 只看該作者

再次謝謝Finster的回復

再次謝謝Finster的回復,我會依照你的方法再重試一遍,另外在麻煩你幫我看看上傳的ADC Matlab程式。
% j+ L* u! `5 H4 e0 P" K- X5 X3 @7 I) z3 M) ]
∼感激不盡∼
15#
 樓主| 發表於 2007-10-18 23:59:51 | 只看該作者
再請問一下finster副版主,我有兩個非重疊的Clock,一個ON,另一個就為OFF,取樣頻率為5.12M,週期0.1952u sec,半週脈寬0.0976u sec,第一個clock延遲0.05u sec開始觸發,第二個Clock再經過半週0.0976u sec觸發,電路輸出點為Dout,.Measure指令的寫法是否為:2 b% S8 U/ K7 L# j3 ?# C; D3 E1 c
3 }) X8 A, P4 X" H8 S& m& C" e) K5 Y6 D" h. z) v5 h+ E
.MEAS TRAN DIGOUT
( k; A$ u4 |+ \" V4 H% e+TRIG  V (Dout)  VAL=0      TD=0.5E-7    RISE=1( Z" a/ w) H+ q' t$ Y3 `! j! f! U0 s1 J8 B$ x+ u0 H0 K8 P- r
+TARG V (Dout)  VAL=0.976E-7               RISE=1
! S0 i+ b5 |2 S  p2 d8 i# n; o/ t: {( Q, @$ w- s
∼還請指教∼6 z' ^2 B6 [2 r
程式重試的結果,*.mt0檔案只出現:
% N/ i* s1 Q9 {digout           temper           alter#            
3 Q( n$ _: \# X( n# n1.890e-12        25.0000           1.0000         
8 P- A4 T- Q  z/ Y不知是否還需修改?
6 L& U3 f  p0 e. d# M* b  y: u! L+ `. ?, E: K! p8 w, w
[ 本帖最後由 緣緣 於 2007-10-19 12:11 AM 編輯 ]
16#
發表於 2007-10-19 01:58:58 | 只看該作者
先回答第一個問題
! j& U+ ^% N6 Y+ Y你的MATLAB程式我大概看了一下,發覺到AD10應該是一個由別人自行撰寫的運算函式,而因為你在MATLAB程式中並沒有這個函式,同時也沒有呼去這個函式,故而,你在執行MATLAB程式時,當然會出現錯誤訊息
$ v# f3 J" x8 n3 \所以,如果這不是你自己寫的MATLAB程式,那我只能說你的MATLAB程式並不完整,也許,這是別人故意留一手的吧
- |3 F  b* k, q2 W; ?/ E! k  o5 S! L" j6 v
再來,在ADC中的Sample and hold電路若是用SC電路,是會用non-overlap clock,故而會有兩個clock
6 t# s+ c2 F. a. i5 J9 n; d但,源頭的clock只有一個,而這個clock會透過non-overlap circuit去產生兩個時間差的clock. z( ]3 x4 L, K) d, K/ G
一般而言,ADC的數位電路所需的clock通常都是由源頭的clock作為基準,然後將數位信號輸出,故而,在使用.measure時,所參考的時間及頻率也該是以這個源頭的clock為主,而不是由non-overlap circuit所產生出來的兩個時間差clock,除非,你的ADC電路並沒有包Sample and hold circuit(我不清楚你的電路架構為何,但,ADC一般而言一定要有Sample and hold circuit)
# r8 V7 P- q; ~% t& C+ e% _再來,我看了一下你的取樣頻率為5.12Mhz,這是很低的clock頻率,所以,照理來說這麼低的頻率,你的架構應該是採用SAR架構的ADC吧,那你的輸入信號頻率為何呢??另外,你的.tran的時間多久呢???還有,你是幾個bit的ADC呢???
5 v7 I: g* a' S( R# Q9 K舉個例來說,假如你是4-bit ADC,輸出分別為D3,D2,D1,D0,且clock為1MHz,所以使用.measure應該為
7 T/ I' ~! J/ ?6 s- D.MEASURE TRAN DIGOUT_D3_t1 find V(D3) AT=5.2us
8 ]8 N5 h5 Q6 [7 q4 d' H.MEASURE TRAN DIGOUT_D2_t1 find V(D2) AT=5.2us
) |. {- h3 y3 r, N.MEASURE TRAN DIGOUT_D1_t1 find V(D1) AT=5.2us
" `5 x3 B+ }3 a9 ?.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=5.2us
! h# }& G  z! K% Y, A( ^6 I7 B! }- t2 d6 D' O( H3 X. S: f
.MEASURE TRAN DIGOUT_D3_t2 find V(D3) AT=6.2us4 m% L5 A) k/ G' H! k1 ~
.MEASURE TRAN DIGOUT_D2_t2 find V(D2) AT=6.2us- Q0 X2 t* y' c/ T4 ~7 q4 U& H
.MEASURE TRAN DIGOUT_D1_t2 find V(D1) AT=6.2us( p) k& Z4 z; h
.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=6.2us
8 ~' y0 |/ e+ J' q( ~7 X4 Y1 E$ M9 [# e* f+ r5 z/ [
我只計算clock的週期,然後再初估ADC中的delay時間為0.2us,所以,我第一個數位取出的時間為第5個clock週期來取出4個bit的digital code,然後在第6個clock週期時又取出第2筆digital code9 L4 [6 o, V( D- P
我用的方式較為簡化些,因為ADC要取出的是在每個clock週期中的digital code,所以,只要精算出每個clock時間,即可簡化.measure的指令,而不用用到TRIG....TARG.....,當然,這是我的作法,你也可以依照我前面寫的改成你用的TRIG...TARG的用法
" F6 v6 E+ S" K8 K0 [8 x( W
7 A* w: ]4 ^3 N) B8 l最後,像我剛才寫的.MEASURE TRAN DIGOUT_D3 find V(D3) AT=5.2us2 f1 `4 L8 t( q- j" u
可以用MATLAB程式寫成一個自我產生的.measure,我以前是用MATLAB來自己產生的,不然,光是計算1024點就要寫4096行.MEASURE指令,那是一件很浪費時間和生命的事,用MATLAB的迴圈即可一下子產生出所有.MEASURE指令,小小作法,提供給你參考
17#
 樓主| 發表於 2007-11-8 15:00:24 | 只看該作者

謝謝finster副版主的詳細解說

再次謝謝finster副版主的詳細解說,我前一陣子剛好有事在忙,沒有及時回復你的問題,還請見諒。
; Z, X0 z& x; j6 \( P我大概講一下我的架構:# E+ \# j4 [8 z! B
我電路是使用Switched-Current(SI)的架構,不同於Switched Capacitor(SC)的架構,最早設計是設定輸入頻率Fin=10KHz,取樣頻率為Fs=10.24MHz,頻寬40K,位元數為1-bit;由於我電路中有一個Op-Amp,因為OP-Amp頻寬限制的原因,在高頻時易產生非常大的諧波(harmonic)及雜訊(Noise),所以才降頻為輸入頻率Fin=5KHz,取樣頻率為Fs=5.12MHz,頻寬20K。電路中有兩個Clock(Φ1 & Φ2),Φ1 & Φ2是兩個Non-overlappind clock,由於尚在模擬階段,所以兩個clock的產生是使用hspice的指令寫出,指令如下:/ p7 O8 C0 e3 I# Q
For Fs=10.24MHz:( a/ ?0 e" h8 Y* C# ]" X
V0 NET2 0  PULSE 0  3.3  0.5E-7    0.976E-10 0.976E-10 0.488E-7 0.976E-7" e7 u) D* G% \; K2 N! r
V1 NET6 0  PULSE 0  3.3  0.988E-7  0.976E-10 0.976E-10 0.488E-7 0.976E-7# `; f& h" p  \$ d/ U2 Y# I3 C
For Fs=5.12MHz
* z7 a4 \+ ^6 p7 r+ K3 w% _, ]: TV0 NET2 0  PULSE 0  3.3  0.5E-7    1.952E-10 1.952E-10 0.976E-7 1.952E-72 l. r8 J: l7 M/ u& q- h
V1 NET6 0  PULSE 0  3.3  1.476E-7  1.952E-10 1.952E-10 0.976E-7 1.952E-7) d! o$ H. w5 b5 ^  Y# D# {3 ~
另外,我在hspice做FFT運算取的點數為32k,所以根據計算,如果Fs=10.24M,.tran的時間=(1/Fs)*32k=3.2msec,如果Fs=5.12M,.tran的時間=(1/Fs)*32k=6.4msec。
" `$ Y( `8 ?& A4 S如果依照你指令的寫法,根據我的clock=>Fs=5.12M,delay 0.05us的情形下,同樣第一個數位取出的時間為第5個clock週期來取出1個bit的digital code,然後在第6個clock週期時又取出第2筆digital code,寫法是否為:
3 i( M; ^7 \+ r7 O: U- ?3 n.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=1.026us
2 l3 m" m# S" K! E2 D.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=1.2212us  l3 x6 _8 H& B# Q
然後以此類推,在第7個clock週期時又取出第3筆digital code,如果32k點(二進制),就須寫32768行,這樣對嗎?
3 c5 a  n1 z8 d* D你說可以用matlab寫迴圈,可是如果我是將hspice的輸出數據再帶到matlab做計算,那我就需要先在hspice下指令記錄輸出數據,再帶到matlab中,那這樣子變成還是需要在hspice中寫32768行的指令才能記錄數據,或是說有其他辦法可簡化hspice指令?或是就你所言,用MATLAB程式寫成一個自我產生的.measure,但要如何做呢?還請finster副版主多多指教!謝謝!
/ W" \+ \5 |+ z6 m4 p
, c& ?4 U) B) \6 f0 n[ 本帖最後由 緣緣 於 2007-11-8 03:04 PM 編輯 ]
18#
發表於 2007-11-12 02:06:38 | 只看該作者
看了一下你的說明,覺得有些奇怪的地方
7 h4 y* U9 Q% N5 I2 \( |& s首先,我沒作過switched current ADC,不過,依照取樣原理理論來說,取樣頻率需大於輸入信號的兩倍才能夠將原始信號還原回來7 W: J$ f1 _% J- B6 t3 W/ |5 z
而你的取樣頻率和輸入信號頻率卻非常地接近,似乎有違取樣原理的理論基礎,不知道這個樣子真的能夠取出真實的信號?
: |: M4 [0 A5 k# H0 P) K
# U8 R" C2 \( r, l再者,FFT運算基本上也是依照取樣原理理論發展出來的,因為FFT的取樣點數是輸入信號的2^N倍,N的最小值為1,也就是FFT的最小取樣頻率是輸入信號的2倍,亦即輸入信號在一個週期內會被取樣2點,而我們所撰寫的FFT來計算SNR,SFDR,THD...也是依此理論陸續往下寫的,所以,看了你的規格,實在覺得有些奇怪& A; e" T( m, N" x# u3 U/ W8 M
; r/ ?7 [4 T- Y+ q
FFT的取樣點數如我剛才所言是取樣點數是輸入信號的2^N倍,所以,取樣點數為2,4,8,16,32,64,128,256,512,1024,2048,4096...,一般取到1024點或者2048點就已經非常足夠了,因為超過2048點之後所計算出來的SNR,SFDR,THD....其實變化的只有小數點後面幾位的不同而以,取樣到32768點,其實真的不需要- Z. q% M7 p1 Q8 g* [& ?
6 _; O! V9 X: L4 q" g4 N: r1 o) b
clear all9 w; i8 c$ d) `
fid=fopen('dual_measure_rms.txt','w')
5 X5 }% @5 d8 o2 r% l' Y; lfor M=1:1:1024
% n& g, y$ N6 ?1 h       T=M-1;
6 o% A1 U' M/ [/ U       from=(50*T)+45; %DUAL DAC measure time0 h  Q. s: W! Y- w
       to=50+(50*T);
. d  n4 d- }! s6 {. ^( V       fprintf(fid,'.MEASURE TRAN A%g RMS v(daci_outp) from=%gn to=%gn\n',M,from,to);( W9 l* t5 h! `5 B. q9 }
end
" x' [* |' Z# E# [" j) |MATLAB程式會產生一個dual_measure_rms.txt檔,你將這個檔裡面的.MEASURE複製到HSPICE中即可,不過,如我前面所言,取樣頻率是輸入信號的2^N倍,然後再算出我的取樣點的時間點為何,如果不知道這些關係式,那這個MATLAB程式將無法使用# v- @5 x: u9 t  x* b
這個程式很簡單,只是一個迴圈再加上幾行計算時間的式子
19#
發表於 2007-11-12 12:02:56 | 只看該作者
感謝Finster提供一個非常實用的小技巧
3 T. d9 E& e9 X; h# a" f- l這樣以後模擬FFT就非常方便了8 ^' q1 g& f7 N3 Z8 d1 B( t
看一下應該是先計算好要取樣點的時間間隔 也就是sample clcok的時間
6 P2 c' [' B1 j# E. d* n然後譬如取1024個點 就用Matlab產生1024個.measure指令敘述吧
' t. Y/ L8 X( P. p0 [只是我Matlab指令不熟 看來這些程式碼還得花點時間弄清楚一下
20#
 樓主| 發表於 2007-11-13 15:58:41 | 只看該作者

再次感謝Finster的詳細解說

首先我想請問副版主finster,你說我的取樣頻率和輸入信號頻率非常地接近,在取樣頻率Fs=10.24MHz的條件下,不知這裡輸入信號頻率指的是輸入信號頻率10K,還是輸入信號頻寬頻率40K?
7 V: a7 X: h5 c0 T9 J# }3 R我解釋一下我為何要用fin=10k,Fs=10.24MHz的原因:" ^$ ~$ U* b, Z1 p+ d) x/ U4 l2 S1 m3 _
因為我的Fs=10.24M,所以我的Fin=10.24M/1024=10k,會取1024倍的原因是之前曾上過ADC的課程,上課的講師提到由數位信號處理(DSP)的理論,Fs=1024*Fin的情形下,頻譜比較不會產生leakage。
# c- J3 k2 u7 |  P且如果以我的規格來看,我的OSR=Fs/2Fb=10.24M/(2*40k)=128,我是希望縮小Bandwidth提高OSR,進而提高SNR,可是我們老闆堅持要做到40k以上,所以,在無法提高取樣頻率Fs的情形下,只能維持OSR=128來設計。
5 _' \4 _2 @6 }2 H+ M另外,為何FFT運算要取32K points,是因為我看相關的論文,幾乎都是取16k或32k points,然後我在hspice使用FFT指令來計算的結果,好像32k points以上圖形比較像SNDR的圖形,所以才用32k points,後來再問其他人員,SNDR要由matlab做計算,輸出的圖形才準,論文中提到matlab計算的點數大多也是32K points,也因此,我也才想用32k points去計算FFT。1 [; `' o. ^. V7 O+ r; S  g
依照你所言,由於我的Fs是Fin的1024倍,所以,我的FFT只需取1024點即可,依照你的.measure迴圈程式,我將程式更改為:
1 `8 H8 s3 @5 r* Z5 W. Q5 j% Y# fclear all
4 n* L) |1 z2 x0 Dfid=fopen('sdm_out.txt','w')% O( M2 z4 s! r: U* \
for M=1:1:1024$ ?5 N& }  r0 \' J8 w
    T=M-1;
* A0 i+ A/ {6 W" s# B) C    AT=(0.1952*T)+1.026; %SDM measure time
$ l; i6 J% ~* G# B: K    fprintf(fid,'.MEASURE TRAN DIGOUT_t%g find V(D0) AT=%gu',M,AT);7 ]) l  ?. g& b
end
+ M, q' a  i: F0 _/ H試的結果,可得到1024行.MEASURE的指令,我會把他代入hspice程式跑跑看。
! j) ~5 z/ w0 ?3 U! Q" \想再請問的是:. ^9 D1 q- R9 f( D5 q, B
當我使用.MEASURE指令得到數據後,是不是還要在你提供的SNDR&SNR的Matlab程式前加上load指令,例如:' |# N0 @9 q+ V8 h' S7 ^( v9 b
load sdm_out.txt -ascii ;%sdm_out.txt is output digital code of SDM" Z* R1 Q3 [: B& Q& z
然後就可算出SNDR及SNR以及畫出圖形了嗎?" S) i' l& V0 D2 O! o3 ^; r  |
請指教∼
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

首頁|手機版|Chip123 科技應用創新平台 |新契機國際商機整合股份有限公司

GMT+8, 2024-4-28 11:41 AM , Processed in 0.142008 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表