Chip123 科技應用創新平台

標題: 如何將Hspice資料轉進MATLAB計算 [打印本頁]

作者: 緣緣    時間: 2007-10-4 10:57 PM
標題: 如何將Hspice資料轉進MATLAB計算
我現在在設計一個三角積分調變器(sigma delta modulator),電路完成後,我用Hspice做FFT(快速傅立葉轉換)求得SNDR(Signal to Noise plus distortion ratio),但我看其他論文秀出來的都是再經Matlab轉出來的圖形,請問,hspice要如何轉換成matlab畫出SNDR及DR(Dynamic Range)?包含方法及指令,愈詳細愈好。拜託有高手能相告。
8 w' R' o6 }! t, o; j; ?謝謝!
作者: monkeybad    時間: 2007-10-5 06:42 PM
我之前做ADC再算SNR有用過一個方法 可是很爛 但是還勉強可以用1 a6 ?1 l: c8 n* f' r" ~
就是直接用.print指令把你要量的電壓印出來/ ^% z  f% t. r: z4 w+ k! |  R
然後再用手動把印出來的資料copy起來5 b7 X) C- G4 J, M
然後貼在Matlab程式上面 然後就可以做FFT了
作者: 緣緣    時間: 2007-10-5 09:39 PM
標題: 謝謝版主回復
謝謝版主的回覆及支援,我之前有找到一個MATLAB的應用軟體叫做HspiceToolbox,可以將hspice輸出的檔案透過HspiceToolbox將檔案轉入MATLAB中,也可用MATLAB叫出hspice電路中各節點的信號,只是,接下來MATLAB要用何種指令才能算出電路輸出點的SNDR及DR,我知道可以將MATLAB的指令整合成一個副檔名為m的檔案,不知版主或其他高手有沒有這方面的指令寫法或是m檔案,那就感激不盡了。
$ U3 b/ @4 B$ K/ x  V. y/ @
5 [+ y& w2 P. l/ Q! L* U6 _' \5 g9 x謝謝!
作者: sjhor    時間: 2007-10-8 09:40 AM
Matlab 有 fft 的  program, " d/ P  |* y- }0 K: I+ n+ M1 O; g
所以  只要將FFT後的資料  做一些轉換就可以唷!!
; g) E2 |6 c* z3 O: {將主信號找出來!!  然後將"所有的 fft power 加起來 - 主信號的 power"6 T9 N5 G! p3 q
就可以換算  SNDR 了!!0 E# p4 S, [# Y3 E0 i. D
SNDR is Signal to (Noise + THD) ratio?
作者: 緣緣    時間: 2007-10-11 05:44 PM
謝謝sjhor版主的回復,我正上Matlab網站努力尋找資料中。
作者: finster    時間: 2007-10-13 08:20 AM
我以前作DAC的MATLAB部份程式
0 A  G: ~. x1 ~- z( ^我想,應該可以給你一些參考吧
: E7 n" I# n* d# d! q
% {% H4 z3 N) E% --------------Using minimum 4-term Blackman-harris Windows -------------, \+ m/ Y* v. i1 g; S: I
nb=1:1ts;1 Q' m( Q$ c9 y- R8 P( t
kb=0.355768-0.487396*cos(2*pi*nb/(pts))+0.144232*cos(4*pi*nb/(pts))-0.012604*cos(6*pi*nb/(pts));$ y$ ?# f6 E# Q
win_gain=sum(kb)/pts;
/ H0 u, D0 |8 w: s! dkb=kb/win_gain;
# `$ M9 d2 J: I# O$ \  O2 n3 p! f
  V; q/ S1 x8 A% w% --------------- Calculated fft --------------------------2 y: O  R6 V6 v
yb=kb.*x(ptsttfi);
0 F$ L7 p4 ]; g1 R+ |( ~5 B# N0 \yk=fft(yb);/ o/ p, V6 m6 W) [
fft_no=length(yk);
' H. x. u, `& x4 e( o1 S* uf=fs*(0:fft_no-1)/fft_no;
: j' R( C8 ~/ w- n! ?# MPyy=yk.*conj(yk)/((fft_no/2)^2);
3 y* T3 x# X; l- S6 Q& x8 p5 o1 W8 g- Q
% ---------- Calculate THD ----------------------------
5 N/ Y! o( z( I+ vj=1;
: |: l. t% S  Y6 C. t, }' ?for i=1:1fft_no/2)
  X* k1 e+ q% w7 g5 r    if (f(i) == (fi*j))% f: m' W, K( K* f0 G) J7 F, ^. V, p
        HD(j)=Pyy(i);     %% find all harmonic distortion components# z( d3 {2 T( V& Y
        j=j+1;9 [9 H- K8 m/ N0 f4 U3 T
    end, v0 j  d% Z) L; ]
end/ B: N* ~. ^4 f& M, Q" `2 }
P_hd=sum(HD(2:9));* h5 Q0 L# n( d
THD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal
0 O" k; C/ @8 X/ E) I$ M# e% ~fprintf('THD = %g dB\n',THD);
  J2 S6 L6 ]; W1 a( r
) w1 F1 _/ P* h) P8 B% ---------- Calculate SNR ----------------------------
* W& L: O# M8 K- l* Pfundamen_dB=max(10*log10(Pyy(1:fft_no/2)));
7 Z  p2 y! t% [: y) ffundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);
% |3 N2 w3 t- x: w8 e8 l. Tspan=max(round(fft_no/200),5);) a6 P1 X% K" t3 P4 }
P_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));7 o* B" `% t0 X5 A5 v

6 ]7 H) L1 F  qP_noise1=sum(Pyy(1:fft_no/2))-P_sig-P_hd;
! ~  I' J' V$ [$ tSNR1=10*log10(P_sig/P_noise1);9 t# l+ Z# Z- J$ Q) w! i
fprintf('SNR = %g dB\n',SNR1);
作者: 緣緣    時間: 2007-10-15 07:34 PM
標題: 謝謝副版主回復
謝謝finster副版主回復,想再請問一下:
3 D' J0 M6 B! I5 n請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。! F& `9 R. `: @2 e& J- I. d3 }
$ l$ @. z3 l6 b) U7 M5 W/ m
另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:
) q2 }* I2 |% x. }8 z/ {"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"7 H# Z9 r& R% f- h
內容為:
: X! P" Z& a* H1 ^压缩文件共有三个文件:两个m文件和一个txt文件
: s9 I. p8 X) O2 J) N2 H/ n% bspectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。) D$ f; t+ z0 x$ ~( V0 F1 f
希望大家喜欢!! " u" R# K$ q& W
附件為:FFT.rar
* q# j; d3 r( l" |( _. z
* U" S+ Z/ c- |% H$ G$ O! ~- }我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:5 |/ X, O" Y- E# D' R

0 [) M+ Z. T0 O( U' n??? Undefined command/function 'AD10'.
, D4 Q  F( @! |% c$ R* y/ p. A1 m2 n9 F8 C1 L2 s* J
Error in ==> spectra2 at 43) U) w! ~1 H/ k; _7 V7 x2 F
d0=round(AD10(start:stepstart+M*step-step),3)/1.8);
% ?' c0 j- \; o) y9 F) a
4 D- J1 i5 D" R由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!% g" T3 C* c, M/ O% ?8 B) n

