Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 92903|回復: 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)?包含方法及指令,愈詳細愈好。拜託有高手能相告。( O/ v+ R* q0 ?+ Z: o3 O' r- |8 p
謝謝!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂13 踩 分享分享
推薦
 樓主| 發表於 2008-4-28 17:19:49 | 只看該作者
志良你好:
' g" o+ }3 {" b+ ~( k如果你是要將hspice的波形用matlab叫出來比較,你可以去Matlab網站下載hspice toolbox來用,至於用法,我之前有在網路上搜尋到hspice toolbox的英文及簡體的說明檔,我另外自己也寫了一份繁體中文檔,我把他們全部置於附件中,供你參考,你看完說明檔後,應該就會用了,有問題再發問吧。9 S( D; E$ R' ~7 n3 U
關於你的第二個問題,這說起來可能有點複雜,你可以看一下版面上我之前與版主及副版主的問與答內容,應該可以知道如何從hspice下指令得到所需的資料,matlab程式的寫法,可以去買有關matlab的書來看,到時有問題再發問了。希望對你有幫助。
) H, L9 A( s, |+ X# X
2 x6 z; a% j. J+ n[ 本帖最後由 緣緣 於 2008-4-28 05:48 PM 編輯 ]

本帖子中包含更多資源

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

x

評分

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

查看全部評分

2#
發表於 2007-10-5 18:42:51 | 只看該作者
我之前做ADC再算SNR有用過一個方法 可是很爛 但是還勉強可以用9 |( Y+ S, P7 z5 y
就是直接用.print指令把你要量的電壓印出來
0 @* R+ m, j+ U" [' b0 V4 G然後再用手動把印出來的資料copy起來
- j- \8 E( t* f4 U+ _, B7 U: `3 T/ P然後貼在Matlab程式上面 然後就可以做FFT了
3#
 樓主| 發表於 2007-10-5 21:39:18 | 只看該作者

謝謝版主回復

謝謝版主的回覆及支援,我之前有找到一個MATLAB的應用軟體叫做HspiceToolbox,可以將hspice輸出的檔案透過HspiceToolbox將檔案轉入MATLAB中,也可用MATLAB叫出hspice電路中各節點的信號,只是,接下來MATLAB要用何種指令才能算出電路輸出點的SNDR及DR,我知道可以將MATLAB的指令整合成一個副檔名為m的檔案,不知版主或其他高手有沒有這方面的指令寫法或是m檔案,那就感激不盡了。  N; B. M1 x9 B7 F) [$ {, {

& ^* ?! B" q# `) S謝謝!
4#
發表於 2007-10-8 09:40:08 | 只看該作者
Matlab 有 fft 的  program, " x) n1 \9 F' H& C+ m8 D
所以  只要將FFT後的資料  做一些轉換就可以唷!!0 ?  Z2 d/ K5 `
將主信號找出來!!  然後將"所有的 fft power 加起來 - 主信號的 power"( S+ Q1 o1 ]( Q% S# e4 b" _
就可以換算  SNDR 了!!. I  J* a: g3 ^* L* B) M/ c
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部份程式
1 }: z4 Q6 U- Z3 o6 ]' `. c. c我想,應該可以給你一些參考吧
# M% N2 {- R8 M! |( T, p. A8 @; {
% --------------Using minimum 4-term Blackman-harris Windows -------------0 ?1 n4 O' s, Z) F7 v# d
nb=1:1ts;/ I. S- ~: Z$ s. }, D  y
kb=0.355768-0.487396*cos(2*pi*nb/(pts))+0.144232*cos(4*pi*nb/(pts))-0.012604*cos(6*pi*nb/(pts));' C/ f$ K, b9 H; _" i. U. @+ o
win_gain=sum(kb)/pts;
* f# L2 p# |, y4 u& b& F) Jkb=kb/win_gain;& G8 }6 L  W! w" `) h0 t

! E. K, @* M$ g0 V' {( E% --------------- Calculated fft --------------------------
. _5 _: k# e! t: k; nyb=kb.*x(ptsttfi);6 A# q; S! X9 L! L
yk=fft(yb);
! E. f  P- Q) I+ j. G9 C* G, Gfft_no=length(yk);
# \8 y: F+ Z' z6 Z* j7 Of=fs*(0:fft_no-1)/fft_no;
! |6 ?  w$ q; DPyy=yk.*conj(yk)/((fft_no/2)^2);8 N. z) E# o4 z# V! G
8 I2 e& W& J2 J, d5 ^! C3 F
% ---------- Calculate THD ----------------------------
1 i; B' g$ q$ [! dj=1;$ ~: o/ L( [0 O9 l
for i=1:1fft_no/2)* ?" w. s+ {  y/ L! l# N5 J  X& o
    if (f(i) == (fi*j))
