Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 96716|回復: 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)?包含方法及指令,愈詳細愈好。拜託有高手能相告。
6 _8 \9 H+ s  i0 O& P謝謝!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂13 踩 分享分享
推薦
發表於 2008-5-13 21:53:55 | 只看該作者
幫忙補充一下,
3 v& A! h# ^3 [" \3 w; t8 Y4 W要使用這個toolbox時,在hspice的.option中不能使用post=2.
6 B% ~) r' t9 u! f: d1 ^( w9 [可以用' j( }1 S( h# Q' X* S4 K, \
.option post0 `  q7 y3 f+ _
或是
' a$ x& D9 {1 s' V.option post=12 T$ A0 Y5 J( o6 `  ~
但絶不能用: k0 g7 v1 R* D9 |
.option post=2
推薦
 樓主| 發表於 2008-4-28 17:19:49 | 只看該作者
志良你好:3 j$ L- {" x3 d
如果你是要將hspice的波形用matlab叫出來比較,你可以去Matlab網站下載hspice toolbox來用,至於用法,我之前有在網路上搜尋到hspice toolbox的英文及簡體的說明檔,我另外自己也寫了一份繁體中文檔,我把他們全部置於附件中,供你參考,你看完說明檔後,應該就會用了,有問題再發問吧。
- [% i; J! A0 y+ n% ~  [# b+ ?關於你的第二個問題,這說起來可能有點複雜,你可以看一下版面上我之前與版主及副版主的問與答內容,應該可以知道如何從hspice下指令得到所需的資料,matlab程式的寫法,可以去買有關matlab的書來看,到時有問題再發問了。希望對你有幫助。6 d' R3 G+ i$ D
3 H- s: R. C4 a5 P
[ 本帖最後由 緣緣 於 2008-4-28 05:48 PM 編輯 ]

本帖子中包含更多資源

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

x

評分

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

查看全部評分

2#
發表於 2007-10-5 18:42:51 | 只看該作者
我之前做ADC再算SNR有用過一個方法 可是很爛 但是還勉強可以用
$ U( g" }+ h7 q& A. p& z9 [" D就是直接用.print指令把你要量的電壓印出來
3 C& r/ c. _: n! k2 u$ n然後再用手動把印出來的資料copy起來. i; R! y: O  ?9 Q( X0 f
然後貼在Matlab程式上面 然後就可以做FFT了
3#
 樓主| 發表於 2007-10-5 21:39:18 | 只看該作者

謝謝版主回復

謝謝版主的回覆及支援,我之前有找到一個MATLAB的應用軟體叫做HspiceToolbox,可以將hspice輸出的檔案透過HspiceToolbox將檔案轉入MATLAB中,也可用MATLAB叫出hspice電路中各節點的信號,只是,接下來MATLAB要用何種指令才能算出電路輸出點的SNDR及DR,我知道可以將MATLAB的指令整合成一個副檔名為m的檔案,不知版主或其他高手有沒有這方面的指令寫法或是m檔案,那就感激不盡了。
5 g+ d/ p6 v) P' A, @% M) C. U  B3 ], w' m
謝謝!
4#
發表於 2007-10-8 09:40:08 | 只看該作者
Matlab 有 fft 的  program,
; H% _$ {. `9 j* E所以  只要將FFT後的資料  做一些轉換就可以唷!!' _8 m8 f0 B0 ^/ \" s+ G. e! k$ G
將主信號找出來!!  然後將"所有的 fft power 加起來 - 主信號的 power"
( W+ t  q1 G+ P9 s0 ~5 ^3 F/ U" i就可以換算  SNDR 了!!) T% q2 f( I2 D- m" k  k
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部份程式' q4 ]1 I$ F% V; M! s( L: {
我想,應該可以給你一些參考吧0 H0 ~8 k5 u0 h

7 g' D5 t# o( v2 \! |. \; H% --------------Using minimum 4-term Blackman-harris Windows -------------. f  ^* x4 K! O1 n; K5 c7 G0 G' q
nb=1:1ts;5 R4 E) n4 m( s
kb=0.355768-0.487396*cos(2*pi*nb/(pts))+0.144232*cos(4*pi*nb/(pts))-0.012604*cos(6*pi*nb/(pts));
. g6 A& t3 I, ~3 y+ |; j, Cwin_gain=sum(kb)/pts;- S: }, e. e' i& U
kb=kb/win_gain;
; P; w& {4 A" n. ^# q: b
" }! R, k8 A7 |) O3 T3 k% --------------- Calculated fft --------------------------' T% p$ B; P9 m5 v
yb=kb.*x(ptsttfi);1 z  d6 Y  U: R0 l# V% f$ T
yk=fft(yb);
& Z6 D, h1 Q9 a$ s' h2 Wfft_no=length(yk);
( M4 T! x" d. b4 `f=fs*(0:fft_no-1)/fft_no;
. M5 ^$ j8 F, @! |3 q( IPyy=yk.*conj(yk)/((fft_no/2)^2);: O  a" F& E8 g' w0 U+ W) g
8 b. E  U0 ]# B9 L
% ---------- Calculate THD ----------------------------7 _4 W6 T% y' U" n
j=1;
& ~6 q, Z6 J! Gfor i=1:1fft_no/2)
1 j. h, b4 p& @: k0 T0 {    if (f(i) == (fi*j))$ @" k  e6 n. |/ P* h/ g3 H3 D3 F
        HD(j)=Pyy(i);     %% find all harmonic distortion components: Q+ C1 Q0 ^' F
        j=j+1;. W% v& }* W$ m+ Z; L0 F, ^
    end
3 \8 m/ U1 c( j8 o. |+ S( Uend6 P1 O! W1 G& g' I
P_hd=sum(HD(2:9));
: ?' f  V# t! m. L/ Z, b9 b' LTHD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal, M) ^6 e# \8 m0 z. V) \
fprintf('THD = %g dB\n',THD);
3 M% A" `2 u. `' z
. ]+ l! U1 q' E  `% ---------- Calculate SNR ----------------------------* P6 I5 J' A( D8 y' J
fundamen_dB=max(10*log10(Pyy(1:fft_no/2)));/ k$ O3 x) G+ t
fundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);
/ R) O3 q) L( |4 f8 M" sspan=max(round(fft_no/200),5);2 y$ b0 u6 c( S: t: I
P_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));3 `! C1 i. u" i" v  L
  D/ a1 {9 J( I" D6 N
P_noise1=sum(Pyy(1:fft_no/2))-P_sig-P_hd;
3 H/ d7 G7 x% m4 d+ T* s  uSNR1=10*log10(P_sig/P_noise1);
- n0 h+ O0 v7 N  ?1 Yfprintf('SNR = %g dB\n',SNR1);
7#
 樓主| 發表於 2007-10-15 19:34:54 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
, r3 i5 i5 {3 t4 z# y9 L+ w請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。& g" G2 O% j7 e* K5 e+ f
+ {- g) D* k9 C- [6 Z( }
另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:' }. B0 I% k7 o8 V- U8 s  f
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!": F4 H7 @" D: O
內容為:
8 G: b: z" M! X# n4 |1 Y4 |" N压缩文件共有三个文件:两个m文件和一个txt文件2 y# n. z! V- @+ Q5 }" }& [& _
spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。
( R: {" c+ c+ J: f* d& h0 ?; E希望大家喜欢!! ! J6 j) ^5 c6 D% Y5 N8 F
附件為:FFT.rar- q6 i, t  G( ]# n" O  z8 R; k
7 I% T$ Z+ k; ~& G; q
我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:1 K) {' @' D' z( W( C! D! s" A

' |; X7 v' B: @; A+ F8 q" W1 c??? Undefined command/function 'AD10'.
9 U& L+ W7 D3 K' N3 t. K: M; z, v$ o
Error in ==> spectra2 at 43
% h! {7 ]: J( Z& S' [d0=round(AD10(start:stepstart+M*step-step),3)/1.8);
* Q* C; a, X3 u  p; `- j
) o: N2 h. x) Y由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!/ J, S& r! ~/ R
8 v) W+ T& Q" A0 b
∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????
3 t* d; R! H# h$ m
2 \  J+ ^# m0 l- e( c8 D[ 本帖最後由 緣緣 於 2007-10-15 07:54 PM 編輯 ]
8#
 樓主| 發表於 2007-10-15 20:54:45 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
