Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

  [複製鏈接]
1#
發表於 2007-10-13 08:20:07 | 顯示全部樓層
我以前作DAC的MATLAB部份程式: X8 q$ h0 R/ j" s
我想,應該可以給你一些參考吧# m+ t6 }: Z) F8 e- ]9 b

9 U( }7 |; D1 S' G- B  v8 C% --------------Using minimum 4-term Blackman-harris Windows -------------
& _% E" [) u# s2 Znb=1:1ts;$ m! M# R) k) r1 V2 O5 Y1 s2 u8 Z
kb=0.355768-0.487396*cos(2*pi*nb/(pts))+0.144232*cos(4*pi*nb/(pts))-0.012604*cos(6*pi*nb/(pts));" X* S. j4 r; j$ ]9 g0 S0 W# C
win_gain=sum(kb)/pts;$ O+ N* }+ r* z0 {
kb=kb/win_gain;* q/ J: e0 Y  X: l

8 }9 _7 k6 [9 k& W" G+ w6 R, U% --------------- Calculated fft --------------------------
3 \4 y& x' {; {- P/ X  C* Gyb=kb.*x(ptsttfi);
: m; E2 D( }& {5 m: u4 Eyk=fft(yb);
1 ?' f3 F! _6 z9 Y+ l% _# nfft_no=length(yk);6 i5 D8 r. f" Y/ M- V: ?. D
f=fs*(0:fft_no-1)/fft_no;* l5 Z" G( Q" x! f& g" j
Pyy=yk.*conj(yk)/((fft_no/2)^2);0 r6 v' C) x# K# `
* ~/ D8 g: G, ~0 w" e
% ---------- Calculate THD ----------------------------
0 u4 l4 k" C- k7 _# X1 mj=1;
" {6 B8 m1 t  _8 T7 `for i=1:1fft_no/2)2 n1 |% X: {3 }! k, w& [7 l) V: X
    if (f(i) == (fi*j))' c. ]% _. U( ?* \
        HD(j)=Pyy(i);     %% find all harmonic distortion components
2 f$ B, q9 j" k( v; P& w9 x$ P        j=j+1;
% }7 R3 [% X5 M1 F* X    end
4 x9 ?  L2 \+ \; \. J  {! vend
# `, Z7 l, ~' j6 {/ {# U, q; gP_hd=sum(HD(2:9));+ H/ C" `: O# `, R/ N& P( P, j
THD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal+ g+ t. {/ Z* |2 G0 n
fprintf('THD = %g dB\n',THD);1 T. b6 X7 J- s5 k

) C7 Q5 o6 l. f, N. R3 ?% ---------- Calculate SNR ----------------------------
5 h" D2 G0 a/ G" F% qfundamen_dB=max(10*log10(Pyy(1:fft_no/2)));. H2 }" G8 x. N. q6 D0 i
fundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);
$ v9 @$ G5 U% G* Tspan=max(round(fft_no/200),5);+ i8 q+ {5 Y# H# s. F
P_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));5 [8 I& n* d2 W8 j  D

! m" {( N6 `4 E# y. B/ aP_noise1=sum(Pyy(1:fft_no/2))-P_sig-P_hd;: P: C2 E9 o' [* d
SNR1=10*log10(P_sig/P_noise1);
' _" `4 z4 Y9 h* h0 ^) |5 zfprintf('SNR = %g dB\n',SNR1);
2#
發表於 2007-10-15 22:31:57 | 顯示全部樓層
在回答你的問題前我先稍微解說一下我的MATLAB程式
  Q/ ^' \( G6 q0 g1 Y7 \* c, v3 I7 x要作FFT必需是sine waveform或者近似sine waveform,所以,我在作DAC的SNR及THD時,必需是輸出信號為sine waveform的記錄數值5 z) \$ C5 v% `! ]8 i4 x. d
故而,我利用SPICE中.measure的指令來記錄DAC的輸出信號數值,然後將這些記錄的值存成一個TXT的文字檔,然後再用MATLAB將這個文字檔讀出,再作FFT運算
6 s' {& m  b! F2 b6 e7 |! G9 I
1 s9 K# C  X1 K3 f在MATLAB程式中要作FFT運算時,需注意它必須是2的倍數,同時,我在作FFT運算時,先行利用minimum 4-term Blackman-harris Windows的filter來使DAC的輸出信號平順些,當然,你也可以不加,不過,畫出的waveform會有點怪怪的,再者,因為我們記錄的數值是每隔一段時間所記錄的數值,所以畫成連續的圖形時,會很不連貫,所以,一般都會作windows的filter,而我也問過一些比較資深的analog designer此種作法是否恰當,還沒有人對於這種作法感到奇怪,也許大家都是這個樣子作的吧9 g% \9 x- Z# ^3 n- S: U
+ d9 ~4 z$ |- H. e$ b4 V
我看不到你的附件檔,故而實在無法作出評論* w; A2 H: i' p) `- ^
而看了一下你所秀出的錯誤訊息,想問一下,MATLAB程式中有AD10這個函式嗎??又或者有沒有AD10這個array??
, V% Y+ ?0 g$ Y# [從錯誤訊息來看,似乎是找不到AD10這個函式或者array,所以才有錯誤
3#
發表於 2007-10-16 23:08:40 | 顯示全部樓層
在Hspice執行.measure指令時,它是依據你的.lib的數目來產生相對應的*.mt*檔6 D4 {9 e) S2 P" _6 F8 l* c
故而,如果你的檔案有多出*.mt0的檔案,那表示這是你的.lib的第一個依據.measure所計算出來的資料+ k/ D& J+ D; F+ f
所以,請再檢查一下你的HSPICE檔案吧
2 y) J, E2 Y- Q/ g! c
1 ~& h: ~# i3 X再來,你的.measure指令用法沒有問題
9 {- O! _% n1 p  q9 l0 }) z但,你的取樣點及時間似乎不對
" y+ Z! P9 J( }) i你的暫態分析(TRAN)掃瞄區間:0~3.2msec,你所用的指令為:
( \& a0 q7 s$ i( q& g! |.MEAS TRAN DIGOUT
! q# ?, }# m% i0 C( c2 D, B, C+TRIG  V (Dout)  VAL=0        RISE=2" {& ~/ ?5 U: A
+TARG V (Dout)  VAL=3.2m      RISE=2
% j0 P, n6 f' o- y寫法沒錯,但,如果是ADC,那其輸出信號為digital,故而,輸出信號的振幅不是0就是vdd,如果要記綠輸出信號的digital code的話
% m% _% }( F$ Z  d) Y' u, ^那,計算輸出信號的digital code應該依照clock來作取樣時間,而不是0~3.2ms,也就是.measure的VAL要是clock+ @2 V( ~7 t" \5 s; u. {: F
另外,若依照你的指令來用,應該會計算不到輸出信號,除非你的模擬時間超過6.4ms,因為你是用RISE=2
4 ]1 ]2 o! Q: j6 I* K/ K. f/ b% q再者,如果是用.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 | 顯示全部樓層
先回答第一個問題$ K$ t7 L2 k/ G9 n8 }
你的MATLAB程式我大概看了一下,發覺到AD10應該是一個由別人自行撰寫的運算函式,而因為你在MATLAB程式中並沒有這個函式,同時也沒有呼去這個函式,故而,你在執行MATLAB程式時,當然會出現錯誤訊息3 R# S$ q: F8 v4 ]2 f
所以,如果這不是你自己寫的MATLAB程式,那我只能說你的MATLAB程式並不完整,也許,這是別人故意留一手的吧- \4 R! `5 N. ?4 e4 a" n
4 ~- P, s/ A1 z9 g
再來,在ADC中的Sample and hold電路若是用SC電路,是會用non-overlap clock,故而會有兩個clock
) @  G' J' F9 \' h# M8 X但,源頭的clock只有一個,而這個clock會透過non-overlap circuit去產生兩個時間差的clock
4 O1 S* z4 a5 V* w- @6 h" _3 n一般而言,ADC的數位電路所需的clock通常都是由源頭的clock作為基準,然後將數位信號輸出,故而,在使用.measure時,所參考的時間及頻率也該是以這個源頭的clock為主,而不是由non-overlap circuit所產生出來的兩個時間差clock,除非,你的ADC電路並沒有包Sample and hold circuit(我不清楚你的電路架構為何,但,ADC一般而言一定要有Sample and hold circuit)1 \+ X, q/ z% r0 h$ `
再來,我看了一下你的取樣頻率為5.12Mhz,這是很低的clock頻率,所以,照理來說這麼低的頻率,你的架構應該是採用SAR架構的ADC吧,那你的輸入信號頻率為何呢??另外,你的.tran的時間多久呢???還有,你是幾個bit的ADC呢???
" p, n% q& v7 e* u0 H$ H2 N舉個例來說,假如你是4-bit ADC,輸出分別為D3,D2,D1,D0,且clock為1MHz,所以使用.measure應該為
& J2 \6 ~. W. ~  |# d0 p4 A.MEASURE TRAN DIGOUT_D3_t1 find V(D3) AT=5.2us* L" J9 o, k7 @; ~% O5 U8 L
.MEASURE TRAN DIGOUT_D2_t1 find V(D2) AT=5.2us
5 P6 Z1 R8 D9 `3 Q.MEASURE TRAN DIGOUT_D1_t1 find V(D1) AT=5.2us/ e% {7 H2 I4 R% Y
.MEASURE TRAN DIGOUT_D0_t1 find V(D0) AT=5.2us
: ~& t$ I/ m% T2 f! }  @" X# n+ c: ?9 A, t, m! L( g% W% T7 B
.MEASURE TRAN DIGOUT_D3_t2 find V(D3) AT=6.2us
; j2 ^+ g3 H1 p# s; w2 W. N.MEASURE TRAN DIGOUT_D2_t2 find V(D2) AT=6.2us
: N6 N# T9 ~' Y8 x4 H+ l. {3 M/ H.MEASURE TRAN DIGOUT_D1_t2 find V(D1) AT=6.2us
* E/ ]$ d$ {8 w2 k5 j! B( Z7 Y4 P.MEASURE TRAN DIGOUT_D0_t2 find V(D0) AT=6.2us/ _; S' ?( m4 }' @6 O3 t7 j, E
  h3 y- y" N/ O" p1 `