$ P. C: g4 \) x- Y        HD(j)=Pyy(i);     %% find all harmonic distortion components
0 l+ _' A2 i: N, a( n/ o        j=j+1;  a: z' Y) w" m2 L7 t
    end
, y0 `4 I& k+ Oend% H) g0 p3 r& t3 A5 ~* i, r! k
P_hd=sum(HD(2:9));
! n( r7 u) X8 n/ eTHD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal
( B( t0 E8 z. f9 c8 ufprintf('THD = %g dB\n',THD);7 s) w8 |/ M& q( ~6 B* ~/ Q/ L
' L* l" h1 m. |) f3 T* q: ~
% ---------- Calculate SNR ----------------------------
5 ]/ z' m5 n5 x# Efundamen_dB=max(10*log10(Pyy(1:fft_no/2)));; u$ ]! c1 s+ g" K" {! l  b
fundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);
: g8 M7 ^" Y* F2 s# |3 P# Ospan=max(round(fft_no/200),5);
: ^0 Z" z4 w" b4 x- T8 wP_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));0 i( _6 M& s& `" ?$ z& T% \) Y4 v
0 D* c; i: j3 K$ _4 F  H+ J0 R
P_noise1=sum(Pyy(1:fft_no/2))-P_sig-P_hd;
# R/ B. p8 G1 ~9 ~SNR1=10*log10(P_sig/P_noise1);
  P' Y0 x3 j+ o& T  tfprintf('SNR = %g dB\n',SNR1);
7#
 樓主| 發表於 2007-10-15 19:34:54 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