, E8 C/ G" ]' ?% \! o" F7 ~- I5 D請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。
: u8 C* t2 V2 ]7 C6 K另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:
+ {- \) b# I  V/ W- l% j, D"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"
0 j  E' w) ]$ H內容為:4 d( O; [$ t) C& p$ `5 g- G
压缩文件共有三个文件:两个m文件和一个txt文件: j. ~( [3 O$ R" W
spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。5 a) k  \- T: T
希望大家喜欢!!
. [: s8 Q% D2 f" _  b附件為:FFT.rar3 ?% \" _) ]: O1 B) g

5 f: y3 t  a) b7 q' c我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:
* j& J8 E  J. t6 P  u# Q2 C1 l& {8 \% |/ ^& L% L. u! I6 @$ x
??? Undefined command/function 'AD10'.8 f3 g8 U1 T0 u5 M4 f1 o

7 }7 \3 e$ O7 o7 M; \7 Z3 [, pError in ==> spectra2 at 43
: P4 x" L6 a, r' n. wd0=round(AD10(start:stepstart+M*step-step),3)/1.8);! {1 P" s6 X. b$ B1 ^

1 }- t9 |) C; h( w' B由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
9#
 樓主| 發表於 2007-10-15 22:18:15 | 只看該作者

增加附件

∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????
2 a& J, p! }. ]! W2 g附上上帖的附件

