Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
樓主: 緣緣
打印 上一主題 下一主題

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

  [複製鏈接]
1#
發表於 2007-10-13 08:20:07 | 顯示全部樓層
我以前作DAC的MATLAB部份程式9 j) s  q' Z; M6 k9 |  }
我想,應該可以給你一些參考吧4 r% e0 C% r6 A0 {* K; P5 l

9 e( n" v- K5 p1 W% e$ s% --------------Using minimum 4-term Blackman-harris Windows -------------
: H$ P2 R( |0 T& P/ M, L- [nb=1:1ts;
& u, ^. g7 ~2 ?4 z- m9 G5 u0 xkb=0.355768-0.487396*cos(2*pi*nb/(pts))+0.144232*cos(4*pi*nb/(pts))-0.012604*cos(6*pi*nb/(pts));* Z: M$ Y1 @0 \% U+ D. p9 F6 J/ Y
win_gain=sum(kb)/pts;& q2 a' Z7 T  p! R
kb=kb/win_gain;' b8 j- S( Y4 S5 ?. V0 |
4 a: F6 |+ D& h$ l* ]. S
% --------------- Calculated fft --------------------------  Z- K5 h5 m- X$ U' L/ Y
yb=kb.*x(ptsttfi);" \, h1 r! N+ ^; F9 R/ N# C) ]
yk=fft(yb);1 Q% h5 C! \8 |
fft_no=length(yk);
& |# [$ q! M5 F$ }, H  Vf=fs*(0:fft_no-1)/fft_no;
& l* _0 z' W7 J% u* U5 [" SPyy=yk.*conj(yk)/((fft_no/2)^2);6 W' X8 E) B- e  ]; K* h$ D, H0 ~

6 {- L! W) J5 d6 c% ---------- Calculate THD ----------------------------: G- R" N: T$ |" M. _5 G( l& }
j=1;% V9 e7 k! M9 p  x1 Z* s( b0 C
for i=1:1fft_no/2)0 ^) b3 W2 Z( c8 V! {! X
    if (f(i) == (fi*j))( \- R2 I2 ~5 [/ }$ s5 x+ D% e
        HD(j)=Pyy(i);     %% find all harmonic distortion components( t; J& w& ?- L+ V
        j=j+1;
6 N, {1 R2 Y2 p1 I    end
2 N8 j' b9 g7 }+ L( n; Jend- i) l; U+ O3 s: m) z- w2 R
P_hd=sum(HD(2:9));0 p2 D9 B& N; T8 B
THD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal, p" q2 P  h+ X6 y+ o. c
fprintf('THD = %g dB\n',THD);
6 b. w  [8 q( U6 `- I; ?6 ]# f& i) m6 E+ K* z1 ?& Z) H+ W5 ^( f& g
% ---------- Calculate SNR ----------------------------
# _5 }2 T7 s- o! W5 H, c1 Jfundamen_dB=max(10*log10(Pyy(1:fft_no/2)));
+ \0 M# ?* t9 o2 b2 C& Ufundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);
% b+ A5 s$ P% r! @+ `span=max(round(fft_no/200),5);( _# ]7 i/ _2 T, z9 S3 }( N
P_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));( D2 F2 e: o3 ?; r
/ Q; J# }# z5 u' K) @! X$ a
P_noise1=sum(Pyy(1:fft_no/2))-P_sig-P_hd;
$ A; c+ O9 I4 {9 i% X2 r5 K$ uSNR1=10*log10(P_sig/P_noise1);" G$ t0 [& a. f2 b
fprintf('SNR = %g dB\n',SNR1);
2#
發表於 2007-10-15 22:31:57 | 顯示全部樓層
在回答你的問題前我先稍微解說一下我的MATLAB程式5 {! f" c) L6 a8 R
要作FFT必需是sine waveform或者近似sine waveform,所以,我在作DAC的SNR及THD時,必需是輸出信號為sine waveform的記錄數值. N: I( a0 n& D  g! k) Y& S5 g
故而,我利用SPICE中.measure的指令來記錄DAC的輸出信號數值,然後將這些記錄的值存成一個TXT的文字檔,然後再用MATLAB將這個文字檔讀出,再作FFT運算
; Q' _% J6 ], w( m3 n7 K
/ i8 |' q- o8 ~+ v! Q, d3 ]6 v在MATLAB程式中要作FFT運算時,需注意它必須是2的倍數,同時,我在作FFT運算時,先行利用minimum 4-term Blackman-harris Windows的filter來使DAC的輸出信號平順些,當然,你也可以不加,不過,畫出的waveform會有點怪怪的,再者,因為我們記錄的數值是每隔一段時間所記錄的數值,所以畫成連續的圖形時,會很不連貫,所以,一般都會作windows的filter,而我也問過一些比較資深的analog designer此種作法是否恰當,還沒有人對於這種作法感到奇怪,也許大家都是這個樣子作的吧
- e- n/ O! w0 J. y; X4 f0 Y3 C7 f' p/ d+ p  ^1 T- m9 K& J4 [
我看不到你的附件檔,故而實在無法作出評論( h' \# Z  C! p9 H, z& Q" f4 [
而看了一下你所秀出的錯誤訊息,想問一下,MATLAB程式中有AD10這個函式嗎??又或者有沒有AD10這個array??! |  ^, E+ X0 O
從錯誤訊息來看,似乎是找不到AD10這個函式或者array,所以才有錯誤
3#
發表於 2007-10-16 23:08:40 | 顯示全部樓層
在Hspice執行.measure指令時,它是依據你的.lib的數目來產生相對應的*.mt*檔
+ T5 @% b) G3 I4 b. D' k+ n# R' |( V故而,如果你的檔案有多出*.mt0的檔案,那表示這是你的.lib的第一個依據.measure所計算出來的資料
: K( B, h( _  k7 l所以,請再檢查一下你的HSPICE檔案吧
3 p! L% s# k# j0 s$ t) p: B% ~* i6 q; R" L  a: s- I" `2 [
再來,你的.measure指令用法沒有問題  L; w! i5 j* w$ w* r
但,你的取樣點及時間似乎不對% u% I6 {& T: `+ G
你的暫態分析(TRAN)掃瞄區間:0~3.2msec,你所用的指令為:
1 R6 X6 s% D0 m+ t8 ^3 Q.MEAS TRAN DIGOUT" Z  A9 B' W3 ^' D! [
+TRIG  V (Dout)  VAL=0        RISE=2
. A: I+ \$ {6 |  W+TARG V (Dout)  VAL=3.2m      RISE=2
  F) h8 w7 o4 U1 `寫法沒錯,但,如果是ADC,那其輸出信號為digital,故而,輸出信號的振幅不是0就是vdd,如果要記綠輸出信號的digital code的話& Y  l/ Z+ a8 E9 m  S3 z
那,計算輸出信號的digital code應該依照clock來作取樣時間,而不是0~3.2ms,也就是.measure的VAL要是clock' J) E8 G" [* N
另外,若依照你的指令來用,應該會計算不到輸出信號,除非你的模擬時間超過6.4ms,因為你是用RISE=2# h" h' n, o  k2 L/ e9 [2 W
再者,如果是用.measure來計算digital code,那如果以rise edge作基準則應該用RISE=1,而不是RISE=2,這是很嚴重的錯誤,除非你的clock及取樣有delay 1個clock的作用在,如果是以fall edge則是FALL=1,若是以你RISE=2,那你取樣出來的digital code應該都是錯誤的
4#
發表於 2007-10-19 01:58:58 | 顯示全部樓層
先回答第一個問題
7 D# o7 h$ k2 u; c: X你的MATLAB程式我大概看了一下,發覺到AD10應該是一個由別人自行撰寫的運算函式,而因為你在MATLAB程式中並沒有這個函式,同時也沒有呼去這個函式,故而,你在執行MATLAB程式時,當然會出現錯誤訊息# T9 `* H# C0 X0 q; j$ p) j
所以,如果這不是你自己寫的MATLAB程式,那我只能說你的MATLAB程式並不完整,也許,這是別人故意留一手的吧
$ V& W; e( }3 K( Q, T# v: U0 E! x; r& w0 z
再來,在ADC中的Sample and hold電路若是用SC電路,是會用non-overlap clock,故而會有兩個clock; }$ n3 p: @# ]/ l
但,源頭的clock只有一個,而這個clock會透過non-overlap circuit去產生兩個時間差的clock$ ]$ W$ Y7 x7 u- m% L6 w  K+ ?% u
一般而言,ADC的數位電路所需的clock通常都是由源頭的clock作為基準,然後將數位信號輸出,故而,在使用.measure時,所參考的時間及頻率也該是以這個源頭的clock為主,而不是由non-overlap circuit所產生出來的兩個時間差clock,除非,你的ADC電路並沒有包Sample and hold circuit(我不清楚你的電路架構為何,但,ADC一般而言一定要有Sample and hold circuit)+ K* q9 V/ m4 f* h: R
再來,我看了一下你的取樣頻率為5.12Mhz,這是很低的clock頻率,所以,照理來說這麼低的頻率,你的架構應該是採用SAR架構的ADC吧,那你的輸入信號頻率為何呢??另外,你的.tran的時間多久呢???還有,你是幾個bit的ADC呢???& m. U; Z* e+ B/ F
舉個例來說,假如你是4-bit ADC,輸出分別為D3,D2,D1,D0,且clock為1MHz,所以使用.measure應該為
* u7 x4 y* o) F- c. `.MEASURE TRAN DIGOUT_D3_t1 find V(D3) AT=5.2us
9 B/ `5 B' l3 t9 q% K' B- D; `.MEASURE TRAN DIGOUT_D2_t1 find V(D2) AT=5.2us
% O' v& t4 {$ p% H: D.MEASURE TRAN DIGOUT_D1_t1 find V(D1) AT=5.2us. j. l$ F) |9 F
.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=5.2us* v3 G' n  H$ f0 ]# D
3 E  ^/ w! S2 m( P/ k
.MEASURE TRAN DIGOUT_D3_t2 find V(D3) AT=6.2us6 c; [2 X9 o1 g9 U" f3 C0 D
.MEASURE TRAN DIGOUT_D2_t2 find V(D2) AT=6.2us
& u& ?$ E% J* j% S.MEASURE TRAN DIGOUT_D1_t2 find V(D1) AT=6.2us
, e& i3 I$ g3 e; _: `.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=6.2us3 b! G4 z6 c% ^* f

8 O/ U: o1 H8 b( u7 X6 B3 J我只計算clock的週期,然後再初估ADC中的delay時間為0.2us,所以,我第一個數位取出的時間為第5個clock週期來取出4個bit的digital code,然後在第6個clock週期時又取出第2筆digital code
# [  p$ `% ~! |" @+ i* S  m我用的方式較為簡化些,因為ADC要取出的是在每個clock週期中的digital code,所以,只要精算出每個clock時間,即可簡化.measure的指令,而不用用到TRIG....TARG.....,當然,這是我的作法,你也可以依照我前面寫的改成你用的TRIG...TARG的用法& B; _% R: T$ p( B5 z+ }# B
4 a5 }( W7 \% r% q& ?
最後,像我剛才寫的.MEASURE TRAN DIGOUT_D3 find V(D3) AT=5.2us5 C/ A+ G8 C- O0 m9 E- S, S4 C
可以用MATLAB程式寫成一個自我產生的.measure,我以前是用MATLAB來自己產生的,不然,光是計算1024點就要寫4096行.MEASURE指令,那是一件很浪費時間和生命的事,用MATLAB的迴圈即可一下子產生出所有.MEASURE指令,小小作法,提供給你參考
5#
發表於 2007-11-12 02:06:38 | 顯示全部樓層
看了一下你的說明,覺得有些奇怪的地方
+ z2 P1 \* Z; M: `5 ~* i首先,我沒作過switched current ADC,不過,依照取樣原理理論來說,取樣頻率需大於輸入信號的兩倍才能夠將原始信號還原回來
4 h7 l: n7 P) h. A0 U而你的取樣頻率和輸入信號頻率卻非常地接近,似乎有違取樣原理的理論基礎,不知道這個樣子真的能夠取出真實的信號?" \2 Q2 p2 u8 v- U, D
9 }5 D: S+ _/ X2 p: [
再者,FFT運算基本上也是依照取樣原理理論發展出來的,因為FFT的取樣點數是輸入信號的2^N倍,N的最小值為1,也就是FFT的最小取樣頻率是輸入信號的2倍,亦即輸入信號在一個週期內會被取樣2點,而我們所撰寫的FFT來計算SNR,SFDR,THD...也是依此理論陸續往下寫的,所以,看了你的規格,實在覺得有些奇怪2 r0 _+ B- U3 c! ]  j, s
7 M& p1 @% A; A
FFT的取樣點數如我剛才所言是取樣點數是輸入信號的2^N倍,所以,取樣點數為2,4,8,16,32,64,128,256,512,1024,2048,4096...,一般取到1024點或者2048點就已經非常足夠了,因為超過2048點之後所計算出來的SNR,SFDR,THD....其實變化的只有小數點後面幾位的不同而以,取樣到32768點,其實真的不需要
- S* a+ r9 G! @! Y8 }2 K- l5 |# w8 H9 g" p+ T, i4 t# y
clear all
. V2 ~* v& K- @7 S( |fid=fopen('dual_measure_rms.txt','w')
" m: _; e* k2 V" Jfor M=1:1:1024
' q1 m+ r; T) K: J6 V       T=M-1;
6 g& F/ p3 n$ |% i- D0 ^/ f% |       from=(50*T)+45; %DUAL DAC measure time& g) \: \2 O/ a" j; f
       to=50+(50*T);
0 X: F8 J6 S% C1 K7 o. D# I       fprintf(fid,'.MEASURE TRAN A%g RMS v(daci_outp) from=%gn to=%gn\n',M,from,to);
0 f* @8 a/ h( |' O+ Q# Kend
9 W( A! q) e' i  XMATLAB程式會產生一個dual_measure_rms.txt檔,你將這個檔裡面的.MEASURE複製到HSPICE中即可,不過,如我前面所言,取樣頻率是輸入信號的2^N倍,然後再算出我的取樣點的時間點為何,如果不知道這些關係式,那這個MATLAB程式將無法使用: u1 ~! }5 ?' y' H
這個程式很簡單,只是一個迴圈再加上幾行計算時間的式子
6#
發表於 2007-11-14 06:03:39 | 顯示全部樓層
不好意思,昨天一時眼花沒看清楚單位,把Fin的KHz看成MHz,sorry....
0 m5 c+ q" L4 A% u7 q5 l所以才會說你的取樣頻率和輸入信號頻率非常地接近,這是我這方面的缺失" c' c- K  v# c) B

7 x) q- n& |4 M) o; ], h至於FFT取樣點的問題,我之前是作88MHz,10-bit dual channel DAC,我之前有比較過FFT取樣2048點和4096點,甚至是8192點的差別,結果誠如我前面所言,MATLAB跑出來的結果只有小數點後面3位-5位之後才有差異,前面的數值都是一樣的,所以我才會說一般取到1024點或者2048點就已經非常足夠了& o: f9 \7 W& z
而且,用SPICE跑模擬從2048點到4096點的時間非常地久,所增加的時間可能不只一倍,而是數倍,可是從MATLAB所計算出來的卻是差異不大,故而,如果paper提供到這麼大的取樣點,那就跑吧,只不過,時間會非常地久,印象中,我之前跑2048點的SPICE模擬DAC大概需要5-7天,而取樣到4096點大概就增加到接近三週的時間,這,純是個人以前的小小經驗,如果是ADC的話,那會更久
4 Y/ V& a5 I( e) Y# d* E! t8 x) M7 ~
至於另外個問題,我的回答是,對的
+ l" e2 e* O+ Z% H但,要先把一些參數改成你們自己的規格才行

評分

參與人數 1 +5 收起 理由
緣緣 + 5 謝謝finster每次不厭其煩的指導

查看全部評分

7#
發表於 2007-11-30 00:54:55 | 顯示全部樓層
我看了一下你的MATLAB程式,發覺到有一個地方有問題
7 J6 t# J* y4 J1 ], m% M那就是你設ptst和ptfi是同一個值是不對的
/ u/ q( z' N: ?+ h. E* J$ T! Kptst是計算fft開始的值6 _/ T- Y5 c4 V" |
而ptfi則是計算fft的range,如8~519,total則為512點
0 l+ W3 {: _- H故而你在執行MATLAB程式時就會出現錯誤0 R; ?9 U7 N  e& C0 ^/ P

% h# J8 Q: g) e+ Y9 @3 L3 F5 `我看了一下你的MATLAB程式,基本上沒有多大問題1 S  n* D- \, M9 ^2 ^
不過,要小心計算THD的值和範圍& S. u" }8 g) G- M& W
因為有不少人問過我為什麼在這個地方會出現錯誤,而當我看到他們的錯誤訊息時,便會發覺到他們的取様範圍太少,以致會計算不到第9個harmonic distortion components而出現錯誤
1 f; z5 o2 n  ^4 {% J& t; N6 W# ~: q1 C) B% S
最後,計算noise有好幾種定義方式
' G, ?: l+ J9 \( }原本我所寫的程式有兩種計算SNR,SFDR的計算式,後來,經過我們內部討論的結果只用我給你的那一種計算方式,因為那個方式比較合理
9 o, G/ k2 G9 t7 N' ~我個人覺得計算noise的方式,只要能夠說服的了別人,同時也能夠提出合理的解釋即可
5 Z+ i, I8 \% K# ]! M因為目前在計算noise上並沒有很統一的說詞,故而,只要解釋的合理即可

評分

參與人數 1 +5 收起 理由
緣緣 + 5 謝謝詳細解說

查看全部評分

8#
發表於 2007-12-2 21:33:33 | 顯示全部樓層
我想,你可能有點誤解了我的意思了
' C9 @0 P) N+ h# J# |( C我列出我當初寫ptst和ptfi的式子關係式0 i# M7 l1 x; d" y1 H9 A2 _
ptst=2^3;          % calculated fft of start point% N0 F9 X) h. r! @) k$ K. S
pts=2^9;           % calculated fft of end point( T! ~; Q* a0 H" H) F% f8 W
ptfi=ptst+pts-1;   % calculated fft range: 8 ~ 519, total: 512 point! b2 e$ E6 T# w8 z
因為我們不是從第一點就取來作fft運算,故而在設ptfi時,它的值是取(2^N)再加上從第幾個cysle值所取的值; m3 Y7 d3 g+ z0 E0 ?
如此一來才能夠取到足夠運算fft的值: O2 D/ Y. j1 C4 s
- U, x* P& c, X8 W! f6 n7 M
另外,還有一點,x陣列的值要比ptfi的值大,或者等同於此值/ V. A! S% \% h+ W1 l
如果你的x陣列內的值沒有到達ptfi,那MATLAB就會判斷出錯誤0 P9 _" f1 R  f1 h+ z. n5 b
8 }# J6 r. b9 \* a0 N
如果對於要設的參數仍有問題( G1 q1 K3 a0 ?0 L9 e+ ~" {, \
我可以把我最原始的程式寄給你參考7 v/ o" B. w# T. d$ E
0 ^4 W5 Q; J5 p- x
[ 本帖最後由 finster 於 2007-12-2 09:43 PM 編輯 ]

評分

參與人數 1 +5 收起 理由
緣緣 + 5 謝謝指導

查看全部評分

9#
發表於 2008-3-24 13:21:54 | 顯示全部樓層
基本上作ADC,DAC的模擬,還是以HSPICE為首選建議的模擬軟體
. K( m2 ?0 Q7 R, o; k至於用spectre,h-sim,matlab....等,均可對ADC,DAC作模擬+ |% D3 q* n$ P7 C" o" f1 {
但,在業界,個人的建議是,還是要跑HSPICE會比較保險" f% C3 S( D3 H+ _- ]
至於INL,DNL,SFDR,SNR....等,基本上很難直接用HSPICE跑出來,因為有些計算式子在HSPICE中要撰寫出來很麻煩(用.measure指令來作計算),我曾經嘗試過,但最後不得不放棄,因為有些計算真的很麻煩,而且用MATLAB很快便可達到計算
. v$ g# |  r0 e& G一般都是把HSPICE模擬出來的數值帶到MATLAB中去作計算會比較簡易2 U  q6 T2 y9 L. i% L
而如果沒有MATLAB,也可以用C來作數學運算,不過,印象中C沒有FFT的計算函式,所以,可能會需要一些額外的撰寫FFT運算程式才行
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-5-6 06:41 AM , Processed in 0.129008 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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