Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 98988|回復: 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)?包含方法及指令,愈詳細愈好。拜託有高手能相告。
8 K! X, _5 k- t5 |! ]謝謝!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂13 踩 分享分享
推薦
發表於 2008-5-13 21:53:55 | 只看該作者
幫忙補充一下,
: p. x0 s8 P) C9 x' |4 L# U( p要使用這個toolbox時,在hspice的.option中不能使用post=2.* w+ r; y1 S$ ]8 z4 W0 Z$ X
可以用
* s$ j* ?* z# R+ a.option post
2 V' Y1 t9 ?. S% J& S或是
- [. C1 q9 d2 l/ y# Z.option post=1, K9 n0 ~- ?# r# R
但絶不能用# {- e3 `, s$ Z9 O. Y/ M& T
.option post=2
推薦
 樓主| 發表於 2008-4-28 17:19:49 | 只看該作者
志良你好:/ r# S, z4 M" H
如果你是要將hspice的波形用matlab叫出來比較,你可以去Matlab網站下載hspice toolbox來用,至於用法,我之前有在網路上搜尋到hspice toolbox的英文及簡體的說明檔,我另外自己也寫了一份繁體中文檔,我把他們全部置於附件中,供你參考,你看完說明檔後,應該就會用了,有問題再發問吧。; b5 J. p: w( l/ e  ?
關於你的第二個問題,這說起來可能有點複雜,你可以看一下版面上我之前與版主及副版主的問與答內容,應該可以知道如何從hspice下指令得到所需的資料,matlab程式的寫法,可以去買有關matlab的書來看,到時有問題再發問了。希望對你有幫助。
( A0 f8 a" c2 @0 X9 {$ H
4 W) |+ {/ K5 x; |8 Z* j8 h[ 本帖最後由 緣緣 於 2008-4-28 05:48 PM 編輯 ]

本帖子中包含更多資源

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

x

評分

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

查看全部評分

2#
發表於 2007-10-5 18:42:51 | 只看該作者
我之前做ADC再算SNR有用過一個方法 可是很爛 但是還勉強可以用
/ w. h9 p* D, q+ M3 W% E6 a' P就是直接用.print指令把你要量的電壓印出來/ p, m2 z( f. \+ b$ [1 z
然後再用手動把印出來的資料copy起來5 V* K4 X! K( y
然後貼在Matlab程式上面 然後就可以做FFT了
3#
 樓主| 發表於 2007-10-5 21:39:18 | 只看該作者

謝謝版主回復

謝謝版主的回覆及支援,我之前有找到一個MATLAB的應用軟體叫做HspiceToolbox,可以將hspice輸出的檔案透過HspiceToolbox將檔案轉入MATLAB中,也可用MATLAB叫出hspice電路中各節點的信號,只是,接下來MATLAB要用何種指令才能算出電路輸出點的SNDR及DR,我知道可以將MATLAB的指令整合成一個副檔名為m的檔案,不知版主或其他高手有沒有這方面的指令寫法或是m檔案,那就感激不盡了。
, |- d6 r7 h# k/ r) v
) }* z9 V; S% q7 ]謝謝!
4#
發表於 2007-10-8 09:40:08 | 只看該作者
Matlab 有 fft 的  program, ' g1 u  ^8 M) e, |- F3 c
所以  只要將FFT後的資料  做一些轉換就可以唷!!
* ^6 }+ D  N, P: O1 s+ b將主信號找出來!!  然後將"所有的 fft power 加起來 - 主信號的 power"
* p# t9 F0 Y% T% a7 G$ ?. ]2 ^: Q就可以換算  SNDR 了!!; [. Y! A* o( d0 S/ U
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部份程式  _+ k3 M+ p# [5 a4 e
我想,應該可以給你一些參考吧6 u: x: G+ q  z5 p; D" H