評分

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

查看全部評分

10#
發表於 2007-10-15 22:31:57 | 只看該作者
在回答你的問題前我先稍微解說一下我的MATLAB程式
" H3 R- v3 K9 `# b7 n要作FFT必需是sine waveform或者近似sine waveform,所以,我在作DAC的SNR及THD時,必需是輸出信號為sine waveform的記錄數值. E0 N4 E9 ?, V' \( t+ {! @
故而,我利用SPICE中.measure的指令來記錄DAC的輸出信號數值,然後將這些記錄的值存成一個TXT的文字檔,然後再用MATLAB將這個文字檔讀出,再作FFT運算; k4 e, Y4 ]% G0 A7 I8 H  I0 h: B
0 H/ ?( |2 L& c6 }" m1 }
在MATLAB程式中要作FFT運算時,需注意它必須是2的倍數,同時,我在作FFT運算時,先行利用minimum 4-term Blackman-harris Windows的filter來使DAC的輸出信號平順些,當然,你也可以不加,不過,畫出的waveform會有點怪怪的,再者,因為我們記錄的數值是每隔一段時間所記錄的數值,所以畫成連續的圖形時,會很不連貫,所以,一般都會作windows的filter,而我也問過一些比較資深的analog designer此種作法是否恰當,還沒有人對於這種作法感到奇怪,也許大家都是這個樣子作的吧2 l0 {6 D, \9 C! h

0 x* r) r4 J+ _7 z我看不到你的附件檔,故而實在無法作出評論
$ d* X# K* l9 z  T2 k) k而看了一下你所秀出的錯誤訊息,想問一下,MATLAB程式中有AD10這個函式嗎??又或者有沒有AD10這個array??
* }" [. A- r) k. y從錯誤訊息來看,似乎是找不到AD10這個函式或者array,所以才有錯誤
11#
 樓主| 發表於 2007-10-16 15:54:59 | 只看該作者
由於之前一直出現Internet Explorer無法連線訊息~???????0 O( C' a2 f/ ], }' Y0 j
所以重新上傳附件

本帖子中包含更多資源

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

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

有關hspice .measure指令寫法

再請問一下finster副版主,如果我是要將Hspice的電路輸出點Dout,使用.measure指令來記錄ADC的輸出信號數值,暫態分析(TRAN)掃瞄區間:0~3.2msec,7 ^2 b* A) W+ ?* R
指令的寫法是否為:
9 u# w& K& n6 O* _( q2 L3 d+ m6 g7 _& p  G! c3 i7 r
.MEAS TRAN DIGOUT) m6 o- \+ ~: x0 x
+TRIG  V (Dout)  VAL=0        RISE=2" F; f' [+ B; `
+TARG V (Dout)  VAL=3.2m  RISE=22 q$ f) h: }* v! W! u5 r- \, Z