5 o9 U2 N/ m$ }1 d請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。
: I5 S5 a* J5 W) @, x$ ?) M4 J
- C6 i/ a% n# q( \另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:" @# D9 U/ D7 q* B
"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"  v7 e7 b4 |; Y
內容為:
" w2 w- [: j2 _; ^' W% c' ?6 L/ Y# @$ d+ t压缩文件共有三个文件:两个m文件和一个txt文件$ M1 B  N. r4 L  o/ M; v" b) b
spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。
8 z' I( _7 D; O希望大家喜欢!! ' Z6 J4 e9 {; Y: W- v1 l
附件為:FFT.rar
9 X! m- y1 Z! k8 V/ a: H2 B& ], u% v5 Q: d& `& r
我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:
+ b3 p+ m% W) u# Q+ S3 s) w/ V" O7 r; i( C
??? Undefined command/function 'AD10'.3 m& I: U6 ^( Y1 g/ D% @9 Q* N+ x# e
8 b; n9 g. ~8 x( ]$ ~
Error in ==> spectra2 at 43
; f$ Y" U/ T1 s" E& S1 r8 Z/ cd0=round(AD10(start:stepstart+M*step-step),3)/1.8);2 ~" ~) S' q2 T: t$ H: g

% W/ H$ L4 |& H& h4 W& h由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!) x2 @8 H) j- G
+ t4 m. C/ l0 S" f" g8 |" {( g
∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~??????? * p4 w( `* _9 c4 }
4 r: {" J  m2 z5 |7 o
[ 本帖最後由 緣緣 於 2007-10-15 07:54 PM 編輯 ]
8#
 樓主| 發表於 2007-10-15 20:54:45 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:$ s/ h0 X2 C( ^7 i/ t: |/ N. P
請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。
. N+ n5 e4 Y0 x& o* O# K; q; D1 _* g另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:
2 S! N0 A4 D! d"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"- x9 d1 k9 p; |
內容為:- u6 {. I6 U$ T' C* }
压缩文件共有三个文件:两个m文件和一个txt文件9 B4 U& {. y# T: M
spectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。
: u' c/ u; H" m& `8 t, g; |希望大家喜欢!! ) t2 \# t% L% m1 \
附件為:FFT.rar9 l) F* o! |: Q  I; M3 c
7 }3 h# n7 x2 s7 A: V4 w
我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:' Z. d* ]' {, ?/ ?% L; @/ I
( }& t2 F, G6 ]/ K" H
??? Undefined command/function 'AD10'.7 b/ n" e' Q' L, Q

/ Q, q/ `7 c! h: G) C. j: ]Error in ==> spectra2 at 438 u6 h- f1 @4 v: V% X* D+ i5 J
d0=round(AD10(start:stepstart+M*step-step),3)/1.8);. I9 _) C( j+ N1 j: R, z

6 ]# \% l. }! t3 p; W9 c2 d5 }由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
9#
 樓主| 發表於 2007-10-15 22:18:15 | 只看該作者

增加附件

∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????
5 Z+ J. S) C( S附上上帖的附件

評分

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

查看全部評分

10#
發表於 2007-10-15 22:31:57 | 只看該作者
在回答你的問題前我先稍微解說一下我的MATLAB程式- e4 ?. W9 j4 o: Y5 z" w
要作FFT必需是sine waveform或者近似sine waveform,所以,我在作DAC的SNR及THD時,必需是輸出信號為sine waveform的記錄數值
0 Q; t( `. }% @( ?6 d) \故而,我利用SPICE中.measure的指令來記錄DAC的輸出信號數值,然後將這些記錄的值存成一個TXT的文字檔,然後再用MATLAB將這個文字檔讀出,再作FFT運算
/ _7 |; ^2 _) @7 L* e$ O# k8 L: t. ?7 K3 ?8 e! V% ~
在MATLAB程式中要作FFT運算時,需注意它必須是2的倍數,同時,我在作FFT運算時,先行利用minimum 4-term Blackman-harris Windows的filter來使DAC的輸出信號平順些,當然,你也可以不加,不過,畫出的waveform會有點怪怪的,再者,因為我們記錄的數值是每隔一段時間所記錄的數值,所以畫成連續的圖形時,會很不連貫,所以,一般都會作windows的filter,而我也問過一些比較資深的analog designer此種作法是否恰當,還沒有人對於這種作法感到奇怪,也許大家都是這個樣子作的吧
9 C6 @% ^, C/ g5 s2 ~
" v2 J  l) `: ]; {我看不到你的附件檔,故而實在無法作出評論2 D- \3 K6 R+ |4 j, h
而看了一下你所秀出的錯誤訊息,想問一下,MATLAB程式中有AD10這個函式嗎??又或者有沒有AD10這個array??. @; K% a% H2 B/ `8 U! I& ^
從錯誤訊息來看,似乎是找不到AD10這個函式或者array,所以才有錯誤
11#
 樓主| 發表於 2007-10-16 15:54:59 | 只看該作者
由於之前一直出現Internet Explorer無法連線訊息~???????/ e, _! S$ T3 F: w, J) q. m$ p
所以重新上傳附件

本帖子中包含更多資源

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

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

有關hspice .measure指令寫法

再請問一下finster副版主,如果我是要將Hspice的電路輸出點Dout,使用.measure指令來記錄ADC的輸出信號數值,暫態分析(TRAN)掃瞄區間:0~3.2msec,: z6 L+ ?. Q$ R9 B* ?; V
指令的寫法是否為:
- U" Q- M; }6 Z
5 H1 S4 }# i, v+ M4 C.MEAS TRAN DIGOUT( t# c4 I3 i% [. `
+TRIG  V (Dout)  VAL=0        RISE=2
# d! F6 l' m: T2 S8 {+TARG V (Dout)  VAL=3.2m  RISE=24 b2 ~7 J- }% Q$ |

; k6 G0 a4 J0 t. b9 b0 H5 u- Z∼還請指教,謝謝∼
! Q5 I! J) @# v5 T/ ?! T- [& t5 |% p3 ^1 S& f
另外,我先使用一個小程式去試.measure這個指令,輸出的*.lis只發現以下的數據:2 s' ~- F' g$ U: m; g
' s& C- t. x. O3 E# g& b
digout=  3.7443E-09  targ=  1.5167E-07   trig=  1.4792E-07$ g4 `8 w) l# V+ ?, l$ K- J# {

1 p5 I, U. |; F7 SHspice輸出檔多了一個*.mt0的檔案,該檔內容同上面之敘述,不知是否還有那邊出錯?$ F* a$ c6 [; Z. v9 F9 N

' g, I5 v: |% y[ 本帖最後由 緣緣 於 2007-10-16 05:34 PM 編輯 ]
13#
發表於 2007-10-16 23:08:40 | 只看該作者
在Hspice執行.measure指令時,它是依據你的.lib的數目來產生相對應的*.mt*檔0 P; \3 L7 }2 C5 a, \
故而,如果你的檔案有多出*.mt0的檔案,那表示這是你的.lib的第一個依據.measure所計算出來的資料: l+ z) E" s- ]9 }" U
所以,請再檢查一下你的HSPICE檔案吧& b3 g( H3 }1 A0 A: F, B; w6 r
2 b& e/ t. y! `4 o
再來,你的.measure指令用法沒有問題
* E) p9 N7 F6 n, k2 b) P# y但,你的取樣點及時間似乎不對
; ~/ C0 e$ z$ C0 M. v你的暫態分析(TRAN)掃瞄區間:0~3.2msec,你所用的指令為:+ K0 w5 i1 c/ n; }" H4 v
.MEAS TRAN DIGOUT
2 U. v( E3 X+ q2 }8 \5 `/ A' A+TRIG  V (Dout)  VAL=0        RISE=21 y' f7 g) v, C- C
+TARG V (Dout)  VAL=3.2m      RISE=2
- D; W5 l* {6 a& r7 V) T% A' k寫法沒錯,但,如果是ADC,那其輸出信號為digital,故而,輸出信號的振幅不是0就是vdd,如果要記綠輸出信號的digital code的話
$ D# b2 ?$ e, v那,計算輸出信號的digital code應該依照clock來作取樣時間,而不是0~3.2ms,也就是.measure的VAL要是clock
7 {" V0 k$ M. y) W  l另外,若依照你的指令來用,應該會計算不到輸出信號,除非你的模擬時間超過6.4ms,因為你是用RISE=2
2 m* V! M3 i. M# U再者,如果是用.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程式。/ h& R: H0 \/ y4 v9 K  b

3 G5 w% [& V1 M7 B9 `" Q∼感激不盡∼
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# j5 ^. P- T9 j6 k* j
3 }) X8 A, P4 X" H8 S& m5 z5 J' M3 |* L  I3 d5 L1 L5 g
.MEAS TRAN DIGOUT' _# s, f' z$ p, b
+TRIG  V (Dout)  VAL=0      TD=0.5E-7    RISE=1( Z" a/ w) H+ q' t$ Y3 `! j! f1 Y+ n: k# t; ]; r
+TARG V (Dout)  VAL=0.976E-7               RISE=1
  i' j  z) J! q* J7 n; T+ m2 b, ^# l$ U
∼還請指教∼
+ l$ M3 T! Z" W5 U+ n8 R, y! U9 h, Y程式重試的結果,*.mt0檔案只出現:
5 h# Y7 y+ X4 E; v. i6 `& a( ndigout           temper           alter#            , l, C$ {5 F7 f/ P
1.890e-12        25.0000           1.0000         7 z+ k9 ~2 ~2 D
不知是否還需修改?- H- R( o5 O7 t: s% h' p
9 B5 r1 e! P! u& a) f5 n& ~
[ 本帖最後由 緣緣 於 2007-10-19 12:11 AM 編輯 ]
16#
發表於 2007-10-19 01:58:58 | 只看該作者
先回答第一個問題! ?- A( R( b. h. _+ G; }$ L
你的MATLAB程式我大概看了一下,發覺到AD10應該是一個由別人自行撰寫的運算函式,而因為你在MATLAB程式中並沒有這個函式,同時也沒有呼去這個函式,故而,你在執行MATLAB程式時,當然會出現錯誤訊息
* o0 {  `& @) g7 w' @  ^所以,如果這不是你自己寫的MATLAB程式,那我只能說你的MATLAB程式並不完整,也許,這是別人故意留一手的吧6 Q$ \; ?8 [. H  ]# i* {
; s% `6 ]) R  [/ t( u7 i
再來,在ADC中的Sample and hold電路若是用SC電路,是會用non-overlap clock,故而會有兩個clock" g2 D1 Q9 u  M7 a: I6 O& ]& p/ K/ M
但,源頭的clock只有一個,而這個clock會透過non-overlap circuit去產生兩個時間差的clock# u( p) M. N8 ~; Z
一般而言,ADC的數位電路所需的clock通常都是由源頭的clock作為基準,然後將數位信號輸出,故而,在使用.measure時,所參考的時間及頻率也該是以這個源頭的clock為主,而不是由non-overlap circuit所產生出來的兩個時間差clock,除非,你的ADC電路並沒有包Sample and hold circuit(我不清楚你的電路架構為何,但,ADC一般而言一定要有Sample and hold circuit)
: D1 A; M8 z2 P) A再來,我看了一下你的取樣頻率為5.12Mhz,這是很低的clock頻率,所以,照理來說這麼低的頻率,你的架構應該是採用SAR架構的ADC吧,那你的輸入信號頻率為何呢??另外,你的.tran的時間多久呢???還有,你是幾個bit的ADC呢???
2 l0 D* ?# z4 s" ^! b, V- E7 [舉個例來說,假如你是4-bit ADC,輸出分別為D3,D2,D1,D0,且clock為1MHz,所以使用.measure應該為
8 N0 ?/ M: i" X: m& U% e4 l. @.MEASURE TRAN DIGOUT_D3_t1 find V(D3) AT=5.2us  Y- P- r9 P( Q. P& i% u# k: `* {; H
.MEASURE TRAN DIGOUT_D2_t1 find V(D2) AT=5.2us, U5 ]& J, F6 s8 V* `" G* t
.MEASURE TRAN DIGOUT_D1_t1 find V(D1) AT=5.2us+ ~' U5 i% l- S7 i; D: a
.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=5.2us
; d' l9 M+ b% g
: U1 _9 [" c% x5 m) f.MEASURE TRAN DIGOUT_D3_t2 find V(D3) AT=6.2us! X6 }5 z( e2 N* O
.MEASURE TRAN DIGOUT_D2_t2 find V(D2) AT=6.2us
3 |  d1 s( N7 O1 L2 Y1 B, q) ]4 W.MEASURE TRAN DIGOUT_D1_t2 find V(D1) AT=6.2us
' F! E- U# _% [& D2 e. t3 T.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=6.2us. \% ]+ E) C9 j# b+ }
. f  N2 e) A) W/ u
我只計算clock的週期,然後再初估ADC中的delay時間為0.2us,所以,我第一個數位取出的時間為第5個clock週期來取出4個bit的digital code,然後在第6個clock週期時又取出第2筆digital code
" j9 q1 U9 D5 E$ j我用的方式較為簡化些,因為ADC要取出的是在每個clock週期中的digital code,所以,只要精算出每個clock時間,即可簡化.measure的指令,而不用用到TRIG....TARG.....,當然,這是我的作法,你也可以依照我前面寫的改成你用的TRIG...TARG的用法  T" c* {0 o5 Y& n  S

1 Q+ L* s: m. w& ?8 d最後,像我剛才寫的.MEASURE TRAN DIGOUT_D3 find V(D3) AT=5.2us
- t0 W. A9 Y& C可以用MATLAB程式寫成一個自我產生的.measure,我以前是用MATLAB來自己產生的,不然,光是計算1024點就要寫4096行.MEASURE指令,那是一件很浪費時間和生命的事,用MATLAB的迴圈即可一下子產生出所有.MEASURE指令,小小作法,提供給你參考
17#
 樓主| 發表於 2007-11-8 15:00:24 | 只看該作者

謝謝finster副版主的詳細解說

再次謝謝finster副版主的詳細解說,我前一陣子剛好有事在忙,沒有及時回復你的問題,還請見諒。
1 I; |' ~9 o& }1 v1 K) Z- P( o* U我大概講一下我的架構:
3 _& W; A7 r+ x8 Z8 o' c# c我電路是使用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的指令寫出,指令如下:
/ P: H( }! h- x8 D3 [" G, zFor Fs=10.24MHz:+ F. q$ T4 k1 Y# l# v
V0 NET2 0  PULSE 0  3.3  0.5E-7    0.976E-10 0.976E-10 0.488E-7 0.976E-75 Q7 Q# d& n' z; W* [9 }
V1 NET6 0  PULSE 0  3.3  0.988E-7  0.976E-10 0.976E-10 0.488E-7 0.976E-74 ~4 S) S# l' N1 y; m# [
For Fs=5.12MHz
: B0 v: Q4 ~' R( b  o- zV0 NET2 0  PULSE 0  3.3  0.5E-7    1.952E-10 1.952E-10 0.976E-7 1.952E-7/ \" W! Q0 q& G9 D4 }& g! a
V1 NET6 0  PULSE 0  3.3  1.476E-7  1.952E-10 1.952E-10 0.976E-7 1.952E-76 X6 S, Z5 ?+ T. |
另外,我在hspice做FFT運算取的點數為32k,所以根據計算,如果Fs=10.24M,.tran的時間=(1/Fs)*32k=3.2msec,如果Fs=5.12M,.tran的時間=(1/Fs)*32k=6.4msec。! Y. B+ K$ o7 h; j
如果依照你指令的寫法,根據我的clock=>Fs=5.12M,delay 0.05us的情形下,同樣第一個數位取出的時間為第5個clock週期來取出1個bit的digital code,然後在第6個clock週期時又取出第2筆digital code,寫法是否為:$ c+ ]# N+ B7 I3 Q. T! I' D
.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=1.026us& H2 U1 U* j8 f2 ?0 t
.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=1.2212us' o  M0 v2 j5 n6 Y) I
然後以此類推,在第7個clock週期時又取出第3筆digital code,如果32k點(二進制),就須寫32768行,這樣對嗎?
- n- T- K* g4 Z6 w你說可以用matlab寫迴圈,可是如果我是將hspice的輸出數據再帶到matlab做計算,那我就需要先在hspice下指令記錄輸出數據,再帶到matlab中,那這樣子變成還是需要在hspice中寫32768行的指令才能記錄數據,或是說有其他辦法可簡化hspice指令?或是就你所言,用MATLAB程式寫成一個自我產生的.measure,但要如何做呢?還請finster副版主多多指教!謝謝!/ x. V# l- k- L2 H8 E0 e1 L
6 }0 e' Y: n* y2 l
[ 本帖最後由 緣緣 於 2007-11-8 03:04 PM 編輯 ]
18#
發表於 2007-11-12 02:06:38 | 只看該作者
看了一下你的說明,覺得有些奇怪的地方
7 L$ A1 \0 R6 P+ M& n4 I首先,我沒作過switched current ADC,不過,依照取樣原理理論來說,取樣頻率需大於輸入信號的兩倍才能夠將原始信號還原回來& j5 m5 h& \. w6 o+ F# v9 E" e
而你的取樣頻率和輸入信號頻率卻非常地接近,似乎有違取樣原理的理論基礎,不知道這個樣子真的能夠取出真實的信號?2 Q3 e. s: ~% [: f8 n6 X7 |4 n* m

) P4 u7 t* q1 V8 O" s/ M, \再者,FFT運算基本上也是依照取樣原理理論發展出來的,因為FFT的取樣點數是輸入信號的2^N倍,N的最小值為1,也就是FFT的最小取樣頻率是輸入信號的2倍,亦即輸入信號在一個週期內會被取樣2點,而我們所撰寫的FFT來計算SNR,SFDR,THD...也是依此理論陸續往下寫的,所以,看了你的規格,實在覺得有些奇怪: \# q5 e5 j& K+ o) z

9 f0 O# I* ?6 S1 S4 D* L  QFFT的取樣點數如我剛才所言是取樣點數是輸入信號的2^N倍,所以,取樣點數為2,4,8,16,32,64,128,256,512,1024,2048,4096...,一般取到1024點或者2048點就已經非常足夠了,因為超過2048點之後所計算出來的SNR,SFDR,THD....其實變化的只有小數點後面幾位的不同而以,取樣到32768點,其實真的不需要0 N$ u' c6 I! j8 I

% ]- a, w' ?* f) `clear all
: V- L. n4 d' {fid=fopen('dual_measure_rms.txt','w')$ |/ g+ z- u$ _0 Q8 K; w+ W
for M=1:1:1024* I, e8 u) {, u9 a. W& F
       T=M-1;/ x. @$ I# F4 s0 L) S
       from=(50*T)+45; %DUAL DAC measure time
6 z; @/ u; v- b5 ~$ E2 f       to=50+(50*T);9 w& s" Y! G5 n- P+ y7 Q* J6 F" D
       fprintf(fid,'.MEASURE TRAN A%g RMS v(daci_outp) from=%gn to=%gn\n',M,from,to);4 D+ u8 V6 e* ^' K& X! D
end& M5 _) N5 v; B; i
MATLAB程式會產生一個dual_measure_rms.txt檔,你將這個檔裡面的.MEASURE複製到HSPICE中即可,不過,如我前面所言,取樣頻率是輸入信號的2^N倍,然後再算出我的取樣點的時間點為何,如果不知道這些關係式,那這個MATLAB程式將無法使用, y; r$ {. j/ t
這個程式很簡單,只是一個迴圈再加上幾行計算時間的式子
19#
發表於 2007-11-12 12:02:56 | 只看該作者
感謝Finster提供一個非常實用的小技巧6 }; M( U; k" y) G; A5 B( R* X
這樣以後模擬FFT就非常方便了9 O9 O+ S( W1 Q6 b
看一下應該是先計算好要取樣點的時間間隔 也就是sample clcok的時間: K0 q; m/ T+ l3 p* G) v2 Y# I( z
然後譬如取1024個點 就用Matlab產生1024個.measure指令敘述吧
; ?3 N; E- D: s1 E) N$ k  J; U只是我Matlab指令不熟 看來這些程式碼還得花點時間弄清楚一下
20#
 樓主| 發表於 2007-11-13 15:58:41 | 只看該作者