我只計算clock的週期,然後再初估ADC中的delay時間為0.2us,所以,我第一個數位取出的時間為第5個clock週期來取出4個bit的digital code,然後在第6個clock週期時又取出第2筆digital code
) b2 D. e. ]2 @8 ^* d我用的方式較為簡化些,因為ADC要取出的是在每個clock週期中的digital code,所以,只要精算出每個clock時間,即可簡化.measure的指令,而不用用到TRIG....TARG.....,當然,這是我的作法,你也可以依照我前面寫的改成你用的TRIG...TARG的用法- |% U7 [4 [/ U- v5 l

" H7 y8 e- R' K最後,像我剛才寫的.MEASURE TRAN DIGOUT_D3 find V(D3) AT=5.2us0 }" x0 ~; V6 g9 b5 T+ ?
可以用MATLAB程式寫成一個自我產生的.measure,我以前是用MATLAB來自己產生的,不然,光是計算1024點就要寫4096行.MEASURE指令,那是一件很浪費時間和生命的事,用MATLAB的迴圈即可一下子產生出所有.MEASURE指令,小小作法,提供給你參考
5#
發表於 2007-11-12 02:06:38 | 顯示全部樓層
看了一下你的說明,覺得有些奇怪的地方$ r4 i0 `1 @* @; e7 y6 c& c
首先,我沒作過switched current ADC,不過,依照取樣原理理論來說,取樣頻率需大於輸入信號的兩倍才能夠將原始信號還原回來
" f# X( x8 E$ q而你的取樣頻率和輸入信號頻率卻非常地接近,似乎有違取樣原理的理論基礎,不知道這個樣子真的能夠取出真實的信號?
3 @2 U! T, H, S9 C4 p
$ @* z% F( C2 f/ \2 C再者,FFT運算基本上也是依照取樣原理理論發展出來的,因為FFT的取樣點數是輸入信號的2^N倍,N的最小值為1,也就是FFT的最小取樣頻率是輸入信號的2倍,亦即輸入信號在一個週期內會被取樣2點,而我們所撰寫的FFT來計算SNR,SFDR,THD...也是依此理論陸續往下寫的,所以,看了你的規格,實在覺得有些奇怪
% e" h8 k7 H; U5 X" n' e( Q, G6 K/ s/ z8 G. G6 ~! E: `" g& L
FFT的取樣點數如我剛才所言是取樣點數是輸入信號的2^N倍,所以,取樣點數為2,4,8,16,32,64,128,256,512,1024,2048,4096...,一般取到1024點或者2048點就已經非常足夠了,因為超過2048點之後所計算出來的SNR,SFDR,THD....其實變化的只有小數點後面幾位的不同而以,取樣到32768點,其實真的不需要  u/ v) X% Q' g6 J8 r" W
- N2 v1 Q, g# h2 M
clear all
% g* g" u/ \3 S1 Ifid=fopen('dual_measure_rms.txt','w')" ?0 _! l, O1 t: l; A
for M=1:1:1024& k% M* z# U1 H2 ^
       T=M-1;' N4 R6 T- Q. O7 `7 v
       from=(50*T)+45; %DUAL DAC measure time' W1 f0 _+ q! M' E" \6 V! ~
       to=50+(50*T);
; J9 ?9 Y( F% O5 Q2 l       fprintf(fid,'.MEASURE TRAN A%g RMS v(daci_outp) from=%gn to=%gn\n',M,from,to);
* P  M! e  ^' O& a2 Aend/ ~& V- n- u2 Y2 q6 C! s* |* X
MATLAB程式會產生一個dual_measure_rms.txt檔,你將這個檔裡面的.MEASURE複製到HSPICE中即可,不過,如我前面所言,取樣頻率是輸入信號的2^N倍,然後再算出我的取樣點的時間點為何,如果不知道這些關係式,那這個MATLAB程式將無法使用
+ H8 n/ K; E7 }9 O1 M1 @這個程式很簡單,只是一個迴圈再加上幾行計算時間的式子
6#
發表於 2007-11-14 06:03:39 | 顯示全部樓層
不好意思,昨天一時眼花沒看清楚單位,把Fin的KHz看成MHz,sorry....
9 i2 K  z. `: `$ e5 s所以才會說你的取樣頻率和輸入信號頻率非常地接近,這是我這方面的缺失
, `  S6 k9 m: I, I/ c% l/ Q2 ?% d3 J' `
至於FFT取樣點的問題,我之前是作88MHz,10-bit dual channel DAC,我之前有比較過FFT取樣2048點和4096點,甚至是8192點的差別,結果誠如我前面所言,MATLAB跑出來的結果只有小數點後面3位-5位之後才有差異,前面的數值都是一樣的,所以我才會說一般取到1024點或者2048點就已經非常足夠了
8 U- N6 [. o& n: A1 k/ D2 i& y而且,用SPICE跑模擬從2048點到4096點的時間非常地久,所增加的時間可能不只一倍,而是數倍,可是從MATLAB所計算出來的卻是差異不大,故而,如果paper提供到這麼大的取樣點,那就跑吧,只不過,時間會非常地久,印象中,我之前跑2048點的SPICE模擬DAC大概需要5-7天,而取樣到4096點大概就增加到接近三週的時間,這,純是個人以前的小小經驗,如果是ADC的話,那會更久
( L- O  E$ }/ V, o+ P9 g% S1 `( C, [& b6 y
至於另外個問題,我的回答是,對的4 e4 x& {+ s: d- ?5 g, n) H2 V  s0 u
但,要先把一些參數改成你們自己的規格才行

評分

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

查看全部評分

7#
發表於 2007-11-30 00:54:55 | 顯示全部樓層
我看了一下你的MATLAB程式,發覺到有一個地方有問題
( \# T5 |/ Z& Y, r那就是你設ptst和ptfi是同一個值是不對的- H" L) k# e- ?1 k
ptst是計算fft開始的值3 Z; H$ n8 b1 W
而ptfi則是計算fft的range,如8~519,total則為512點
7 `0 N1 ]1 y8 s& W- l/ u7 \故而你在執行MATLAB程式時就會出現錯誤3 ]& b* G6 v+ a3 V
4 a. u$ w7 Z+ i, @# j1 w
我看了一下你的MATLAB程式,基本上沒有多大問題
$ l6 a) {2 |0 g不過,要小心計算THD的值和範圍
; O! ^& F6 T' S' g因為有不少人問過我為什麼在這個地方會出現錯誤,而當我看到他們的錯誤訊息時,便會發覺到他們的取様範圍太少,以致會計算不到第9個harmonic distortion components而出現錯誤
- J! }6 o$ W0 Z+ D0 T1 m- ^  m& b  c
最後,計算noise有好幾種定義方式& D, B" @5 G9 o! i0 f0 P
原本我所寫的程式有兩種計算SNR,SFDR的計算式,後來,經過我們內部討論的結果只用我給你的那一種計算方式,因為那個方式比較合理! I* d* d! K* m' I# p" @
我個人覺得計算noise的方式,只要能夠說服的了別人,同時也能夠提出合理的解釋即可, M' s! I, ^5 k' ]
因為目前在計算noise上並沒有很統一的說詞,故而,只要解釋的合理即可