4 Q$ ^/ w* e+ ^9 m) B- s% --------------Using minimum 4-term Blackman-harris Windows -------------1 X6 C6 I, o' l6 [
nb=1:1ts;2 W( {# @6 t+ S/ h0 f8 p0 Q
kb=0.355768-0.487396*cos(2*pi*nb/(pts))+0.144232*cos(4*pi*nb/(pts))-0.012604*cos(6*pi*nb/(pts));
3 @" ?# `" v8 [2 ^, P3 b& qwin_gain=sum(kb)/pts;
  {& @0 n  ~8 ]kb=kb/win_gain;  [7 {/ Q; c( u. }) A. O1 w
- z9 G) p, d* _# ^: D: L
% --------------- Calculated fft --------------------------
0 }! z% B: `! o+ x5 z( Pyb=kb.*x(ptsttfi);
* h9 D( c% O* a. k! j# _yk=fft(yb);/ e; p8 X# a+ N6 t- T' D
fft_no=length(yk);* K, z" J7 }/ b
f=fs*(0:fft_no-1)/fft_no;
/ s: T) o" b2 l+ Z, h/ ?Pyy=yk.*conj(yk)/((fft_no/2)^2);( r" d3 q: B5 U

% v, g: k0 x4 H& w- S- M( {% ---------- Calculate THD ----------------------------' G) ^1 _& u+ T5 }
j=1;
; s6 j5 h$ t/ |& W, l! Gfor i=1:1fft_no/2)  t1 G# w  d' C$ d: z# u' Q
    if (f(i) == (fi*j))+ O2 `" J' [/ l6 v2 m( n0 I5 m* e( q* @
        HD(j)=Pyy(i);     %% find all harmonic distortion components1 x4 k/ q# c6 n$ Z- \1 H
        j=j+1;
$ U% I+ Q# s1 ?3 i# p    end
: `3 K6 ^5 L1 H8 i1 i6 x5 bend/ U$ q  y- ?- u* N; ~$ d2 V
P_hd=sum(HD(2:9));
; W) _4 Q/ E; VTHD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal
6 d& w$ g6 l2 g* t4 Lfprintf('THD = %g dB\n',THD);
/ x* L9 f$ c# B1 o  [
/ x& \/ r8 f# t( Z: E% ---------- Calculate SNR ----------------------------
% G3 T, I+ r# q; y. ffundamen_dB=max(10*log10(Pyy(1:fft_no/2)));
- \$ z) A6 Y: d& Hfundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);- ~/ o$ w9 }1 [( E; T$ Z2 e
span=max(round(fft_no/200),5);
+ M4 L* b; ]* z! W/ T2 n6 ^P_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));
1 @1 P* h1 @5 V4 z$ {3 h' @2 Q5 L8 V
P_noise1=sum(Pyy(1:fft_no/2))-P_sig-P_hd;
+ a$ R* c# X" }SNR1=10*log10(P_sig/P_noise1);
3 |3 r7 L: \$ f8 t  ?: h) n* sfprintf('SNR = %g dB\n',SNR1);
7#
 樓主| 發表於 2007-10-15 19:34:54 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:
3 x- l- q, @" R8 t5 Z請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。3 ?6 [0 P. @: @5 l" G  I- S8 c2 z

- a3 s3 T! r# O' w9 B另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:
2 |6 S: A. Z( ~1 ]"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"3 ~1 @$ d  D6 ~" f: H) I
內容為:( U9 a2 o- @1 R- G: j2 g
压缩文件共有三个文件:两个m文件和一个txt文件
6 Q  @1 r1 g- B' L7 k4 Y  hspectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。+ a) ?$ |. S. \7 u6 U
希望大家喜欢!!
5 f& N3 ^. F* ]6 O5 i附件為:FFT.rar9 B9 Q+ Y' M7 e9 D. |0 U% f6 d# p
( }* r3 ]( u  M, w+ 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卻顯示以下的錯誤訊息:
( g; _! z) v  e: Y& }) p9 a; g- ?+ O- @
??? Undefined command/function 'AD10'.
5 l! H7 K. ]4 H: X' J3 y5 @9 x0 i9 n% a2 }0 |( x
Error in ==> spectra2 at 43
8 _; G" s7 ~  I7 t8 Hd0=round(AD10(start:stepstart+M*step-step),3)/1.8);+ q- `9 O2 o. X, v

# x5 w( w6 y3 E* P8 I由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!/ b+ R  u+ a6 h! K, d

( a5 H$ K8 s2 r  O4 L9 _, r+ I∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~??????? 2 i; C* E' p+ J% T
% ]1 N% P. }! d# Y7 ^- j1 E
[ 本帖最後由 緣緣 於 2007-10-15 07:54 PM 編輯 ]
8#
 樓主| 發表於 2007-10-15 20:54:45 | 只看該作者

謝謝副版主回復

謝謝finster副版主回復,想再請問一下:: {% B( N2 M) u2 F  D9 E* r3 j
請問你的程式是將Hspice輸出的*.lis檔內的FFT做運算,還是使用HspiceToolbox由Matlab將Hspice電路中各節點的訊號叫出來,才根據某一輸出點作分析,還請不吝指教。 - ^9 l8 K+ D2 G; l
另外,我在另一個網站(EETOP,中國電子頂級開發網)發現一個matlab的m檔,原帖標題為:
4 \$ H; ^5 t  H3 b9 R9 s: B* h"一个对ADC和PLL输出结果作FFT频谱分析的matlab程序,推荐!"1 n+ m) R) y' f! C* J. ?+ C
內容為:
# |, ~  l5 B- C! \& ~5 r8 b; H压缩文件共有三个文件:两个m文件和一个txt文件
* s/ y! l( r) w3 h& J+ m; K, g* Xspectra.m :用来调用主程序fft_analy.m和txt文件。其中txt是我做的27M PLL的Hspice输出模拟结果。步长为1ns,对应里面的取样频率fs=1000。cycle对应的是取的波形长度。如果数据是ADC的量测结果,则要添加相应的bit数,程序里已标明PLL和ADC的语句。
! c* g% t& G3 R3 g$ b7 r8 O希望大家喜欢!!
/ N3 {" K) w( X) [附件為:FFT.rar
- A: Y, L5 K1 W, d* k
4 D% V( y/ S; i+ \! }我根據他的說明修改他的程式變為如附件FFT2.rar的程式,FFT2包含一個ADC用Hspice做FFT分析得到一個輸出結果,如int40b.txt,主程式內容修改成fin=5K,fs=5.12M,Bit數為1 bit,如附件FFT2.rar內的spectra2.m及fft_analy2.m,執行後,Matlab卻顯示以下的錯誤訊息:
! }7 p1 B8 P, x& S
' H! i1 f' w; [& I& @??? Undefined command/function 'AD10'.1 }& p. s  O  {4 p

: G* S( B" j( |3 mError in ==> spectra2 at 43
% @2 C6 @; O7 `  Y# Z6 ud0=round(AD10(start:stepstart+M*step-step),3)/1.8);
8 h$ `6 P9 U; L' ^7 E! _1 _( R! Z; w& W/ [
由程式的錯誤訊息應是"AD10"的函數或指令未被定義,但不知如何再做修改,可否請Finster副版主幫我看一下,有什麼地方需要修改,感激不盡!
9#
 樓主| 發表於 2007-10-15 22:18:15 | 只看該作者

增加附件

∼不曉得為何無法上傳附件,一直出現Internet Explorer無法連線訊息~???????( E+ b! v. f( E  m4 x
附上上帖的附件

評分

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

查看全部評分

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

本帖子中包含更多資源

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

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

有關hspice .measure指令寫法

再請問一下finster副版主,如果我是要將Hspice的電路輸出點Dout,使用.measure指令來記錄ADC的輸出信號數值,暫態分析(TRAN)掃瞄區間:0~3.2msec,
3 ~1 ?( v' d' i指令的寫法是否為:( Q% c; X, `$ t* O
' A( }9 S$ b" G5 W3 f7 Q  ^: [
.MEAS TRAN DIGOUT
( o3 L4 W3 D5 m( g1 i0 ?1 f  z+TRIG  V (Dout)  VAL=0        RISE=2! M9 @/ m1 B0 Z. L; P. o3 z5 F
+TARG V (Dout)  VAL=3.2m  RISE=29 n! \7 y6 X2 I4 }% b2 G( j/ T

% H* M# b7 _/ ^$ q. x∼還請指教,謝謝∼
0 F# p3 G6 k2 u5 O" ]
1 ?" o9 L2 p3 n8 E0 [另外,我先使用一個小程式去試.measure這個指令,輸出的*.lis只發現以下的數據:
: n: |9 T7 l5 I4 U! R& o6 ~& U# t
digout=  3.7443E-09  targ=  1.5167E-07   trig=  1.4792E-07& N( `- b% g+ C: f& M

( j; F: u5 F: l) `9 t. q6 hHspice輸出檔多了一個*.mt0的檔案,該檔內容同上面之敘述,不知是否還有那邊出錯?  J  `: u" [. z' p# R

. _7 j9 Z+ a( {1 S[ 本帖最後由 緣緣 於 2007-10-16 05:34 PM 編輯 ]
13#
發表於 2007-10-16 23:08:40 | 只看該作者
在Hspice執行.measure指令時,它是依據你的.lib的數目來產生相對應的*.mt*檔
& a( C1 s! W# i故而,如果你的檔案有多出*.mt0的檔案,那表示這是你的.lib的第一個依據.measure所計算出來的資料2 m* a& @: q' V! ]$ h
所以,請再檢查一下你的HSPICE檔案吧
3 a. E. k" x  n; E( p  }; b/ u! \+ D9 m) x, Y* m
再來,你的.measure指令用法沒有問題
/ X7 v! m% O0 R( B5 p: J但,你的取樣點及時間似乎不對6 K* V9 v  P: r. H: w
你的暫態分析(TRAN)掃瞄區間:0~3.2msec,你所用的指令為:, R7 [  `1 w0 P( e2 D! Y% Y
.MEAS TRAN DIGOUT( A, C6 I5 L' s) j# M! x
+TRIG  V (Dout)  VAL=0        RISE=2
8 @$ R+ X% B8 K4 d+TARG V (Dout)  VAL=3.2m      RISE=2
: L( u, r- l. m8 \* f. V寫法沒錯,但,如果是ADC,那其輸出信號為digital,故而,輸出信號的振幅不是0就是vdd,如果要記綠輸出信號的digital code的話9 L2 p& i: Q; P! A
那,計算輸出信號的digital code應該依照clock來作取樣時間,而不是0~3.2ms,也就是.measure的VAL要是clock
" U3 b0 _1 w0 @1 t% x' B另外,若依照你的指令來用,應該會計算不到輸出信號,除非你的模擬時間超過6.4ms,因為你是用RISE=2, E1 j! L" L  y
再者,如果是用.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程式。
3 Y  S4 M* z" f0 F3 b+ @; [; K
1 c  ]( t2 m4 q' \, p; J∼感激不盡∼
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# j9 O* D" n$ k  y* n* k$ I, V
3 }) X8 A, P4 X" H8 S& m& o- q# t' n6 `+ L9 u( F
.MEAS TRAN DIGOUT
* L  ^; _5 \6 y* }3 E: H+TRIG  V (Dout)  VAL=0      TD=0.5E-7    RISE=1( Z" a/ w) H+ q' t$ Y3 `! j! f' H3 o3 A- T9 `6 E! t9 y+ _
+TARG V (Dout)  VAL=0.976E-7               RISE=1
5 l  e" p0 S& @5 y& Q% _6 I9 K0 u: L$ h6 j* {
∼還請指教∼6 k7 G  m6 g* B0 I* \& _
程式重試的結果,*.mt0檔案只出現:9 P) |# l  H+ K
digout           temper           alter#            
& P6 t6 t; I) J; r/ [% M2 B1.890e-12        25.0000           1.0000         
! l9 J+ M$ ?' w% I6 d$ r* O不知是否還需修改?" }3 A' x% Y' O* N, Q

+ H/ G8 m4 Q6 R6 L5 ?7 d[ 本帖最後由 緣緣 於 2007-10-19 12:11 AM 編輯 ]
16#
發表於 2007-10-19 01:58:58 | 只看該作者
先回答第一個問題
) @6 W8 k4 R, Q2 `5 h% t/ Y; n你的MATLAB程式我大概看了一下,發覺到AD10應該是一個由別人自行撰寫的運算函式,而因為你在MATLAB程式中並沒有這個函式,同時也沒有呼去這個函式,故而,你在執行MATLAB程式時,當然會出現錯誤訊息
1 a& `& \& X4 k* M/ r" E所以,如果這不是你自己寫的MATLAB程式,那我只能說你的MATLAB程式並不完整,也許,這是別人故意留一手的吧. ]+ t& p: u+ p- |$ Z$ \$ \" a

; p6 }9 w. z, R$ H; V% J* B! t再來,在ADC中的Sample and hold電路若是用SC電路,是會用non-overlap clock,故而會有兩個clock6 r* v, E3 t( w0 N3 z" n
但,源頭的clock只有一個,而這個clock會透過non-overlap circuit去產生兩個時間差的clock& v" ~6 P# i, `! V( `
一般而言,ADC的數位電路所需的clock通常都是由源頭的clock作為基準,然後將數位信號輸出,故而,在使用.measure時,所參考的時間及頻率也該是以這個源頭的clock為主,而不是由non-overlap circuit所產生出來的兩個時間差clock,除非,你的ADC電路並沒有包Sample and hold circuit(我不清楚你的電路架構為何,但,ADC一般而言一定要有Sample and hold circuit)
, a+ s) e4 E' \! h再來,我看了一下你的取樣頻率為5.12Mhz,這是很低的clock頻率,所以,照理來說這麼低的頻率,你的架構應該是採用SAR架構的ADC吧,那你的輸入信號頻率為何呢??另外,你的.tran的時間多久呢???還有,你是幾個bit的ADC呢???
2 @% z' `- t6 S& |6 Q舉個例來說,假如你是4-bit ADC,輸出分別為D3,D2,D1,D0,且clock為1MHz,所以使用.measure應該為2 [1 U6 x; y2 A; h( H, K0 N, j+ t
.MEASURE TRAN DIGOUT_D3_t1 find V(D3) AT=5.2us
6 t% }; L5 \$ A.MEASURE TRAN DIGOUT_D2_t1 find V(D2) AT=5.2us( S* u0 u5 U7 [
.MEASURE TRAN DIGOUT_D1_t1 find V(D1) AT=5.2us
4 i& Q' B: e6 {% V! H.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=5.2us
- u# x9 R' t8 p0 f. m' ~2 b8 h. F! u) @) u: _# T+ ~! e' r
.MEASURE TRAN DIGOUT_D3_t2 find V(D3) AT=6.2us
2 m, B2 x+ n; \.MEASURE TRAN DIGOUT_D2_t2 find V(D2) AT=6.2us
7 I' b( ]4 J) e* y# r.MEASURE TRAN DIGOUT_D1_t2 find V(D1) AT=6.2us+ D0 f3 X8 t0 f9 D
.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=6.2us
) E$ ?2 k1 Y% i2 Y
4 E) Y+ a( n; L( D: B我只計算clock的週期,然後再初估ADC中的delay時間為0.2us,所以,我第一個數位取出的時間為第5個clock週期來取出4個bit的digital code,然後在第6個clock週期時又取出第2筆digital code) T: a% X, A) [7 c
我用的方式較為簡化些,因為ADC要取出的是在每個clock週期中的digital code,所以,只要精算出每個clock時間,即可簡化.measure的指令,而不用用到TRIG....TARG.....,當然,這是我的作法,你也可以依照我前面寫的改成你用的TRIG...TARG的用法
' F/ k2 J, I8 f' h/ J# V1 d5 r* y* f2 \! R2 Y3 b- L
最後,像我剛才寫的.MEASURE TRAN DIGOUT_D3 find V(D3) AT=5.2us  w! F' w# M+ v) T6 y
可以用MATLAB程式寫成一個自我產生的.measure,我以前是用MATLAB來自己產生的,不然,光是計算1024點就要寫4096行.MEASURE指令,那是一件很浪費時間和生命的事,用MATLAB的迴圈即可一下子產生出所有.MEASURE指令,小小作法,提供給你參考
17#
 樓主| 發表於 2007-11-8 15:00:24 | 只看該作者

謝謝finster副版主的詳細解說

再次謝謝finster副版主的詳細解說,我前一陣子剛好有事在忙,沒有及時回復你的問題,還請見諒。3 ]9 S% J# {9 J7 Y1 {
我大概講一下我的架構:  M2 i# W6 J+ z9 T  |! q1 x0 o/ L
我電路是使用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的指令寫出,指令如下:
. G' v0 n5 h$ B- N' Y- m. g; `: C/ l* NFor Fs=10.24MHz:
8 }, y0 k3 X! `$ o9 _5 pV0 NET2 0  PULSE 0  3.3  0.5E-7    0.976E-10 0.976E-10 0.488E-7 0.976E-7: O/ c0 W/ y5 M, J
V1 NET6 0  PULSE 0  3.3  0.988E-7  0.976E-10 0.976E-10 0.488E-7 0.976E-7: j4 Z1 T, C4 ~( a. n& y* M
For Fs=5.12MHz ( ^5 S, \* h  g; ]6 n! J) ]( e
V0 NET2 0  PULSE 0  3.3  0.5E-7    1.952E-10 1.952E-10 0.976E-7 1.952E-73 b3 J4 |2 I6 l; S" ~9 f2 x
V1 NET6 0  PULSE 0  3.3  1.476E-7  1.952E-10 1.952E-10 0.976E-7 1.952E-7
; _' X- B3 }& X; L( q; c另外,我在hspice做FFT運算取的點數為32k,所以根據計算,如果Fs=10.24M,.tran的時間=(1/Fs)*32k=3.2msec,如果Fs=5.12M,.tran的時間=(1/Fs)*32k=6.4msec。* l: h6 b% o* ~$ A
如果依照你指令的寫法,根據我的clock=>Fs=5.12M,delay 0.05us的情形下,同樣第一個數位取出的時間為第5個clock週期來取出1個bit的digital code,然後在第6個clock週期時又取出第2筆digital code,寫法是否為:
+ R5 m7 Q. Y" q* ?.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=1.026us
/ j+ {9 Z+ m8 Q! Q3 ?( {& ~.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=1.2212us
* X6 S1 T1 y4 Q- l然後以此類推,在第7個clock週期時又取出第3筆digital code,如果32k點(二進制),就須寫32768行,這樣對嗎?4 x7 R. `* j6 `+ ^( w
你說可以用matlab寫迴圈,可是如果我是將hspice的輸出數據再帶到matlab做計算,那我就需要先在hspice下指令記錄輸出數據,再帶到matlab中,那這樣子變成還是需要在hspice中寫32768行的指令才能記錄數據,或是說有其他辦法可簡化hspice指令?或是就你所言,用MATLAB程式寫成一個自我產生的.measure,但要如何做呢?還請finster副版主多多指教!謝謝!
5 Z3 D$ P9 e& F( T. I
' N5 ]+ G6 Q7 U& L  A' k[ 本帖最後由 緣緣 於 2007-11-8 03:04 PM 編輯 ]
18#
發表於 2007-11-12 02:06:38 | 只看該作者
看了一下你的說明,覺得有些奇怪的地方2 ?0 Q' p4 t/ A% q5 S5 D
首先,我沒作過switched current ADC,不過,依照取樣原理理論來說,取樣頻率需大於輸入信號的兩倍才能夠將原始信號還原回來
5 L# ~3 }8 Q" B# w; `+ F% P而你的取樣頻率和輸入信號頻率卻非常地接近,似乎有違取樣原理的理論基礎,不知道這個樣子真的能夠取出真實的信號?# v5 s5 \8 M1 |# B2 N* Z0 M5 u/ G- Z
& G' o/ e* W9 [8 y* E! N3 K" I
再者,FFT運算基本上也是依照取樣原理理論發展出來的,因為FFT的取樣點數是輸入信號的2^N倍,N的最小值為1,也就是FFT的最小取樣頻率是輸入信號的2倍,亦即輸入信號在一個週期內會被取樣2點,而我們所撰寫的FFT來計算SNR,SFDR,THD...也是依此理論陸續往下寫的,所以,看了你的規格,實在覺得有些奇怪
+ ]7 ?4 l! `, [0 p, |" h+ c6 f/ J* r2 X9 J, H, s" T
FFT的取樣點數如我剛才所言是取樣點數是輸入信號的2^N倍,所以,取樣點數為2,4,8,16,32,64,128,256,512,1024,2048,4096...,一般取到1024點或者2048點就已經非常足夠了,因為超過2048點之後所計算出來的SNR,SFDR,THD....其實變化的只有小數點後面幾位的不同而以,取樣到32768點,其實真的不需要& F5 ?+ W5 G2 b" W( x
3 c. U" r0 V. X0 K% E! n* E: V
clear all
/ I5 M* k/ n2 {fid=fopen('dual_measure_rms.txt','w')
: L0 X; S. D2 _$ _for M=1:1:1024
  I! P3 |: U8 c7 o6 l, L( m0 R8 M       T=M-1;+ \9 ^! i1 L2 A
       from=(50*T)+45; %DUAL DAC measure time3 k0 K8 z; B: I/ T
       to=50+(50*T);
. h5 [% E( w- K$ `1 T. n6 {( V. N# G       fprintf(fid,'.MEASURE TRAN A%g RMS v(daci_outp) from=%gn to=%gn\n',M,from,to);1 W$ E8 v6 p, u. b4 Q4 L
end" s( r4 [0 r6 @5 W$ e& r# N7 A
MATLAB程式會產生一個dual_measure_rms.txt檔,你將這個檔裡面的.MEASURE複製到HSPICE中即可,不過,如我前面所言,取樣頻率是輸入信號的2^N倍,然後再算出我的取樣點的時間點為何,如果不知道這些關係式,那這個MATLAB程式將無法使用
6 m& G2 g3 ^5 M" W& j這個程式很簡單,只是一個迴圈再加上幾行計算時間的式子
19#
發表於 2007-11-12 12:02:56 | 只看該作者
感謝Finster提供一個非常實用的小技巧- \" I' ?% d! d
這樣以後模擬FFT就非常方便了" i0 K+ l% N5 k
看一下應該是先計算好要取樣點的時間間隔 也就是sample clcok的時間8 w4 \% ?' a/ O3 `. m; y
然後譬如取1024個點 就用Matlab產生1024個.measure指令敘述吧
$ Y1 {, N3 Y9 H; i只是我Matlab指令不熟 看來這些程式碼還得花點時間弄清楚一下
20#
 樓主| 發表於 2007-11-13 15:58:41 | 只看該作者

再次感謝Finster的詳細解說

首先我想請問副版主finster,你說我的取樣頻率和輸入信號頻率非常地接近,在取樣頻率Fs=10.24MHz的條件下,不知這裡輸入信號頻率指的是輸入信號頻率10K,還是輸入信號頻寬頻率40K?( ], v/ a9 P9 ^% ^' |9 ^0 [0 B. J+ m8 o
我解釋一下我為何要用fin=10k,Fs=10.24MHz的原因:
8 c# Z! E/ C6 `) q因為我的Fs=10.24M,所以我的Fin=10.24M/1024=10k,會取1024倍的原因是之前曾上過ADC的課程,上課的講師提到由數位信號處理(DSP)的理論,Fs=1024*Fin的情形下,頻譜比較不會產生leakage。
3 e. W! {7 j* x3 B且如果以我的規格來看,我的OSR=Fs/2Fb=10.24M/(2*40k)=128,我是希望縮小Bandwidth提高OSR,進而提高SNR,可是我們老闆堅持要做到40k以上,所以,在無法提高取樣頻率Fs的情形下,只能維持OSR=128來設計。
1 c6 L2 l/ a" ^; H1 l: c另外,為何FFT運算要取32K points,是因為我看相關的論文,幾乎都是取16k或32k points,然後我在hspice使用FFT指令來計算的結果,好像32k points以上圖形比較像SNDR的圖形,所以才用32k points,後來再問其他人員,SNDR要由matlab做計算,輸出的圖形才準,論文中提到matlab計算的點數大多也是32K points,也因此,我也才想用32k points去計算FFT。+ m9 w; ~7 w6 A# V3 U4 |. W) U  r
依照你所言,由於我的Fs是Fin的1024倍,所以,我的FFT只需取1024點即可,依照你的.measure迴圈程式,我將程式更改為:/ U; x2 q) ^& Z3 L/ q6 B
clear all" A" V2 U9 N- {* _
fid=fopen('sdm_out.txt','w')
% t. l& C9 G* V. H' yfor M=1:1:10247 |" K0 Y+ L+ w7 P+ i
    T=M-1;7 H8 O/ G% |; ^* w( f
    AT=(0.1952*T)+1.026; %SDM measure time; F. u" S. F1 O2 o1 e
    fprintf(fid,'.MEASURE TRAN DIGOUT_t%g find V(D0) AT=%gu',M,AT);
! L# Q+ b5 i0 f5 wend
7 g$ z! K2 c4 X試的結果,可得到1024行.MEASURE的指令,我會把他代入hspice程式跑跑看。0 f: ?$ E: k- |
想再請問的是:
7 ?; L" U- i  {; g7 c. S$ @! R當我使用.MEASURE指令得到數據後,是不是還要在你提供的SNDR&SNR的Matlab程式前加上load指令,例如:
5 ?: }/ R7 i% B, b" z) y9 i" \! w/ xload sdm_out.txt -ascii ;%sdm_out.txt is output digital code of SDM) ^- g  p4 n% B4 v
然後就可算出SNDR及SNR以及畫出圖形了嗎?, Q  W" D" {- C: F% w; s8 a
請指教∼
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2025-2-19 06:18 AM , Processed in 0.208012 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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