% R1 [9 e. z0 ^* J! g∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????
2 C- j) A3 C$ d0 I3 W; N9 z  \! C* i8 V0 Z: L7 t( H* N
[ 本帖最後由 緣緣 於 2007-10-15 07:54 PM 編輯 ]
作者: 緣緣    時間: 2007-10-15 08:54 PM
標題: 謝謝副版主回復
謝謝finster副版主回復,想再請問一下:( }5 e. z0 ^. G% @
請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。
5 X. P! O( O  r5 q  V9 e2 r另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:3 d! Y' v4 M4 {0 U5 d3 N1 l$ f
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"
$ U& ]& u3 V1 ], i: B. T內容為:
1 S% ?" Y& K5 b5 g压缩文件共有三个文件:两个m文件和一个txt文件) g  I+ N1 k  ~  `% X
spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。
( h- K3 E2 @8 b$ C希望大家喜欢!!
3 n4 L& E- [8 a( M% {# x( U& R* m! G附件為:FFT.rar' P  x6 t6 f3 B* ]
% m5 \* E$ e& X3 ]! o+ O+ E
我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:
& b: l! _- B6 \" c8 L* y; y. Z
9 ?9 s* O  }2 T4 h* o??? Undefined command/function 'AD10'.
; s' U. F! ?* r/ y
: h5 v* `6 d( o! ^  e; vError in ==> spectra2 at 43& j( X. U$ A; M+ F4 L
d0=round(AD10(start:stepstart+M*step-step),3)/1.8);9 t( K6 t1 U' C- x1 s0 W# O" l

! m6 i2 j0 W, N7 F( @由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
作者: 緣緣    時間: 2007-10-15 10:18 PM
標題: 增加附件
∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????- }# F$ J: D5 v, v7 Y
附上上帖的附件
作者: finster    時間: 2007-10-15 10:31 PM
在回答你的問題前我先稍微解說一下我的MATLAB程式
+ |4 @0 U% l3 }8 }  V; t: D4 X要作FFT必需是sine waveform或者近似sine waveform,所以,我在作DAC的SNR及THD時,必需是輸出信號為sine waveform的記錄數值
% K# f& Q% K  V* g1 J+ w1 [故而,我利用SPICE中.measure的指令來記錄DAC的輸出信號數值,然後將這些記錄的值存成一個TXT的文字檔,然後再用MATLAB將這個文字檔讀出,再作FFT運算
  {  S4 x& ~. t/ I
' L! A$ B8 @. ?/ c! m; d在MATLAB程式中要作FFT運算時,需注意它必須是2的倍數,同時,我在作FFT運算時,先行利用minimum 4-term Blackman-harris Windows的filter來使DAC的輸出信號平順些,當然,你也可以不加,不過,畫出的waveform會有點怪怪的,再者,因為我們記錄的數值是每隔一段時間所記錄的數值,所以畫成連續的圖形時,會很不連貫,所以,一般都會作windows的filter,而我也問過一些比較資深的analog designer此種作法是否恰當,還沒有人對於這種作法感到奇怪,也許大家都是這個樣子作的吧
+ L% N) p% V- J$ C  u% P% y! t+ T
  D/ z+ ~* I2 a" G; L* A我看不到你的附件檔,故而實在無法作出評論
" w% A1 m0 J, |1 C而看了一下你所秀出的錯誤訊息,想問一下,MATLAB程式中有AD10這個函式嗎??又或者有沒有AD10這個array??
5 W" s8 Z6 `4 Z  N$ j" \3 l+ \從錯誤訊息來看,似乎是找不到AD10這個函式或者array,所以才有錯誤
作者: 緣緣    時間: 2007-10-16 03:54 PM
由於之前一直出現Internet Explorer無法連線訊息~???????
$ r' f$ D$ Z" l4 K3 I( x! x所以重新上傳附件
作者: 緣緣    時間: 2007-10-16 05:02 PM
標題: 有關hspice .measure指令寫法
再請問一下finster副版主,如果我是要將Hspice的電路輸出點Dout,使用.measure指令來記錄ADC的輸出信號數值,暫態分析(TRAN)掃瞄區間:0~3.2msec,
0 c% N3 n- K3 G" {+ R  ?) j" B指令的寫法是否為:
) B+ H+ {% @- J% s" W! @$ G, t8 @
.MEAS TRAN DIGOUT' Q6 j" x! \4 p  Q
+TRIG  V (Dout)  VAL=0        RISE=2
  g4 Q! \- ~! z' W- n+TARG V (Dout)  VAL=3.2m  RISE=2
; @, ?: Z3 S/ c6 l7 x6 v: N$ {# P9 Y
∼還請指教,謝謝∼4 x; ^  b6 z8 p: v+ _1 L
3 E2 i+ o$ K) k9 t
另外,我先使用一個小程式去試.measure這個指令,輸出的*.lis只發現以下的數據:  f* }( u  m; g
1 O0 g. ^3 t5 s. s6 H& H3 Y
digout=  3.7443E-09  targ=  1.5167E-07   trig=  1.4792E-07- l$ [: l+ F2 Q8 k
1 q6 I  K+ f" F. d. b: x
Hspice輸出檔多了一個*.mt0的檔案,該檔內容同上面之敘述,不知是否還有那邊出錯?) V/ q+ u* t- J+ k

% \, N3 v8 K) N- o9 i[ 本帖最後由 緣緣 於 2007-10-16 05:34 PM 編輯 ]
作者: finster    時間: 2007-10-16 11:08 PM
在Hspice執行.measure指令時,它是依據你的.lib的數目來產生相對應的*.mt*檔* l+ m6 S+ W( P1 \
故而,如果你的檔案有多出*.mt0的檔案,那表示這是你的.lib的第一個依據.measure所計算出來的資料+ ?1 F  M9 l! w
所以,請再檢查一下你的HSPICE檔案吧
* C2 r1 P% _( i; c  Z, S2 u
+ I9 }0 n& U3 j0 u( R再來,你的.measure指令用法沒有問題
, K9 V, ]( W) U/ f9 a  `7 a但,你的取樣點及時間似乎不對
; i6 Y; T% Q. J& t) R/ H你的暫態分析(TRAN)掃瞄區間:0~3.2msec,你所用的指令為:
/ G5 r( f9 ?/ n9 X2 p.MEAS TRAN DIGOUT* l! X- m- M) L# _, n1 h
+TRIG  V (Dout)  VAL=0        RISE=2
( E- B$ c  Z  u: _( }% s+TARG V (Dout)  VAL=3.2m      RISE=2; ~. l# E2 y4 H5 U* T! t5 I# E! m8 ~
寫法沒錯,但,如果是ADC,那其輸出信號為digital,故而,輸出信號的振幅不是0就是vdd,如果要記綠輸出信號的digital code的話5 _3 y9 t, y& z) y* }; r
那,計算輸出信號的digital code應該依照clock來作取樣時間,而不是0~3.2ms,也就是.measure的VAL要是clock9 f% H. u! X1 t& P
另外,若依照你的指令來用,應該會計算不到輸出信號,除非你的模擬時間超過6.4ms,因為你是用RISE=2
- n3 l( s9 U  N: x1 L' f: }# R" w6 W再者,如果是用.measure來計算digital code,那如果以rise edge作基準則應該用RISE=1,而不是RISE=2,這是很嚴重的錯誤,除非你的clock及取樣有delay 1個clock的作用在,如果是以fall edge則是FALL=1,若是以你RISE=2,那你取樣出來的digital code應該都是錯誤的
作者: 緣緣    時間: 2007-10-17 02:02 PM
標題: 再次謝謝Finster的回復
再次謝謝Finster的回復,我會依照你的方法再重試一遍,另外在麻煩你幫我看看上傳的ADC Matlab程式。
/ y5 u5 q, @9 R/ j6 e' p3 S8 K) z+ u& F1 p. u. [
∼感激不盡∼
作者: 緣緣    時間: 2007-10-18 11:59 PM
再請問一下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# j5 d4 D7 t. d7 y* l' E/ W$ }
3 }) X8 A, P4 X" H8 S& m
8 R- r, P5 h! p2 G) l3 A) }.MEAS TRAN DIGOUT0 L. ^" I" n3 v, f2 U7 C. Q
+TRIG  V (Dout)  VAL=0      TD=0.5E-7    RISE=1( Z" a/ w) H+ q' t$ Y3 `! j! f( r, E  Q& J: \% U# d
+TARG V (Dout)  VAL=0.976E-7               RISE=1# R* d* V5 k2 j4 r, K
8 z9 z$ f' M" E" C) d; G
∼還請指教∼
3 B, W0 O/ B3 x4 d  j程式重試的結果,*.mt0檔案只出現:/ T4 B- r; [! }7 u2 ]
digout           temper           alter#            
/ S) o3 r7 s, g2 j$ L1.890e-12        25.0000           1.0000         
$ V% l- e# i9 a: V+ h( J, A8 Z不知是否還需修改?
9 S, K( ^; [% M1 F% e! C  R3 f% o! a, }6 i) l
[ 本帖最後由 緣緣 於 2007-10-19 12:11 AM 編輯 ]
作者: finster    時間: 2007-10-19 01:58 AM
先回答第一個問題
) K1 _: M: S2 o& b! Z9 e: G你的MATLAB程式我大概看了一下,發覺到AD10應該是一個由別人自行撰寫的運算函式,而因為你在MATLAB程式中並沒有這個函式,同時也沒有呼去這個函式,故而,你在執行MATLAB程式時,當然會出現錯誤訊息
4 u7 N, I1 C- W8 \0 ^4 X所以,如果這不是你自己寫的MATLAB程式,那我只能說你的MATLAB程式並不完整,也許,這是別人故意留一手的吧6 V& F, g$ E6 M+ j( j& w

& \$ \% r, a, a$ B再來,在ADC中的Sample and hold電路若是用SC電路,是會用non-overlap clock,故而會有兩個clock# ~3 u* y4 \0 z+ [: k! x) u
但,源頭的clock只有一個,而這個clock會透過non-overlap circuit去產生兩個時間差的clock: o8 v7 F: k2 `) y. U: [
一般而言,ADC的數位電路所需的clock通常都是由源頭的clock作為基準,然後將數位信號輸出,故而,在使用.measure時,所參考的時間及頻率也該是以這個源頭的clock為主,而不是由non-overlap circuit所產生出來的兩個時間差clock,除非,你的ADC電路並沒有包Sample and hold circuit(我不清楚你的電路架構為何,但,ADC一般而言一定要有Sample and hold circuit)! _, h9 `  G" M8 S6 N) R1 e0 v
再來,我看了一下你的取樣頻率為5.12Mhz,這是很低的clock頻率,所以,照理來說這麼低的頻率,你的架構應該是採用SAR架構的ADC吧,那你的輸入信號頻率為何呢??另外,你的.tran的時間多久呢???還有,你是幾個bit的ADC呢???( f* E  C6 F& ?6 Q* ~! m6 D1 E
舉個例來說,假如你是4-bit ADC,輸出分別為D3,D2,D1,D0,且clock為1MHz,所以使用.measure應該為
) v$ }5 ^4 t1 e5 A. \+ l0 m, t.MEASURE TRAN DIGOUT_D3_t1 find V(D3) AT=5.2us
- g8 U+ I4 p1 c5 d* {+ Y.MEASURE TRAN DIGOUT_D2_t1 find V(D2) AT=5.2us
% V3 e: }! N5 c6 @2 c6 H1 j.MEASURE TRAN DIGOUT_D1_t1 find V(D1) AT=5.2us6 L' V$ M9 `1 l: u9 z
.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=5.2us8 |* |" i3 L. W9 E3 {. y+ S