評分

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

查看全部評分

8#
發表於 2007-12-2 21:33:33 | 顯示全部樓層
我想,你可能有點誤解了我的意思了; a3 P1 I% Z* L, b0 I. G0 e
我列出我當初寫ptst和ptfi的式子關係式
" \8 `; l( o. Dptst=2^3;          % calculated fft of start point
7 R/ D8 e. U3 Spts=2^9;           % calculated fft of end point5 c/ p1 t" P/ ^$ N9 D' x% P
ptfi=ptst+pts-1;   % calculated fft range: 8 ~ 519, total: 512 point. [5 u& V/ A: |1 q1 X* Z. n
因為我們不是從第一點就取來作fft運算,故而在設ptfi時,它的值是取(2^N)再加上從第幾個cysle值所取的值
' N, f# Y4 Y. |. o如此一來才能夠取到足夠運算fft的值
. T% \7 S, D% }$ Z! }2 P
% b2 z% X; L3 Q4 V' o9 |; y& g另外,還有一點,x陣列的值要比ptfi的值大,或者等同於此值
7 o! L, h6 Y( E% E+ D9 H如果你的x陣列內的值沒有到達ptfi,那MATLAB就會判斷出錯誤
# ~# A$ }3 t" S, I6 o# R9 R5 W/ D( {, [; ~! x
如果對於要設的參數仍有問題3 \% g1 ?  A1 c3 h8 k
我可以把我最原始的程式寄給你參考6 q& H8 H8 ^3 P

  k3 S" q5 r4 q2 k; P; g2 C[ 本帖最後由 finster 於 2007-12-2 09:43 PM 編輯 ]

評分

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

查看全部評分

9#
發表於 2008-3-24 13:21:54 | 顯示全部樓層
基本上作ADC,DAC的模擬,還是以HSPICE為首選建議的模擬軟體
. c* w  G" `$ v. e& D1 S至於用spectre,h-sim,matlab....等,均可對ADC,DAC作模擬
9 y! m' o6 F  h* s& d9 `但,在業界,個人的建議是,還是要跑HSPICE會比較保險- O! G, z/ U9 i" E- m
至於INL,DNL,SFDR,SNR....等,基本上很難直接用HSPICE跑出來,因為有些計算式子在HSPICE中要撰寫出來很麻煩(用.measure指令來作計算),我曾經嘗試過,但最後不得不放棄,因為有些計算真的很麻煩,而且用MATLAB很快便可達到計算
6 J- k8 ]: N7 {) t一般都是把HSPICE模擬出來的數值帶到MATLAB中去作計算會比較簡易
$ j: \' t7 o: G' S) t# b而如果沒有MATLAB,也可以用C來作數學運算,不過,印象中C沒有FFT的計算函式,所以,可能會需要一些額外的撰寫FFT運算程式才行
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-6-17 04:14 AM , Processed in 0.135517 second(s), 18 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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