再次感謝Finster的詳細解說

首先我想請問副版主finster,你說我的取樣頻率和輸入信號頻率非常地接近,在取樣頻率Fs=10.24MHz的條件下,不知這裡輸入信號頻率指的是輸入信號頻率10K,還是輸入信號頻寬頻率40K?
% e' C2 P0 P  P3 _3 l6 _# c我解釋一下我為何要用fin=10k,Fs=10.24MHz的原因:
6 m: N/ G2 T( z1 M/ A# f因為我的Fs=10.24M,所以我的Fin=10.24M/1024=10k,會取1024倍的原因是之前曾上過ADC的課程,上課的講師提到由數位信號處理(DSP)的理論,Fs=1024*Fin的情形下,頻譜比較不會產生leakage。
; c9 B5 ]  P' }/ O且如果以我的規格來看,我的OSR=Fs/2Fb=10.24M/(2*40k)=128,我是希望縮小Bandwidth提高OSR,進而提高SNR,可是我們老闆堅持要做到40k以上,所以,在無法提高取樣頻率Fs的情形下,只能維持OSR=128來設計。6 w" A+ J# p1 ^
另外,為何FFT運算要取32K points,是因為我看相關的論文,幾乎都是取16k或32k points,然後我在hspice使用FFT指令來計算的結果,好像32k points以上圖形比較像SNDR的圖形,所以才用32k points,後來再問其他人員,SNDR要由matlab做計算,輸出的圖形才準,論文中提到matlab計算的點數大多也是32K points,也因此,我也才想用32k points去計算FFT。+ K. G7 F% }' H5 N! m, K/ g  S
依照你所言,由於我的Fs是Fin的1024倍,所以,我的FFT只需取1024點即可,依照你的.measure迴圈程式,我將程式更改為:
* o( C% W) }- Yclear all, j, D' u  ~8 P. C
fid=fopen('sdm_out.txt','w')0 y+ S0 l# H9 f8 W5 v+ J0 @
for M=1:1:1024
% ^) L; S  o: W4 Z) _, ^2 m; X    T=M-1;! y1 ^8 h) w7 z% Z$ C" Z9 Q6 M& _
    AT=(0.1952*T)+1.026; %SDM measure time
2 a) o2 ^4 X# u( @. @$ l9 U$ s    fprintf(fid,'.MEASURE TRAN DIGOUT_t%g find V(D0) AT=%gu',M,AT);" E0 O" \+ Q  u$ g
end4 ^" a1 W3 p& o6 k: m$ e( O; {( z3 R
試的結果,可得到1024行.MEASURE的指令,我會把他代入hspice程式跑跑看。& ~: c$ u+ f  m- S
想再請問的是:9 v+ L) j  S: j/ m
當我使用.MEASURE指令得到數據後,是不是還要在你提供的SNDR&SNR的Matlab程式前加上load指令,例如:/ Q" j& V/ e  I; s* `2 ~
load sdm_out.txt -ascii ;%sdm_out.txt is output digital code of SDM, E, K  y% H- g6 n! H
然後就可算出SNDR及SNR以及畫出圖形了嗎?
  H9 x  I1 z* X0 t% z3 V3 l請指教∼
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-4-28 09:01 AM , Processed in 0.145008 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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