( ]3 s* v: @8 R0 W9 P/ ?) R: I∼還請指教,謝謝∼
% }) P  K3 M4 y' {+ \: A" Y7 e; O0 \) u3 {# O# {) ~  z2 I& Y
另外,我先使用一個小程式去試.measure這個指令,輸出的*.lis只發現以下的數據:
& w6 `3 N: s# B$ X4 m/ P/ T/ M6 M
digout=  3.7443E-09  targ=  1.5167E-07   trig=  1.4792E-076 V; e- c+ i7 L2 V5 K; G

+ F* B* o' V, rHspice輸出檔多了一個*.mt0的檔案,該檔內容同上面之敘述,不知是否還有那邊出錯?; H1 _5 N0 \" y
' C+ e0 e3 D% ]+ i6 t( J8 W+ @2 f
[ 本帖最後由 緣緣 於 2007-10-16 05:34 PM 編輯 ]
13#
發表於 2007-10-16 23:08:40 | 只看該作者
在Hspice執行.measure指令時,它是依據你的.lib的數目來產生相對應的*.mt*檔) z  p3 D8 {. Z( }, A) x; \7 b
故而,如果你的檔案有多出*.mt0的檔案,那表示這是你的.lib的第一個依據.measure所計算出來的資料$ l. H% t6 J7 Y' {6 }
所以,請再檢查一下你的HSPICE檔案吧
: T: |  b; H6 j' ~
* @5 {1 T/ H; a再來,你的.measure指令用法沒有問題4 D% b' U5 S( O0 x+ `# i, f
但,你的取樣點及時間似乎不對8 O! L5 e) x9 M2 y7 m
你的暫態分析(TRAN)掃瞄區間:0~3.2msec,你所用的指令為:
# d/ r) d) b$ W$ {+ d: m, `+ I2 N.MEAS TRAN DIGOUT: w0 ~4 t" `9 i9 H
+TRIG  V (Dout)  VAL=0        RISE=2
* F, x, z/ P, B+TARG V (Dout)  VAL=3.2m      RISE=2* I' u+ `) o9 E1 Q: \5 J% r' ?4 h
寫法沒錯,但,如果是ADC,那其輸出信號為digital,故而,輸出信號的振幅不是0就是vdd,如果要記綠輸出信號的digital code的話9 P- [' w& c; D
那,計算輸出信號的digital code應該依照clock來作取樣時間,而不是0~3.2ms,也就是.measure的VAL要是clock
  W+ f7 V( S3 G0 s另外,若依照你的指令來用,應該會計算不到輸出信號,除非你的模擬時間超過6.4ms,因為你是用RISE=2
0 r7 y# u' A) R$ V; o- Q  }7 b: k再者,如果是用.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程式。
' r6 D$ U6 z+ h7 m
' c+ j1 W) J4 t% F0 u  T5 n∼感激不盡∼
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# j
$ q. g/ k$ A) T3 }) X8 A, P4 X" H8 S& m
* R9 J5 H2 B. ]/ B.MEAS TRAN DIGOUT
. g3 V/ n  [6 k; ^+TRIG  V (Dout)  VAL=0      TD=0.5E-7    RISE=1( Z" a/ w) H+ q' t$ Y3 `! j! f' C2 Y9 v+ j( P$ M! [9 j9 ~1 p
+TARG V (Dout)  VAL=0.976E-7               RISE=10 W/ S- c# |. b9 |$ E% v# L# s

5 N; c: V0 r5 `" p  u0 [# @∼還請指教∼
1 B& K- }" ~* h+ ~/ a& b程式重試的結果,*.mt0檔案只出現:. C$ p" o) ^+ B7 n% x
digout           temper           alter#            8 o4 l, o8 b, t* {1 s, h7 t6 g, N* T
1.890e-12        25.0000           1.0000         ) a+ z+ l4 g' r5 H/ N2 Y& g
不知是否還需修改?$ B  C& C& B0 P! Z1 i

6 W. I1 @5 \* S5 z( A[ 本帖最後由 緣緣 於 2007-10-19 12:11 AM 編輯 ]
16#
發表於 2007-10-19 01:58:58 | 只看該作者
先回答第一個問題8 ~2 n4 z2 O; q, e. S
你的MATLAB程式我大概看了一下,發覺到AD10應該是一個由別人自行撰寫的運算函式,而因為你在MATLAB程式中並沒有這個函式,同時也沒有呼去這個函式,故而,你在執行MATLAB程式時,當然會出現錯誤訊息
6 d% u  i- A, T+ g" i$ J0 f  w' \所以,如果這不是你自己寫的MATLAB程式,那我只能說你的MATLAB程式並不完整,也許,這是別人故意留一手的吧
  _5 n! [# c1 a( N5 X" k$ Y7 D
* X* C! l$ q# \" @" E" }/ r再來,在ADC中的Sample and hold電路若是用SC電路,是會用non-overlap clock,故而會有兩個clock
0 o/ w& V- G' N+ [: M但,源頭的clock只有一個,而這個clock會透過non-overlap circuit去產生兩個時間差的clock# C$ @% T8 Y! n8 S1 d% L
一般而言,ADC的數位電路所需的clock通常都是由源頭的clock作為基準,然後將數位信號輸出,故而,在使用.measure時,所參考的時間及頻率也該是以這個源頭的clock為主,而不是由non-overlap circuit所產生出來的兩個時間差clock,除非,你的ADC電路並沒有包Sample and hold circuit(我不清楚你的電路架構為何,但,ADC一般而言一定要有Sample and hold circuit)8 V8 ?3 N  X+ b$ T
再來,我看了一下你的取樣頻率為5.12Mhz,這是很低的clock頻率,所以,照理來說這麼低的頻率,你的架構應該是採用SAR架構的ADC吧,那你的輸入信號頻率為何呢??另外,你的.tran的時間多久呢???還有,你是幾個bit的ADC呢???( q! O4 W1 L- V. |
舉個例來說,假如你是4-bit ADC,輸出分別為D3,D2,D1,D0,且clock為1MHz,所以使用.measure應該為# Z0 H: z8 X2 b
.MEASURE TRAN DIGOUT_D3_t1 find V(D3) AT=5.2us$ |* m, Y  y* c
.MEASURE TRAN DIGOUT_D2_t1 find V(D2) AT=5.2us
. }! S( X0 H. r/ t* f  [" z.MEASURE TRAN DIGOUT_D1_t1 find V(D1) AT=5.2us# U' j* H9 Y9 V0 r! ~, I/ g
.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=5.2us: q8 N9 |# o. F
. `  M( r' A; g) y" _, ~: a
.MEASURE TRAN DIGOUT_D3_t2 find V(D3) AT=6.2us
- K' Y, K7 [+ \. P. n. @( c3 z- Y.MEASURE TRAN DIGOUT_D2_t2 find V(D2) AT=6.2us
$ S% w+ L: n( [& G6 W0 l2 c.MEASURE TRAN DIGOUT_D1_t2 find V(D1) AT=6.2us0 X* v+ l! Z( w" h* S& ^" s
.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=6.2us
' v* U; u6 L; |1 g$ M7 h0 t, H; u5 ]( T* n  z2 v/ O7 w9 n/ s
我只計算clock的週期,然後再初估ADC中的delay時間為0.2us,所以,我第一個數位取出的時間為第5個clock週期來取出4個bit的digital code,然後在第6個clock週期時又取出第2筆digital code2 L* N. d* e/ l+ I; k6 ^6 m
我用的方式較為簡化些,因為ADC要取出的是在每個clock週期中的digital code,所以,只要精算出每個clock時間,即可簡化.measure的指令,而不用用到TRIG....TARG.....,當然,這是我的作法,你也可以依照我前面寫的改成你用的TRIG...TARG的用法* R) P' P5 @! I" D

2 {: ~. ^& j5 d; a9 u! O最後,像我剛才寫的.MEASURE TRAN DIGOUT_D3 find V(D3) AT=5.2us
& n' x+ ^2 `+ ^# L+ I4 Z; x7 X可以用MATLAB程式寫成一個自我產生的.measure,我以前是用MATLAB來自己產生的,不然,光是計算1024點就要寫4096行.MEASURE指令,那是一件很浪費時間和生命的事,用MATLAB的迴圈即可一下子產生出所有.MEASURE指令,小小作法,提供給你參考
17#
 樓主| 發表於 2007-11-8 15:00:24 | 只看該作者

謝謝finster副版主的詳細解說

再次謝謝finster副版主的詳細解說,我前一陣子剛好有事在忙,沒有及時回復你的問題,還請見諒。
& r9 r! f" W2 q8 N我大概講一下我的架構:4 y+ @! u! W1 u( q
我電路是使用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的指令寫出,指令如下:
( v, D  s7 p- N: PFor Fs=10.24MHz:
( B/ u& l4 x3 P1 M& c6 J+ l3 _# @3 \4 e! iV0 NET2 0  PULSE 0  3.3  0.5E-7    0.976E-10 0.976E-10 0.488E-7 0.976E-7; S) K% A. i9 Y
V1 NET6 0  PULSE 0  3.3  0.988E-7  0.976E-10 0.976E-10 0.488E-7 0.976E-7; }' E) `: E  u) _, U& @" S
For Fs=5.12MHz + `: z2 o7 B2 Q! w6 J
V0 NET2 0  PULSE 0  3.3  0.5E-7    1.952E-10 1.952E-10 0.976E-7 1.952E-7+ F1 [& Q4 \6 M, G: D; v
V1 NET6 0  PULSE 0  3.3  1.476E-7  1.952E-10 1.952E-10 0.976E-7 1.952E-7
+ m8 W% v/ }: @3 l8 w2 [( g另外,我在hspice做FFT運算取的點數為32k,所以根據計算,如果Fs=10.24M,.tran的時間=(1/Fs)*32k=3.2msec,如果Fs=5.12M,.tran的時間=(1/Fs)*32k=6.4msec。
" {: t* J# U. {# l: D& {. L# Y# C如果依照你指令的寫法,根據我的clock=>Fs=5.12M,delay 0.05us的情形下,同樣第一個數位取出的時間為第5個clock週期來取出1個bit的digital code,然後在第6個clock週期時又取出第2筆digital code,寫法是否為:% e0 N  h- [4 c+ z0 S" \/ ?
.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=1.026us
; |% J- ?3 P  f9 d+ x.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=1.2212us
" F- s4 c, R# C然後以此類推,在第7個clock週期時又取出第3筆digital code,如果32k點(二進制),就須寫32768行,這樣對嗎?4 J9 W5 E. _( p% H
你說可以用matlab寫迴圈,可是如果我是將hspice的輸出數據再帶到matlab做計算,那我就需要先在hspice下指令記錄輸出數據,再帶到matlab中,那這樣子變成還是需要在hspice中寫32768行的指令才能記錄數據,或是說有其他辦法可簡化hspice指令?或是就你所言,用MATLAB程式寫成一個自我產生的.measure,但要如何做呢?還請finster副版主多多指教!謝謝!
" \' v  i( x0 h8 Q" A* `% E: l6 Q4 x0 |
[ 本帖最後由 緣緣 於 2007-11-8 03:04 PM 編輯 ]
18#
發表於 2007-11-12 02:06:38 | 只看該作者
看了一下你的說明,覺得有些奇怪的地方
9 P% o3 u2 L7 a/ m( ~; @! C; A首先,我沒作過switched current ADC,不過,依照取樣原理理論來說,取樣頻率需大於輸入信號的兩倍才能夠將原始信號還原回來
0 Z& ^0 X! p: T1 s) y* R- h而你的取樣頻率和輸入信號頻率卻非常地接近,似乎有違取樣原理的理論基礎,不知道這個樣子真的能夠取出真實的信號?
1 F3 w' X3 p0 X# a3 p
; ?) g" U7 Q! l7 b. ]  K再者,FFT運算基本上也是依照取樣原理理論發展出來的,因為FFT的取樣點數是輸入信號的2^N倍,N的最小值為1,也就是FFT的最小取樣頻率是輸入信號的2倍,亦即輸入信號在一個週期內會被取樣2點,而我們所撰寫的FFT來計算SNR,SFDR,THD...也是依此理論陸續往下寫的,所以,看了你的規格,實在覺得有些奇怪
" l: F; c3 @1 Q" K  V0 C
% n( n5 j/ B' `% s# |FFT的取樣點數如我剛才所言是取樣點數是輸入信號的2^N倍,所以,取樣點數為2,4,8,16,32,64,128,256,512,1024,2048,4096...,一般取到1024點或者2048點就已經非常足夠了,因為超過2048點之後所計算出來的SNR,SFDR,THD....其實變化的只有小數點後面幾位的不同而以,取樣到32768點,其實真的不需要# o$ h- r% o( y
. ~/ ^) z9 r0 z
clear all
! B+ s' `3 B$ z/ ~fid=fopen('dual_measure_rms.txt','w')
7 O3 `8 A6 i, v5 `0 Qfor M=1:1:1024
- |% l; W! E1 h* x- M) Y       T=M-1;
' J  i- _  v8 D; p) V2 j       from=(50*T)+45; %DUAL DAC measure time3 Q' i7 @( v5 y9 D& m
       to=50+(50*T);
/ e; J8 }+ @/ d2 K; F0 O6 N       fprintf(fid,'.MEASURE TRAN A%g RMS v(daci_outp) from=%gn to=%gn\n',M,from,to);
& L5 t$ x! h2 K5 F. ^# t' Pend; H1 m! N4 F/ r
MATLAB程式會產生一個dual_measure_rms.txt檔,你將這個檔裡面的.MEASURE複製到HSPICE中即可,不過,如我前面所言,取樣頻率是輸入信號的2^N倍,然後再算出我的取樣點的時間點為何,如果不知道這些關係式,那這個MATLAB程式將無法使用8 t8 D+ E; E$ ^. }5 A4 w
這個程式很簡單,只是一個迴圈再加上幾行計算時間的式子
19#
發表於 2007-11-12 12:02:56 | 只看該作者
感謝Finster提供一個非常實用的小技巧
# a# |2 {4 {: t; a$ q1 R; P這樣以後模擬FFT就非常方便了. T' [3 v% E, `& m! [0 \9 ~8 f
看一下應該是先計算好要取樣點的時間間隔 也就是sample clcok的時間, R# G; W; ^* K1 L# j- h
然後譬如取1024個點 就用Matlab產生1024個.measure指令敘述吧: U% @  H9 ~" |2 H1 y. V
只是我Matlab指令不熟 看來這些程式碼還得花點時間弄清楚一下
20#
 樓主| 發表於 2007-11-13 15:58:41 | 只看該作者

再次感謝Finster的詳細解說

首先我想請問副版主finster,你說我的取樣頻率和輸入信號頻率非常地接近,在取樣頻率Fs=10.24MHz的條件下,不知這裡輸入信號頻率指的是輸入信號頻率10K,還是輸入信號頻寬頻率40K?9 B& t' [" k5 i0 j
我解釋一下我為何要用fin=10k,Fs=10.24MHz的原因:& q  f  j) H$ m$ {
因為我的Fs=10.24M,所以我的Fin=10.24M/1024=10k,會取1024倍的原因是之前曾上過ADC的課程,上課的講師提到由數位信號處理(DSP)的理論,Fs=1024*Fin的情形下,頻譜比較不會產生leakage。. t2 q4 a; d& D1 w1 o6 q- e$ O0 Q
且如果以我的規格來看,我的OSR=Fs/2Fb=10.24M/(2*40k)=128,我是希望縮小Bandwidth提高OSR,進而提高SNR,可是我們老闆堅持要做到40k以上,所以,在無法提高取樣頻率Fs的情形下,只能維持OSR=128來設計。0 _/ A9 f9 o' A5 Z7 i/ W0 ]
另外,為何FFT運算要取32K points,是因為我看相關的論文,幾乎都是取16k或32k points,然後我在hspice使用FFT指令來計算的結果,好像32k points以上圖形比較像SNDR的圖形,所以才用32k points,後來再問其他人員,SNDR要由matlab做計算,輸出的圖形才準,論文中提到matlab計算的點數大多也是32K points,也因此,我也才想用32k points去計算FFT。2 a3 U/ d% M7 G2 a7 \3 g. P
依照你所言,由於我的Fs是Fin的1024倍,所以,我的FFT只需取1024點即可,依照你的.measure迴圈程式,我將程式更改為:
9 @; C; J% e4 O/ kclear all) N9 Z1 U, Y  Q' ^$ f  F
fid=fopen('sdm_out.txt','w')! L$ b& A: I) H+ x% v8 G7 Y/ ^
for M=1:1:1024
$ e/ G" S1 G, C5 I' ]' U  H8 a0 H    T=M-1;2 o; u/ B7 w3 c( C& m( A: e
    AT=(0.1952*T)+1.026; %SDM measure time8 d5 J. ?3 @$ [5 \  |% H9 t- A
    fprintf(fid,'.MEASURE TRAN DIGOUT_t%g find V(D0) AT=%gu',M,AT);
6 y/ N8 q7 e+ q1 ?5 V  G& R# [end! g# m: ~/ c* p- a, j5 |8 C
試的結果,可得到1024行.MEASURE的指令,我會把他代入hspice程式跑跑看。. y0 C' D1 H; g9 j1 H
想再請問的是:
. n3 s  m" u% T1 j當我使用.MEASURE指令得到數據後,是不是還要在你提供的SNDR&SNR的Matlab程式前加上load指令,例如:, q5 S- j% l+ t
load sdm_out.txt -ascii ;%sdm_out.txt is output digital code of SDM
/ Z' m3 P. S+ e6 p( [* l7 w然後就可算出SNDR及SNR以及畫出圖形了嗎?) f- [- w. C& [6 X6 O9 L$ C& q
請指教∼
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-11-16 02:43 PM , Processed in 0.203012 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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