" G+ \9 B. d( `$ t- v.MEASURE TRAN DIGOUT_D3_t2 find V(D3) AT=6.2us
8 P4 t$ D# N! p.MEASURE TRAN DIGOUT_D2_t2 find V(D2) AT=6.2us
! n, @& O7 f% E: p( F.MEASURE TRAN DIGOUT_D1_t2 find V(D1) AT=6.2us" H" d0 @2 S2 G( |! ?
.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=6.2us; _4 m4 N3 i2 }) g) x+ A$ T' D- N
8 I; f' ?! q; }" O$ m: ?
我只計算clock的週期,然後再初估ADC中的delay時間為0.2us,所以,我第一個數位取出的時間為第5個clock週期來取出4個bit的digital code,然後在第6個clock週期時又取出第2筆digital code8 o6 C3 }* t3 {
我用的方式較為簡化些,因為ADC要取出的是在每個clock週期中的digital code,所以,只要精算出每個clock時間,即可簡化.measure的指令,而不用用到TRIG....TARG.....,當然,這是我的作法,你也可以依照我前面寫的改成你用的TRIG...TARG的用法
( Z, L5 y: v9 @& U0 V" X; `4 l" e4 F7 _2 Q0 m2 ?7 |
最後,像我剛才寫的.MEASURE TRAN DIGOUT_D3 find V(D3) AT=5.2us
+ e- J( i# l9 Y/ n7 \可以用MATLAB程式寫成一個自我產生的.measure,我以前是用MATLAB來自己產生的,不然,光是計算1024點就要寫4096行.MEASURE指令,那是一件很浪費時間和生命的事,用MATLAB的迴圈即可一下子產生出所有.MEASURE指令,小小作法,提供給你參考
作者: 緣緣    時間: 2007-11-8 03:00 PM
標題: 謝謝finster副版主的詳細解說
再次謝謝finster副版主的詳細解說,我前一陣子剛好有事在忙,沒有及時回復你的問題,還請見諒。
) _5 Q" J7 @: G  n, _我大概講一下我的架構:4 G) q! P  D; g. C3 X
我電路是使用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的指令寫出,指令如下:
3 O1 f$ C4 V& z) {- _+ fFor Fs=10.24MHz:
0 M3 h; R  g2 `0 ?. KV0 NET2 0  PULSE 0  3.3  0.5E-7    0.976E-10 0.976E-10 0.488E-7 0.976E-7
0 ]( v& q* M2 x3 i2 v, CV1 NET6 0  PULSE 0  3.3  0.988E-7  0.976E-10 0.976E-10 0.488E-7 0.976E-7
  K9 y6 `7 o. d, g% vFor Fs=5.12MHz 1 r1 n# E/ V4 M! n' |  W
V0 NET2 0  PULSE 0  3.3  0.5E-7    1.952E-10 1.952E-10 0.976E-7 1.952E-76 C& s- G5 p+ m+ {
V1 NET6 0  PULSE 0  3.3  1.476E-7  1.952E-10 1.952E-10 0.976E-7 1.952E-77 J; K3 w; [) |+ R: H
另外,我在hspice做FFT運算取的點數為32k,所以根據計算,如果Fs=10.24M,.tran的時間=(1/Fs)*32k=3.2msec,如果Fs=5.12M,.tran的時間=(1/Fs)*32k=6.4msec。" ^4 V0 A" e( C# O% M( T+ G
如果依照你指令的寫法,根據我的clock=>Fs=5.12M,delay 0.05us的情形下,同樣第一個數位取出的時間為第5個clock週期來取出1個bit的digital code,然後在第6個clock週期時又取出第2筆digital code,寫法是否為:
: r9 S2 V/ @" ~/ P. m.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=1.026us1 ?1 S: |; t. \+ T- G- Q( s
.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=1.2212us) i' t, {1 o! `1 q6 S. a. B$ Z
然後以此類推,在第7個clock週期時又取出第3筆digital code,如果32k點(二進制),就須寫32768行,這樣對嗎?
" K; r5 `& D! l3 N6 f0 [; ]: o8 c你說可以用matlab寫迴圈,可是如果我是將hspice的輸出數據再帶到matlab做計算,那我就需要先在hspice下指令記錄輸出數據,再帶到matlab中,那這樣子變成還是需要在hspice中寫32768行的指令才能記錄數據,或是說有其他辦法可簡化hspice指令?或是就你所言,用MATLAB程式寫成一個自我產生的.measure,但要如何做呢?還請finster副版主多多指教!謝謝!7 ~% O* m' J, _

2 x% W0 b+ E# P# I0 Q[ 本帖最後由 緣緣 於 2007-11-8 03:04 PM 編輯 ]
作者: finster    時間: 2007-11-12 02:06 AM
看了一下你的說明,覺得有些奇怪的地方! I; V# T$ @2 i/ Q, W
首先,我沒作過switched current ADC,不過,依照取樣原理理論來說,取樣頻率需大於輸入信號的兩倍才能夠將原始信號還原回來$ x! F* g! X& K/ {+ Q  b* X
而你的取樣頻率和輸入信號頻率卻非常地接近,似乎有違取樣原理的理論基礎,不知道這個樣子真的能夠取出真實的信號?& T, F; J2 x- M) F, N0 V, ~: E( b! C

. `. c! t, p: [# d( ^! Z1 V$ @再者,FFT運算基本上也是依照取樣原理理論發展出來的,因為FFT的取樣點數是輸入信號的2^N倍,N的最小值為1,也就是FFT的最小取樣頻率是輸入信號的2倍,亦即輸入信號在一個週期內會被取樣2點,而我們所撰寫的FFT來計算SNR,SFDR,THD...也是依此理論陸續往下寫的,所以,看了你的規格,實在覺得有些奇怪1 L4 N5 S+ f' G; T/ P. C
* z7 F( p6 Y# Y. ?% [9 L3 J
FFT的取樣點數如我剛才所言是取樣點數是輸入信號的2^N倍,所以,取樣點數為2,4,8,16,32,64,128,256,512,1024,2048,4096...,一般取到1024點或者2048點就已經非常足夠了,因為超過2048點之後所計算出來的SNR,SFDR,THD....其實變化的只有小數點後面幾位的不同而以,取樣到32768點,其實真的不需要
6 S4 b& l# K5 p/ y% G+ q. D; }1 F$ Y! N8 j1 f
clear all) N. u  C4 P2 y( I) v
fid=fopen('dual_measure_rms.txt','w')
" S' u8 @) f3 }8 [  x" f# L3 _& Ofor M=1:1:10244 l2 n+ I: ?: `
       T=M-1;
  {' {& [8 A6 l/ T3 T/ h       from=(50*T)+45; %DUAL DAC measure time" q% G# p* u; @) \
       to=50+(50*T);8 r  d; v: D; g
       fprintf(fid,'.MEASURE TRAN A%g RMS v(daci_outp) from=%gn to=%gn\n',M,from,to);
4 f: T9 e/ D0 y  A2 Hend% I! h$ ?0 L6 U' \
MATLAB程式會產生一個dual_measure_rms.txt檔,你將這個檔裡面的.MEASURE複製到HSPICE中即可,不過,如我前面所言,取樣頻率是輸入信號的2^N倍,然後再算出我的取樣點的時間點為何,如果不知道這些關係式,那這個MATLAB程式將無法使用* G& o; W9 Z- Q
這個程式很簡單,只是一個迴圈再加上幾行計算時間的式子
作者: monkeybad    時間: 2007-11-12 12:02 PM
感謝Finster提供一個非常實用的小技巧
9 \9 q7 z+ W/ B& v這樣以後模擬FFT就非常方便了
: W( Y: |" B, u看一下應該是先計算好要取樣點的時間間隔 也就是sample clcok的時間
4 A) V0 E; r- ^' I- U) @然後譬如取1024個點 就用Matlab產生1024個.measure指令敘述吧* q7 Y" L6 I4 Z4 W- \2 t# P- F
只是我Matlab指令不熟 看來這些程式碼還得花點時間弄清楚一下
作者: 緣緣    時間: 2007-11-13 03:58 PM
標題: 再次感謝Finster的詳細解說
首先我想請問副版主finster,你說我的取樣頻率和輸入信號頻率非常地接近,在取樣頻率Fs=10.24MHz的條件下,不知這裡輸入信號頻率指的是輸入信號頻率10K,還是輸入信號頻寬頻率40K?$ I/ `6 \: s9 ], f
我解釋一下我為何要用fin=10k,Fs=10.24MHz的原因:
6 H( o  d7 h* }3 s, H因為我的Fs=10.24M,所以我的Fin=10.24M/1024=10k,會取1024倍的原因是之前曾上過ADC的課程,上課的講師提到由數位信號處理(DSP)的理論,Fs=1024*Fin的情形下,頻譜比較不會產生leakage。
# ^3 N5 i5 K- V( q6 a3 `且如果以我的規格來看,我的OSR=Fs/2Fb=10.24M/(2*40k)=128,我是希望縮小Bandwidth提高OSR,進而提高SNR,可是我們老闆堅持要做到40k以上,所以,在無法提高取樣頻率Fs的情形下,只能維持OSR=128來設計。
$ [7 a' P7 l; h6 U- {  h. T4 e+ e9 z6 M另外,為何FFT運算要取32K points,是因為我看相關的論文,幾乎都是取16k或32k points,然後我在hspice使用FFT指令來計算的結果,好像32k points以上圖形比較像SNDR的圖形,所以才用32k points,後來再問其他人員,SNDR要由matlab做計算,輸出的圖形才準,論文中提到matlab計算的點數大多也是32K points,也因此,我也才想用32k points去計算FFT。0 r, L" v, C& \% E- h; u
依照你所言,由於我的Fs是Fin的1024倍,所以,我的FFT只需取1024點即可,依照你的.measure迴圈程式,我將程式更改為:
! G0 ?1 h1 I+ n5 G0 |" j- M  lclear all5 D8 @" c" F7 r' W0 c9 V  a8 S' u; Q6 V
fid=fopen('sdm_out.txt','w'): u0 w& O) X/ x( G
for M=1:1:1024- w3 C1 H' {7 ]" s9 u
    T=M-1;3 k3 M0 {$ L. g  I* y% s9 \5 S& V
    AT=(0.1952*T)+1.026; %SDM measure time
  d( i/ x9 P' E    fprintf(fid,'.MEASURE TRAN DIGOUT_t%g find V(D0) AT=%gu',M,AT);+ h! Q+ [  i3 M. K: i
end% P& k) w1 T' S( y) |% h
試的結果,可得到1024行.MEASURE的指令,我會把他代入hspice程式跑跑看。
) C/ P1 G: g$ ]+ p+ H9 e* q$ {1 |  i想再請問的是:0 `( k" h) U. c6 ], P
當我使用.MEASURE指令得到數據後,是不是還要在你提供的SNDR&SNR的Matlab程式前加上load指令,例如:$ ]' M* o4 D0 i, |4 d& v. D" b! s
load sdm_out.txt -ascii ;%sdm_out.txt is output digital code of SDM
; F. R# }$ N! v然後就可算出SNDR及SNR以及畫出圖形了嗎?
" q- G# T4 W/ K0 ]7 a1 K請指教∼
作者: finster    時間: 2007-11-14 06:03 AM
不好意思,昨天一時眼花沒看清楚單位,把Fin的KHz看成MHz,sorry....
1 r" D, z! U. J6 ?! V1 W所以才會說你的取樣頻率和輸入信號頻率非常地接近,這是我這方面的缺失
# C/ B1 w, q7 A" N0 q8 R: g: N: f5 P: I
至於FFT取樣點的問題,我之前是作88MHz,10-bit dual channel DAC,我之前有比較過FFT取樣2048點和4096點,甚至是8192點的差別,結果誠如我前面所言,MATLAB跑出來的結果只有小數點後面3位-5位之後才有差異,前面的數值都是一樣的,所以我才會說一般取到1024點或者2048點就已經非常足夠了
. E! f' U5 P1 d5 Y2 n而且,用SPICE跑模擬從2048點到4096點的時間非常地久,所增加的時間可能不只一倍,而是數倍,可是從MATLAB所計算出來的卻是差異不大,故而,如果paper提供到這麼大的取樣點,那就跑吧,只不過,時間會非常地久,印象中,我之前跑2048點的SPICE模擬DAC大概需要5-7天,而取樣到4096點大概就增加到接近三週的時間,這,純是個人以前的小小經驗,如果是ADC的話,那會更久
1 O2 r& r  M  j# c! I' p8 \: S# d* v9 K$ H5 u; C. Z$ P
至於另外個問題,我的回答是,對的
' Y  D9 D6 \/ n& i3 I' A但,要先把一些參數改成你們自己的規格才行
作者: monkeybad    時間: 2007-11-14 05:04 PM
我補充一下  z# D; a& S4 s
緣緣網友應該是在作over-sampling的ADC 跟Finster作的架構不太一樣& {( x% U2 _- Q  F$ z% I4 ^
video DAC or ADC 跟Finster講的一樣 取樣1024以上其實模擬結果就差不多了' D1 w# J) C3 I4 W' \
至少我模擬起來也是這樣6 u6 [. m' U- t, K
而over-sampling的架構 顧名思義 就是以超取樣來提高SNR 藉以換取高解析度的ADC
7 F+ }1 p6 [4 T; K& e所以我想取樣點很多應該是正常的吧
作者: 緣緣    時間: 2007-11-26 04:38 PM
標題: 非常謝謝finster副版主的詳細解說與monkeybad版主的指導
再次謝謝finster副版主的詳細解說與monkeybad版主的指導。
' }1 x7 m. c6 x- k( A* y說來好笑,我本身出了一個小烏龍,我從11/13回帖後,就一直期待finster副版主的回復,所以我幾乎每天都上論壇來看看有沒有新消息,可是我連續等了好幾天,直到今日(11/26),我才突然發現finster副版主早於我回帖的隔天11/14回我消息,以至於我沒有第一時間答謝finster副版主的指導,真有點不好意思。# r" Z2 h) O, A* ]1 o& b4 F  K1 M
說來慚愧,我沒有注意到我的帖子已經有第2頁,直到今天才發現,真有點啼笑皆非。 ; T8 a* w+ [- C* @5 P$ B1 m
在此,根據finster的指導,我會再試試,有什麼新問題,再向你請教。
: {; @) e* H4 R- U/ L0 Y此外,回答monkeybad版主的問題:我的確作的是over-sampling的ADC,所以, 才需要取樣到32k points那麼多吧,畢竟我也希望取點取少一點作計算,可是又怕算出來不準確,我想,我應該會比較一下1024點與32K點的差異,如果差異不大,或許我就可以將點數減少來計算。   
. e* ~$ l! G+ w% S, l8 f+ B# D∼謝謝!∼
作者: 緣緣    時間: 2007-11-28 09:24 PM
標題: 請問finster副版主有關程式問題
請問finster副版主:  }9 @: W3 c. b* J/ d
我依照你提供的程式,修改成我的規格後,程式修改如下:- J8 c) B1 u. Y7 S: n
% --------------The number of FFT -------------
  `" X# w; S; Z* B* E) C, vfin=5;% *KHz# m7 f; I& D1 d' Q
fs=5120; % *KHz
: \* M0 b% L3 j0 E4 ~: xcycle=1; % cycle = 2^N ; N = 0~5 0 H2 d2 T" X$ M! Z. g3 Y+ m
M=round(cycle*fs/fin);
$ H5 x& i7 E" Y9 I) I% --------------Load the binary code -------------& }$ t6 `# X: G4 _. z1 u$ d1 s5 C; y
load sdm_out.txt -ascii* s( A6 V' z4 L" ~& f/ w
start = 1;
5 X, |. S1 j7 @- |# M% Ystep  = 1;
& {* h9 w& p& k* ^%ADC
, }2 T- u4 t" D, M$ p) Ax=sdm_out(start:step:M);
: ?* N& I3 F( I# ]1 D: T. p4 j
% --------------Using minimum 4-term Blackman-harris Windows -------------8 ]6 |6 M1 h; t% \0 ~
ptst = 1;, s* m0 C+ z! C3 m/ N
ptfi = M;' e5 U% S7 d- ^
pts = M;! e6 W" P. G% w5 j7 V' t8 W  H
nb=1:1ts;4 r3 N# F, K+ C6 v0 [- |6 r  x
kb=0.355768-0.487396*cos(2*pi*nb/(pts))+0.144232*cos(4*pi*nb/(pts))-0.012604*cos(6*pi*nb/(pts));
6 a" v, [6 r! S9 M7 gwin_gain=sum(kb)/pts;5 D, x8 k" N, U7 l7 d
kb=kb/win_gain;& x, z5 n( c2 a/ H' T& b" ~- d1 V
% --------------- Calculated fft --------------------------. _2 V! V( p; ]' l
yb=kb.*x(ptsttfi);' \4 Z' l2 v3 N1 L6 l
yk=fft(yb);
" p% x! Z+ ]$ Qfft_no=length(yk);
4 l8 |4 A, W) t0 v+ yf=fs*(0:fft_no-1)/fft_no;, `% ^7 l/ k3 {! T" i
Pyy=yk.*conj(yk)/((fft_no/2)^2);
3 }/ z0 b. y) D# K4 N7 h9 o! s% ---------- Calculate THD ----------------------------' D, Z% @; _+ D: y' W1 M2 i
j=1;  `& e1 Z6 S; y6 {( s7 y! _9 K
for i=1:1fft_no/2)
" o& @6 B" J* }. F    if (f(i) == (fi*j))  
/ p$ O( B9 f/ n6 I! I        HD(j)=Pyy(i);     %% find all harmonic distortion components
+ ]( p7 r$ j) S" E7 j        j=j+1;$ o- ]6 l' g& w8 o) O' p: |
    end+ ~0 f% {  H+ J; T+ h! ^/ [
end
; V- F$ N: C+ m* g" vP_hd=sum(HD(2:9));; l. r: n7 v! x7 D' g% x/ k9 H$ H
THD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal;( Q  P' q$ p4 M
fprintf('THD = %g dB\n',THD);' H2 r. m  Z* R& E# T4 N& x! Q" G
% ---------- Calculate SNR ----------------------------
" N* ~4 N. O, |) F# q: qfundamen_dB=max(10*log10(Pyy(1:fft_no/2)));
+ V8 e$ R3 O/ o! q1 Ffundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);3 I/ @8 R. i' E; R1 }3 a
span=max(round(fft_no/200),5);
/ Q+ Q( f" E: Q- FP_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));
9 C) J5 B' ~) b' QP_noise=sum(Pyy(1:fft_no/2))-P_sig-P_hd;) D( J9 c6 }5 ?9 A2 r9 j% g
P_noise_hd=sum(Pyy(1:fft_no/2))-P_sig;
% {" _% S1 O! v( b- _
SNR=10*log10(P_sig/P_noise);
8 m/ W$ x2 q& `# V# sSNDR=10*log10(P_sig/P_noise_hd);& u: U- C5 `- z; }* G7 }
fprintf('SNR = %g dB\n',SNR);
+ ^8 x5 ^& T0 C7 I& nfprintf('SNDR = %g dB\n',SNDR);- O8 x1 a/ m& J% L+ u
1 w( x4 W& D2 f3 I7 l" K
藍色字體部分為我新增的程式,當我run到紅色字體部分,matlab顯示以下訊息:- A9 @- O& P# i3 e0 L
??? Error using ==> times6 }3 f0 r; @2 H6 {1 w
Matrix dimensions must agree.
2 p' x  S7 w) @; ~! v2 q
; F9 ?: O8 A! s. ]3 s
Error in ==> sndrtest at 21
" \! E  Z( A8 byb=kb.*x(ptsttfi);
$ s! t5 u2 q# y; [. j2 d! J
, @6 U5 _$ A! x: F) d
因x函數是我自行定義的,可否幫我看看要如何修改?$ q' P; l, X" P% |) j. a9 v
另外,在程式底下的藍色字體部分,是我增加對SNDR的計算式,不知有沒有錯?
  F' K3 d8 r4 ~+ r5 C除了以上兩點外,全部程式中有沒有哪裡有問題,也請幫我看看。! M8 c: F- z4 O: D( O6 e: Y
附件是我取1024點得到的SDM digital code,我是由第2 個clock開始抓輸出資料,我的測試條件為:Fin=5k,Fs=5.12M。
0 I3 {' X. O9 {; ~& c以上麻煩finster副版主賜教。
作者: finster    時間: 2007-11-30 12:54 AM
我看了一下你的MATLAB程式,發覺到有一個地方有問題# n) E2 r- p% `: H* K
那就是你設ptst和ptfi是同一個值是不對的& c0 `; U% b! ^! H+ `4 @& K
ptst是計算fft開始的值
9 m; R4 G" J+ K3 n5 K" A" D+ S而ptfi則是計算fft的range,如8~519,total則為512點
( M3 U! _' c* K6 k# |, _+ p故而你在執行MATLAB程式時就會出現錯誤& v1 o" M0 N; r! b0 V& _
+ V) ]$ e" D) T% D2 j; _7 o! B) W
我看了一下你的MATLAB程式,基本上沒有多大問題
- p9 x- F6 Q& D+ h7 I3 D+ J( {, q不過,要小心計算THD的值和範圍; y- F# r% Z2 |/ w
因為有不少人問過我為什麼在這個地方會出現錯誤,而當我看到他們的錯誤訊息時,便會發覺到他們的取様範圍太少,以致會計算不到第9個harmonic distortion components而出現錯誤
4 o! V. g: u3 ~( }. M2 O
( Y; t0 L& g% e1 ]最後,計算noise有好幾種定義方式: b; x2 m' \" U* J2 s( T* j' _: r
原本我所寫的程式有兩種計算SNR,SFDR的計算式,後來,經過我們內部討論的結果只用我給你的那一種計算方式,因為那個方式比較合理% r* [- {# H' d. I( L
我個人覺得計算noise的方式,只要能夠說服的了別人,同時也能夠提出合理的解釋即可
& u) k  _, N' o$ h! U0 @) D0 E因為目前在計算noise上並沒有很統一的說詞,故而,只要解釋的合理即可
作者: 緣緣    時間: 2007-12-2 06:25 PM
標題: 感謝finster的解說
感謝finster的解說,我解釋一下你的回復,我程式中ptst是設1,但我的ptfi是設ptfi=M=round(cycle*fs/fin)=1024,所以並不是同樣數值,取1024是因為我有1024筆資料,還是說我這樣的寫法不對?% _5 o+ w$ w7 q& L% j8 t
因為我希望計算的點數為32k,所以先以1024(1k)的點數來試著計算看看,如果沒問題再計算32k點。" C+ w  A9 \. \; p) w/ Y# R, _2 U( s
我想我程式的問題在於x函數是我自行定義的,可能有錯,可否再幫我看看要如何修改?
* f( \& E* q. `$ Y! \% d# h謝謝!
作者: finster    時間: 2007-12-2 09:33 PM
我想,你可能有點誤解了我的意思了7 L* g' F) ]) j0 }4 @! a
我列出我當初寫ptst和ptfi的式子關係式
1 Y) y! N& Y, x/ x0 _4 p/ t. Yptst=2^3;          % calculated fft of start point$ R  U8 E) U9 s9 ?! ~
pts=2^9;           % calculated fft of end point) v: ]# T7 b- G0 S
ptfi=ptst+pts-1;   % calculated fft range: 8 ~ 519, total: 512 point9 W: c7 x) ]6 z" i
因為我們不是從第一點就取來作fft運算,故而在設ptfi時,它的值是取(2^N)再加上從第幾個cysle值所取的值3 L, }. Y* `. R# D% ?8 p+ q
如此一來才能夠取到足夠運算fft的值' y( B, h: d% g/ o- L

7 G1 _& X: J; i0 r0 Y- x  Y另外,還有一點,x陣列的值要比ptfi的值大,或者等同於此值: ?' {5 }# ~/ a* ?- W0 a
如果你的x陣列內的值沒有到達ptfi,那MATLAB就會判斷出錯誤
! a: g! y. ?" }* a8 f# ^8 L- _9 |" G& b9 ~6 T: B- L* i. S7 j
如果對於要設的參數仍有問題; I: o9 N$ {+ Y# {' Y! z* n
我可以把我最原始的程式寄給你參考! g) {# F9 ~& W# q4 E( {

" B7 {/ j4 R: _( r$ G. D! S[ 本帖最後由 finster 於 2007-12-2 09:43 PM 編輯 ]
作者: 緣緣    時間: 2007-12-3 12:16 PM
標題: 謝謝finster的指導
謝謝finster的指導,我試著把你的方法帶入程式驗證,matlab仍然出現:
( i' k, n+ s. D3 j# Y# e??? Error using ==> times2 ~% N/ o1 T* T* M; ?
Matrix dimensions must agree.
1 {  U! b2 e) a- Z* `3 {5 N2 Y$ Z# x$ ^7 h! ?. K
Error in ==> sndrtest at 26
0 Q1 d$ ^, F9 D! c/ Byb=kb.*x(ptst:ptfi);
: ]" C2 C% g3 z. o% T那麼,就麻煩finster把你原始的程式寄給我參考,另外,可否附上hspice轉出來的digital code,我好方便作個比對。7 j/ `) `+ b9 K# e: H
∼感激不盡∼+ r- S8 ?( Y1 }" p8 t$ ~3 Q2 |* m- Z
ps.我的E-mail address我會以短消息傳給你,謝謝!
作者: liuyj610    時間: 2008-3-23 03:06 PM
很有用啊,谢谢各位的指导,特别是finster太强了,对了,你能不能给我们多介绍一下关于整个ADC,DAC的设计流程与方法啊?* u3 _; P. I- ?" x1 g- K' g. o
特别是仿真方法(从用matlab系统仿真到fft仿真分析。。。)
作者: winnie22    時間: 2008-3-24 12:18 PM
請問一下
# i0 W9 w$ F- E如果要在HSPICE模擬ADC的INL及DNL的流程及作法??
5 u; v4 {" [& j3 J9 a) ?: W因為沒有MATLAB請問HPICE可以直接做嗎??* C+ D2 O( Y! _- x
) i; q: y8 L& v% O/ q# K, k
請各位做過ADC的高手幫忙回覆..
作者: finster    時間: 2008-3-24 01:21 PM
基本上作ADC,DAC的模擬,還是以HSPICE為首選建議的模擬軟體
4 P- }/ k8 @! ?7 f' Q9 C至於用spectre,h-sim,matlab....等,均可對ADC,DAC作模擬" w) y% }' Z2 l- m- h/ _
但,在業界,個人的建議是,還是要跑HSPICE會比較保險
2 b2 e* Q' s7 U& i9 V至於INL,DNL,SFDR,SNR....等,基本上很難直接用HSPICE跑出來,因為有些計算式子在HSPICE中要撰寫出來很麻煩(用.measure指令來作計算),我曾經嘗試過,但最後不得不放棄,因為有些計算真的很麻煩,而且用MATLAB很快便可達到計算5 D8 {( D% k7 _" B# {6 x7 W
一般都是把HSPICE模擬出來的數值帶到MATLAB中去作計算會比較簡易; F5 n! c" @/ j/ ?
而如果沒有MATLAB,也可以用C來作數學運算,不過,印象中C沒有FFT的計算函式,所以,可能會需要一些額外的撰寫FFT運算程式才行
作者: 盧志良    時間: 2008-4-23 10:59 PM
標題: Hspice轉進matlab
請問一下:我想把hspice模擬出來的波形,放到matlab裡面做比較,請問要怎麼操作呢?
: h" R3 H  V& f" m  ^/ x                請各位了解的高手幫忙,謝謝.
作者: 緣緣    時間: 2008-4-24 04:16 PM
標題: 回復 32# 的帖子
請問你是要將hspice模擬出來的波形,然後用Matlab叫出來比較呢?
3 b$ W+ I0 e; v; |還是要將hspice模擬出來的數據,然後使用matlab做分析?
作者: 盧志良    時間: 2008-4-28 11:34 AM
目前我是要將hspice模擬出來的波形,然後用matlab叫出來做比較,請問這要怎麼弄呢?
作者: 盧志良    時間: 2008-4-28 12:18 PM
另外,也要將hspice模擬出來的數據,丟到matlab裡面做比較分析2 N, \) W8 w) v# Y
請各位高手幫忙,謝謝.
作者: 緣緣    時間: 2008-4-28 05:19 PM
志良你好:
5 @' c/ U4 z, }: N% ?. l如果你是要將hspice的波形用matlab叫出來比較,你可以去Matlab網站下載hspice toolbox來用,至於用法,我之前有在網路上搜尋到hspice toolbox的英文及簡體的說明檔,我另外自己也寫了一份繁體中文檔,我把他們全部置於附件中,供你參考,你看完說明檔後,應該就會用了,有問題再發問吧。8 f/ F3 K! ~( [5 d
關於你的第二個問題,這說起來可能有點複雜,你可以看一下版面上我之前與版主及副版主的問與答內容,應該可以知道如何從hspice下指令得到所需的資料,matlab程式的寫法,可以去買有關matlab的書來看,到時有問題再發問了。希望對你有幫助。
% Z( N& {5 [+ X/ D3 ^  t
# Y9 A& b6 ^- N1 e8 K[ 本帖最後由 緣緣 於 2008-4-28 05:48 PM 編輯 ]
作者: 盧志良    時間: 2008-4-29 12:53 PM
請問一下,第一個問題我看完附件後,第三個步驟還是不太懂,是要先把hspice的波形檔放到hspice toolbox裡面嗎?那在matlab裡要怎樣叫出波形檔呢?
作者: 緣緣    時間: 2008-4-29 02:03 PM
標題: 回復 37# 的帖子
1.首先你跑完hspice會產生一個*.tr0的檔案。* M# u. l- N$ r; T% n
2.然後開啟matlab軟體。) g, M8 ?# K* \3 U& K
3.從matlab的工具列會有一行current directory設定你hspice *.tr0檔案的存放路徑,或是把檔案copy到你現在matlab工作的路徑。$ t" A) e9 r; ^
4.在matlab的命令執行列執行X=loadsig('xxx.tr0')指令(說明檔裡面都有);  載入波形檔xxx.tr0到結構x中。
- @; ]' T4 |: ?3 H! |5.再執行說明檔中相關指令,即可看到你所想看的各點波形。
作者: 盧志良    時間: 2008-4-29 04:17 PM
請問結構x是什麼意思呢?
, V3 h, ?0 s8 `* H0 D- e6 h6 X# I& S# Z! w9 m
error in hs_allocate_sf: unexpected values in block1 header- v! Y6 P* Z) Y9 [, l% b! }) l
??? One or more output arguments not assigned during call to 'loadsig'.. I% P& }. f  z
這是怎樣的錯誤呢?
作者: 緣緣    時間: 2008-4-30 01:42 PM
首先x結構類似數學中的X函數,只是將loadsig('xxx.tr0')的指令指向X函數,你也可以用y,z....,此種寫法類似C語言的寫法。+ Z4 r4 N$ {) d. C& L* S
第二個問題好像是你的電路輸出節點有重複或是你的*.tr0檔案有問題,這我就沒遇過了,你可能要自己查一下。
作者: 盧志良    時間: 2008-4-30 03:10 PM
請問一下,輸入X=loadsig('xxx.tr0')這個指令是把hspice的*.tr0的檔案在matlab裡面叫出來嗎?
; R" H# U3 ~; S' O$ Z) j那如果我想把這個檔案叫到我在matlab模擬出來的波形裡面,是要怎麼弄呢?
' C  H  ^; S2 p- ?) `2 d還有就是進入到目錄 ~/matlab/toolbox/Hspice Toolbox,執行命令mex loadsig.c。這個是要怎麼執行阿?
作者: 盧志良    時間: 2008-5-1 02:01 PM
********************************************************
: X! s- c' t/ S* P5 {# M               Hspice Toolbox for Matlab
, }( ]% t' J, U- O, V/ X written by Michael Perrott (http://www-mtl.mit.edu/~perrott)( J, e( v6 h' L* c/ g
   while at Silicon Laboratories (http://www.silabs.com)
+ P& V* _3 F0 a# x+ O% K0 w     Copyright (C) 1999 by Silicon Laboratories, Inc.9 J+ H. H) Z) J% ^! b
     This software is distributed under the terms of7 A, e# o) C6 Z$ S0 p
       the GNU Public License (see the COPYING file5 [5 O2 p  k* H: e6 x) G3 u6 ~; x
  for more details), and comes with no warranty or support- [% n' L4 n( ?6 B+ Q- A; H
*********************************************************
2 i! v3 B: [2 j$ i8 O
5 ?0 x2 p9 f  ^. D2 {0 ~, t??? Error:  file can't be opened
  u5 m* {2 }1 Q% s+ U, ~) J/ s; v6 z; r" s6 w9 B
Error in ==> C:\MATLAB6p5p1\toolbox\hspicetoolbox\loadsig.dll
( T  L& n  J# X( G" P縁缘大大請問你,這是怎樣的錯誤呢?怎麼解決?謝謝.
作者: 盧志良    時間: 2008-5-1 02:30 PM
縁缘大大請問你,我的hspice模擬出來沒有.tro檔耶,只有.sto檔而已.那這樣還可以在matlab裡面叫出波型嗎?
作者: jerwei    時間: 2008-5-1 05:43 PM
原帖由 盧志良 於 2008-5-1 02:30 PM 發表
  e0 i# U  a/ g! F縁缘大大請問你,我的hspice模擬出來沒有.tro檔耶,只有.sto檔而已.那這樣還可以在matlab裡面叫出波型嗎?

8 K( _# X* w' H2 X( ]0 k$ g+ x9 ~: A- P
tr0是spice的你執行transient simulation後的記錄檔
% r! i5 Q( v2 A; W: A若是你沒有tr0則你可能沒辦法將transient的結果滙入到matlab
7 ^) m+ u/ [4 \* m有錯請指正,thx
作者: 緣緣    時間: 2008-5-2 05:57 PM
正如jerwei所說,需要有*.tr0檔案才可由matlab叫出波形,你沒有*.tr0檔案是因為你沒有在hspice 執行transient simulation(暫態分析),一般指令的寫法為:
; Q2 g) R1 S* {.TRAN  0.1E-12(取點間隔)   0.81E-3(結束時間)  START= 0E-6(開始時間)
+ G6 H& B$ f3 m) \8 e3 K; q6 @& T4 z你可以看一些hspice指令的書來瞭解涵意。只要你有下這個指令,在輸出檔就會有*.tr0的檔案。
作者: jwtsai    時間: 2008-5-13 09:53 PM
幫忙補充一下,6 t; N& ?' d1 d3 J6 m4 K9 t
要使用這個toolbox時,在hspice的.option中不能使用post=2.& ]! A" a7 u1 s
可以用
8 S; U2 v* V7 w* m9 A.option post* v  r1 `, Z7 V, P, B
或是5 g, I2 i# _4 a, O
.option post=1
9 u- r/ Y- e' w8 F/ }2 V但絶不能用' p! b. O% d* p7 A
.option post=2
作者: simon_ncku    時間: 2008-5-19 10:43 AM
請問或是版主副或是其他人7 q; e& r6 `# E0 c) G" R4 X
我將 緣緣的MATLAB程式 放進去跑有是出現ERROR耶
3 p/ G2 L& }  {% @' k3 O& M: X它出現
+ ^( o+ C& R+ G' s) [5 Q: c??? Error using ==> run
5 w. c/ n6 f! I% nError using ==> times. R' I; Z( b, F* g* f
Matrix dimensions must agree.8 g) R0 `/ a2 a- Z, ?$ L) J
附件是CO下來的0 U+ v9 z/ R9 H0 n
請各位先進指教3 \! [9 ~# b) [3 l- A2 o. w2 M9 l5 x% [
THANKS.
作者: simon_ncku    時間: 2008-5-19 07:41 PM
標題: 回復 45# 的帖子
緣緣大大是否可跟妳要MATLAB  分析FFT等一些動態參數的程式
7 M( I1 m1 P! M, f, _2 F( G2 x; z謝謝
作者: 阿茶先生    時間: 2008-8-9 10:07 PM
@口@ 不好意思,小弟到MATLAB的網頁中找不到Hspice Toolbox載點哩...
0 O" H8 ]7 P0 y0 k& j& I# x
4 R: {5 ]. _/ J9 O不知道有哪位好心人士可以提供載點呢??( r% r3 ~* a: Z$ o  U
7 O5 J9 V) X/ q9 A, g: z
感謝不盡喔!
作者: yoyo20701    時間: 2008-10-3 02:10 PM
多謝大大的解答~~小弟大概瞭解一點~~~謝謝你喔~~~大大~~~~~
作者: yoyo20701    時間: 2008-10-3 02:10 PM
多謝大大的解答~~小弟大概瞭解一點~~~謝謝你喔~~~大大~~~~~
作者: pandera    時間: 2009-3-18 09:06 PM
標題: 謝謝大家回覆
剛剛試了第一個方法 覺得不是很方便
2 D1 {, T! V! G7 X6 w後面的辦法用起比較ok
' N& O* y; K" ^- b; C8 [5 B2 G這樣我的模擬結果就比較好看了 謝謝
作者: e2000    時間: 2009-4-8 01:46 AM
怎麼感覺很繁雜的樣子,看來這方法還需要多點解釋,我也很困擾到底要怎樣利用hspice的值放進matlab裡面
作者: caroff    時間: 2009-5-13 06:02 PM
不好意思,有個問題想請教各位前輩。
9 J5 O+ H. i$ w# V1 n( L如果由hspice使用.fft得到一個spectrum,
# S) R6 q6 T  o' |9 y  o那我該從何得到這個spectrum的data呢?!
# P" O5 l+ o4 I9 q因為我要利用這spectrum去計算SNR,不知該如何用?謝謝!!
作者: s13571357    時間: 2009-5-14 09:47 AM
可以問一下嗎??& J2 g4 I( w- u0 S, [- R- u
當我現在有一時間t=0:0.01:60(表示時間是0~60  而每0.01分析一次); T+ Y. j& h; M/ m
另外每一時間對應到相對的電壓值' n' A" P% h& X9 _- x: z
但是電壓值和時間不能寫成一方程式
, E( p. l* A/ N) ]9 N- l$ R) U我現在想要用MATLAB做FFT3 w) ~: c, p! b- q3 Q
把時間軸轉成頻率
! [7 C3 i: w4 f+ G* {! ]* B去看他的輸出直1 {/ P3 v5 f, [
我該如何使用MATLAB呢??
* r' N+ j/ w8 `, b( p9 Y( ^# DMATLAB新手
作者: sky987    時間: 2009-5-19 01:40 PM
他們跑 32k 16k點 應該是在量測的數據
( [% }5 F2 v# u: O# R
0 r5 z* L/ n9 u5 l) x模擬的時候不用跑那麼多點   這樣太花時間了
作者: kuohsi    時間: 2009-5-21 05:45 PM
請問若用.meas指令) E% s. \+ L& j2 G5 a" P1 p
將VOUT取65536點的指令要如何寫?
作者: iamsailing    時間: 2009-5-26 09:18 AM
緣緣網友以及版主:% M: W5 q6 d8 Z& O, e
我的問題如下:) ^# I4 \7 B4 Q+ g* m" K% S* c* x8 M+ a
我用HSPICE 仿真了一個2-bit flash ADC
$ a5 v* R) t( t# X' L3 L4 ?4 V# q* Z6 Q" x利用spice explorer中的理想D/A工具,
" g$ P6 o+ x, U1 l! d, h! }可將2-bit flash ADC的輸出數字信號,通過該D/A重構爲模擬信號
* k' V0 g+ }; _; a" o4 z並導出數據,如附件ADC_DAC_out.txt所示2 Y4 @$ n3 m5 b, ]
該文件中第一列爲時間信號(X軸),第二列爲重構後模擬信號的幅度
4 |& f$ g; M8 N' T3 z+ _, u在matlab中如何用load語句將這樣一個兩維的數據導入
$ ]3 R# z& F4 n我現在需要用matlab對該信號進行FFT處理,並計算THD,SNR,SNDR+ G: ^1 L+ E( d7 F2 o+ L. T' v
我的fin=56640625Hz,fs=2e+9Hz,打算做1024個點的FFT% r6 M/ j" p. V( E5 Q7 U
ADC_DAC_out.txt中數據的時間是從11ns----523ns
3 ^/ ?. ?' C1 I% Z5 Q; w& }% u因爲11ns+1/fs=523ns4 s, k7 J! J5 @& p" A5 Y/ p6 ]  m
附件中fft_yuanyuan.m文件是我將網站上你的matlab程序複制下來了+ S5 Y, Q- E5 N5 J5 T
但�面有些部分我不明白,我用“?”標出了
) d! S( N" E% f4 |' F; Z, A1 K' j7 Z' |7 B8 M# V
謝謝你。
8 n! M3 r1 C( Q  I" G+ E& T7 @* B2 C5 X4 z2 u
[ 本帖最後由 iamsailing 於 2009-5-26 09:24 AM 編輯 ]
作者: kuohsi    時間: 2009-6-1 04:02 PM
iamsailing:0 w# [1 z" P# H
你取點應該是11ns+1024*(1/fs)=11ns+1024 / 2G=0.523us
$ a' s8 Q4 L# N所以你HSPICE要下.tran 50n 0.523us
. c. i/ M+ J! H: I$ ?.tran 的step要是1/fs才對
作者: 異星人    時間: 2009-6-4 10:16 PM
我有個問題啊+ W: P( n3 q; L1 [; m6 {
0 \( z" [# k- H9 C, A) t) U& A6 t; f
是論壇上的表情問題5 u, n2 L$ [4 r/ \# M! K
9 N5 g6 T" ?; W1 ]* J7 t) E
  這些程式碼都穿插的表情符號& v3 s# [4 W: ^' r
7 X6 B5 [3 u7 w, d0 ^6 P( [7 Y
無法解讀啊
作者: 異星人    時間: 2009-6-4 10:16 PM
我有個問題啊
- k! c! g* q( I8 d  _8 X4 x% i5 p6 Z6 v( ?% m
是論壇上的表情問題
  x' ^) A3 F- e6 P0 ?# c, n1 A+ [+ N! T5 m1 r8 u
  這些程式碼都穿插的表情符號
0 Z' L& J! K+ ~* x( ?7 t+ I# H- H  [, p: }1 O
無法解讀啊
作者: kimwin107    時間: 2009-7-27 08:44 PM
感恩..請多多指導..即所謂無分享就無成長..為又努力不懈地汲取他人經驗,才能更精進.!
作者: pkf690801    時間: 2010-3-18 04:42 AM
我需要這個頁面內的付加檔...為什麼都不能下載呢?
作者: mayluli1981    時間: 2010-4-13 05:22 PM
版主 請問依下能給下載hspice toolbox的網址?偶在網路都找無
+ m" d% f6 L7 Q& q9 Q我是新手  我要把Hspice 的AC及 TRAN 圖用matlab顯示出來而已
0 P: ^8 Q* e) X/ T* W5 ^3 W. B  u沒有hspice toolbox好像不行ㄟ' m, L3 y" ^9 k
感謝
作者: s13571357    時間: 2010-4-21 02:15 PM
請問一下) \+ U) i1 D) r5 `% S* n  F
hspice toolbox主要是用來和maltlab溝通嗎
/ z5 w. e6 y$ _1 j& V: o哪裡可以找到相關的資料呢
作者: lqlcug    時間: 2010-4-22 09:28 AM
楼上很多牛人,这里斗胆谈谈我的处理方式。
# p+ i1 @0 H0 ?1.将Hspice的仿真结果正确的输出,用到了一个interp=1的设置,它可以选择你想要的数据点输出;
3 W* R2 w# B9 t2.采用Hspicetoolbox将hspice仿真结果导入到Matlab,然后处理的方式就非常的自由了,比较典型的处理方法可以参考MAXIM公司的设计笔记,楼上已经有人贴出,还可以采用Matlab将数据先处理到workplace区域,然后采用simulink,借助SDtoolbox来计算SNR。
作者: rokin    時間: 2010-4-23 02:35 PM
首先我想請問副版主finster,你說我的取樣頻率和輸入信號頻率非常地接近,在取樣頻率Fs=10.24MHz的條件下, ...
4 u( j  u* a  B- |  p3 m緣緣 發表於 2007-11-13 03:58 PM
5 [  R; q* V! h3 v) t* @9 S9 ?1 F

" f6 I& {1 x4 ~) A2 Z0 ~
8 V3 M+ B) h9 t- x  Z" v5 ~  請教版主及緣緣- C! m, o8 ~- x' B
對於給matlab計算FFT之前,
2 N; X* l* v# A.meas 指令對輸出要取均方根值嗎?1 N2 T% i' o, O! H
或者直接取值就可以了?
作者: juro0827    時間: 2010-9-27 01:37 PM
WOW" a8 v+ }6 f* A% P
正在找此相關資料!!) x8 _& ^; z1 x' b$ K
LUCKY!
作者: wwm101    時間: 2011-3-18 10:14 AM
finster 版主相当强大啊,受教了,谢谢
作者: killer7788    時間: 2011-10-4 04:40 PM
回復 58# iamsailing
2 f6 t) v+ }& N5 ~
9 a, E! C2 {- I- H
. f: k! A% I- s! R$ x    可以請問一下, SPICE EXPLORER 中的 D to A converter 是如何使用, 因為我所做的ADC 的輸出是一個序列或並列波形輸出, 案OK後好像沒什麼反應, 也不會像你的TXT檔一樣
作者: david_chen    時間: 2011-10-6 08:40 AM
來這裡看到很多高手精闢的講解' @; Y( Q# K5 c! e, b9 e
受益良多  謝謝囉
作者: chivv    時間: 2012-6-21 12:45 PM
感謝版主回覆
6 u2 {* U( L' @( m正在找這方面相關的訊息8 k. i6 d0 s6 u6 }+ t
讚!
作者: poiuzxcverty    時間: 2013-3-2 03:34 PM
謝謝各位大大分享,小弟受用了
作者: jghn    時間: 2013-3-28 02:50 AM
謝謝大大的分享!  
; |  c3 p# z5 H/ v# o/ P2 i) v  ?+ u" K6 \' m
真是受用無窮




歡迎光臨 Chip123 科技應用創新平台 (http://free.vireal.world/chip123_website/innoingbbs/) Powered by Discuz! X3.2