Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

  [複製鏈接]
21#
發表於 2007-11-14 06:03:39 | 只看該作者
不好意思,昨天一時眼花沒看清楚單位,把Fin的KHz看成MHz,sorry....3 x- }. ]' e+ g6 u6 x
所以才會說你的取樣頻率和輸入信號頻率非常地接近,這是我這方面的缺失  j8 s8 B6 }( j! a! V4 W
, {0 V/ G4 A, j1 {
至於FFT取樣點的問題,我之前是作88MHz,10-bit dual channel DAC,我之前有比較過FFT取樣2048點和4096點,甚至是8192點的差別,結果誠如我前面所言,MATLAB跑出來的結果只有小數點後面3位-5位之後才有差異,前面的數值都是一樣的,所以我才會說一般取到1024點或者2048點就已經非常足夠了3 g9 y" c4 O* D, D7 g- m7 ^
而且,用SPICE跑模擬從2048點到4096點的時間非常地久,所增加的時間可能不只一倍,而是數倍,可是從MATLAB所計算出來的卻是差異不大,故而,如果paper提供到這麼大的取樣點,那就跑吧,只不過,時間會非常地久,印象中,我之前跑2048點的SPICE模擬DAC大概需要5-7天,而取樣到4096點大概就增加到接近三週的時間,這,純是個人以前的小小經驗,如果是ADC的話,那會更久
0 y9 w, S3 ~. `: ]
4 W; h# d; ?% C5 w至於另外個問題,我的回答是,對的
$ o' K- k! V6 o) [但,要先把一些參數改成你們自己的規格才行

評分

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

查看全部評分

22#
發表於 2007-11-14 17:04:48 | 只看該作者
我補充一下1 O9 @+ d5 K! h6 A1 r8 q6 B% p+ W
緣緣網友應該是在作over-sampling的ADC 跟Finster作的架構不太一樣
8 A/ w6 v# M9 D1 D. u$ Fvideo DAC or ADC 跟Finster講的一樣 取樣1024以上其實模擬結果就差不多了. z3 ~9 A, b/ m
至少我模擬起來也是這樣
6 ?  @9 x  Z" z" w7 m! C/ O而over-sampling的架構 顧名思義 就是以超取樣來提高SNR 藉以換取高解析度的ADC/ Q; x# p6 _) ^
所以我想取樣點很多應該是正常的吧

評分

參與人數 1 +3 收起 理由
緣緣 + 3 謝謝版主monkeybad的指導

查看全部評分

23#
 樓主| 發表於 2007-11-26 16:38:58 | 只看該作者

非常謝謝finster副版主的詳細解說與monkeybad版主的指導

再次謝謝finster副版主的詳細解說與monkeybad版主的指導。# v& i7 ?1 z4 U' v& P
說來好笑,我本身出了一個小烏龍,我從11/13回帖後,就一直期待finster副版主的回復,所以我幾乎每天都上論壇來看看有沒有新消息,可是我連續等了好幾天,直到今日(11/26),我才突然發現finster副版主早於我回帖的隔天11/14回我消息,以至於我沒有第一時間答謝finster副版主的指導,真有點不好意思。1 Z: M8 G) M: u* v' V
說來慚愧,我沒有注意到我的帖子已經有第2頁,直到今天才發現,真有點啼笑皆非。
9 n! i1 @9 c# E: @* y- M在此,根據finster的指導,我會再試試,有什麼新問題,再向你請教。! E  r9 l1 c$ M4 e6 P
此外,回答monkeybad版主的問題:我的確作的是over-sampling的ADC,所以, 才需要取樣到32k points那麼多吧,畢竟我也希望取點取少一點作計算,可是又怕算出來不準確,我想,我應該會比較一下1024點與32K點的差異,如果差異不大,或許我就可以將點數減少來計算。   # h8 R* M1 s" k  W
∼謝謝!∼
24#
 樓主| 發表於 2007-11-28 21:24:43 | 只看該作者

請問finster副版主有關程式問題

請問finster副版主:0 y/ p; ^! x8 T1 b" _1 b
我依照你提供的程式,修改成我的規格後,程式修改如下:" S5 p, `$ C& y: D8 h
% --------------The number of FFT -------------
  ^% W+ k) J' a/ q" m7 @fin=5;% *KHz
" q" b( K& `- i5 Nfs=5120; % *KHz+ d/ P! X% P! q8 Q3 Y
cycle=1; % cycle = 2^N ; N = 0~5
$ H. t" H( I9 jM=round(cycle*fs/fin);" B! I1 n) k  ]4 `% X
% --------------Load the binary code -------------& Z& E2 i) ~" K; h" S. C; m
load sdm_out.txt -ascii% o' c, b0 h4 n- M8 d% R& W
start = 1;: J* j2 Y' t6 O# c  s: @$ p
step  = 1;" u# x6 J# \) f% x+ ?  M# _
%ADC0 ?" ]* R8 a, P- Y, M# B
x=sdm_out(start:step:M);
8 |/ [, f1 t& r% G: D- j
% --------------Using minimum 4-term Blackman-harris Windows -------------
  f7 U" L* ]/ u! C2 Qptst = 1;0 g: D5 P; e* u* S- C
ptfi = M;- `" }8 d8 _! g2 h% `& W9 ^; z
pts = M;  Q6 v- z+ h5 O2 ~
nb=1:1ts;' n  s1 B) {+ f' K. p+ p
kb=0.355768-0.487396*cos(2*pi*nb/(pts))+0.144232*cos(4*pi*nb/(pts))-0.012604*cos(6*pi*nb/(pts));. N7 A; K* u2 S0 f* \5 `
win_gain=sum(kb)/pts;
# y/ Q$ W6 X3 _kb=kb/win_gain;0 ?5 y, H6 q* P+ n+ `- p
% --------------- Calculated fft --------------------------2 W9 A( X# [; s! s+ K
yb=kb.*x(ptsttfi);
: L1 c* Q+ ^4 h/ F1 @
yk=fft(yb);
2 p" }' S4 E, H4 U. g' M1 H' m% k" efft_no=length(yk);
3 ?  ^9 U+ C$ W0 F$ gf=fs*(0:fft_no-1)/fft_no;, _+ Y  [2 M- q5 f- g
Pyy=yk.*conj(yk)/((fft_no/2)^2);- L* @) ]; z: t/ X9 X' H; k5 J4 s
% ---------- Calculate THD ----------------------------/ _8 f# r, x  I! ?) c* z
j=1;9 a8 F( V- i+ ?" C" O, k
for i=1:1fft_no/2)( H; L& F0 O/ k  m
    if (f(i) == (fi*j))  
. }' b) j1 l1 d' a: A9 \0 X        HD(j)=Pyy(i);     %% find all harmonic distortion components9 H$ Q  m( X$ f8 g: o
        j=j+1;
+ j4 t3 B" _' l, l( |    end
% M& I( o) J' V: D  bend. s5 s) S" J: {! t& v2 ^# I) C$ A
P_hd=sum(HD(2:9));1 H+ m3 O* Y' I3 J: P6 `  O8 S
THD =10*log10(P_hd/HD(1));  %% HD(1) is fundamental signal;6 e/ g  l2 ^5 W: u9 b; i, c( [* f
fprintf('THD = %g dB\n',THD);
9 Y4 Y( R2 F6 m2 R% ---------- Calculate SNR ----------------------------
/ t- [. j8 {* r$ wfundamen_dB=max(10*log10(Pyy(1:fft_no/2)));( x8 I7 h+ W, J. ~
fundamen_no=find(10*log10(Pyy(1:fft_no/2))==fundamen_dB);
2 ^/ ]2 J: L; X) _7 P6 [& aspan=max(round(fft_no/200),5);' L0 Q3 Y5 @1 \& N. ~# f5 {% a0 S9 \
P_sig=sum(Pyy(fundamen_no-span:fundamen_no+span));. _9 n: p/ v4 p9 t  ]; A
P_noise=sum(Pyy(1:fft_no/2))-P_sig-P_hd;
2 T( k0 q) u: M* F$ n' SP_noise_hd=sum(Pyy(1:fft_no/2))-P_sig;  P: Q. ~3 p1 _# O' h: p
SNR=10*log10(P_sig/P_noise);
. @. Y- Q) {, i% u: g3 M8 ESNDR=10*log10(P_sig/P_noise_hd);
' p3 A' Z; Y4 D) Y' b1 b) r; h) u: F
fprintf('SNR = %g dB\n',SNR);
. E+ \* e6 P% E2 Y5 f& l: V% ofprintf('SNDR = %g dB\n',SNDR);
- V0 X3 m9 J! V, H 7 A; A4 I& I; _0 b! K* N$ {( N
藍色字體部分為我新增的程式,當我run到紅色字體部分,matlab顯示以下訊息:
8 `4 T7 J4 b2 [. K6 {??? Error using ==> times+ `/ N8 L, e: ~) {' J
Matrix dimensions must agree.
/ K& L9 Z4 }4 R3 c- r; u: z
, l! c! i# H0 j' P
Error in ==> sndrtest at 21
. Y+ @" u2 [& C1 Uyb=kb.*x(ptsttfi);

$ J, u# B. h5 B% u- d" ^4 G/ i& H6 U8 }0 t
因x函數是我自行定義的,可否幫我看看要如何修改?" n/ Q4 k. k( Z" Y
另外,在程式底下的藍色字體部分,是我增加對SNDR的計算式,不知有沒有錯?4 r' O" Y+ E$ ~+ z  p/ G
除了以上兩點外,全部程式中有沒有哪裡有問題,也請幫我看看。' E2 h; M. }6 ~- n
附件是我取1024點得到的SDM digital code,我是由第2 個clock開始抓輸出資料,我的測試條件為:Fin=5k,Fs=5.12M。
' E( g9 {( g; ~# t* e' H" O以上麻煩finster副版主賜教。

本帖子中包含更多資源

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

x
25#
發表於 2007-11-30 00:54:55 | 只看該作者
我看了一下你的MATLAB程式,發覺到有一個地方有問題* Z6 c, u( r2 ]% {: [) D
那就是你設ptst和ptfi是同一個值是不對的$ _: ~8 O: S" ~7 {/ A
ptst是計算fft開始的值
& V8 O) G5 e; ~0 d+ k而ptfi則是計算fft的range,如8~519,total則為512點1 A, Y* M& d) h" F+ |: M
故而你在執行MATLAB程式時就會出現錯誤
$ W9 V3 B5 W- Z$ T. [2 U: X" l- ~9 H& X# Y7 J! G, c
我看了一下你的MATLAB程式,基本上沒有多大問題) X0 p; S1 E; o2 r9 F' i) m
不過,要小心計算THD的值和範圍
1 x* m+ K6 U2 n3 X( }0 k因為有不少人問過我為什麼在這個地方會出現錯誤,而當我看到他們的錯誤訊息時,便會發覺到他們的取様範圍太少,以致會計算不到第9個harmonic distortion components而出現錯誤
$ P/ s3 {5 t  E; }0 l/ Z4 }/ s  r# @! C# Z6 e. {
最後,計算noise有好幾種定義方式
1 M5 ^7 X, {9 h& w. c, h原本我所寫的程式有兩種計算SNR,SFDR的計算式,後來,經過我們內部討論的結果只用我給你的那一種計算方式,因為那個方式比較合理' O# P+ _- }" r8 Z: Q* {
我個人覺得計算noise的方式,只要能夠說服的了別人,同時也能夠提出合理的解釋即可9 Z/ x3 x( `! q; A5 v# x
因為目前在計算noise上並沒有很統一的說詞,故而,只要解釋的合理即可

評分

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

查看全部評分

26#
 樓主| 發表於 2007-12-2 18:25:13 | 只看該作者

感謝finster的解說

感謝finster的解說,我解釋一下你的回復,我程式中ptst是設1,但我的ptfi是設ptfi=M=round(cycle*fs/fin)=1024,所以並不是同樣數值,取1024是因為我有1024筆資料,還是說我這樣的寫法不對?
1 |0 k  A( {# |7 N; G; P" q0 z因為我希望計算的點數為32k,所以先以1024(1k)的點數來試著計算看看,如果沒問題再計算32k點。/ ~2 h: L! @! n8 V: m0 U" J
我想我程式的問題在於x函數是我自行定義的,可能有錯,可否再幫我看看要如何修改?* C; N2 \7 H8 Q4 r4 U7 T$ y
謝謝!
27#
發表於 2007-12-2 21:33:33 | 只看該作者
我想,你可能有點誤解了我的意思了
4 c2 g: b  I' _+ C, l3 b: f我列出我當初寫ptst和ptfi的式子關係式: B9 C. B+ |1 z. z
ptst=2^3;          % calculated fft of start point! _) J5 n) \- G. ]. Q9 M7 I
pts=2^9;           % calculated fft of end point, {( s  L) e% W( a: Z# `0 T
ptfi=ptst+pts-1;   % calculated fft range: 8 ~ 519, total: 512 point
2 A3 y( e0 Y3 C, W因為我們不是從第一點就取來作fft運算,故而在設ptfi時,它的值是取(2^N)再加上從第幾個cysle值所取的值# k2 t- f1 j" k: p( A. q
如此一來才能夠取到足夠運算fft的值3 t: T* r" D+ p

0 N& _$ I6 E# w, p另外,還有一點,x陣列的值要比ptfi的值大,或者等同於此值
4 b' K  R) r" f' v  D如果你的x陣列內的值沒有到達ptfi,那MATLAB就會判斷出錯誤
6 q7 p9 o6 P4 Y& h" o& T/ G8 O% e& o# `
如果對於要設的參數仍有問題
2 L" G/ B0 q3 K& k, ?1 {4 e我可以把我最原始的程式寄給你參考7 R5 b! _+ D9 a8 f& R

3 _/ j8 s- z: Q[ 本帖最後由 finster 於 2007-12-2 09:43 PM 編輯 ]

評分

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

查看全部評分

28#
 樓主| 發表於 2007-12-3 12:16:11 | 只看該作者

謝謝finster的指導

謝謝finster的指導,我試著把你的方法帶入程式驗證,matlab仍然出現:$ N7 W/ M% N# q, |2 o
??? Error using ==> times
# e6 J) I: |) h' q+ P% F: {5 @Matrix dimensions must agree.
7 u' {- X: h7 n9 R" L
' r  i' z; g9 T4 [+ LError in ==> sndrtest at 26) N" ^, D6 h, J) L
yb=kb.*x(ptst:ptfi);; S- ?6 A) X9 ^, H! R9 u
那麼,就麻煩finster把你原始的程式寄給我參考,另外,可否附上hspice轉出來的digital code,我好方便作個比對。3 y! d' U& P) A% H
∼感激不盡∼# I; V; B1 b& c) k/ m0 N$ E
ps.我的E-mail address我會以短消息傳給你,謝謝!
29#
發表於 2008-3-23 15:06:25 | 只看該作者
很有用啊,谢谢各位的指导,特别是finster太强了,对了,你能不能给我们多介绍一下关于整个ADC,DAC的设计流程与方法啊?
. E0 B6 p& E" ]4 y( t* {特别是仿真方法(从用matlab系统仿真到fft仿真分析。。。)
30#
發表於 2008-3-24 12:18:21 | 只看該作者
請問一下
) ]8 m; R# Q  x* S- q% a如果要在HSPICE模擬ADC的INL及DNL的流程及作法??. C0 W( L9 N; V3 q1 h, W2 z
因為沒有MATLAB請問HPICE可以直接做嗎??
1 ?7 |* f# P2 V6 N" l
0 ^5 H" o' O0 Y, X請各位做過ADC的高手幫忙回覆..
31#
發表於 2008-3-24 13:21:54 | 只看該作者
基本上作ADC,DAC的模擬,還是以HSPICE為首選建議的模擬軟體/ L/ @/ W0 o& I' f, s4 Q
至於用spectre,h-sim,matlab....等,均可對ADC,DAC作模擬" ~# H! s$ w& }
但,在業界,個人的建議是,還是要跑HSPICE會比較保險% E# ^; [! m1 e5 t0 O/ C2 ^
至於INL,DNL,SFDR,SNR....等,基本上很難直接用HSPICE跑出來,因為有些計算式子在HSPICE中要撰寫出來很麻煩(用.measure指令來作計算),我曾經嘗試過,但最後不得不放棄,因為有些計算真的很麻煩,而且用MATLAB很快便可達到計算
' a1 Z$ o/ O) ]7 w! y一般都是把HSPICE模擬出來的數值帶到MATLAB中去作計算會比較簡易
  i. e' X* m/ T/ V" Z而如果沒有MATLAB,也可以用C來作數學運算,不過,印象中C沒有FFT的計算函式,所以,可能會需要一些額外的撰寫FFT運算程式才行
32#
發表於 2008-4-23 22:59:14 | 只看該作者

Hspice轉進matlab

請問一下:我想把hspice模擬出來的波形,放到matlab裡面做比較,請問要怎麼操作呢?
/ F) h6 K+ }* b, [  r                請各位了解的高手幫忙,謝謝.
33#
 樓主| 發表於 2008-4-24 16:16:29 | 只看該作者

回復 32# 的帖子

請問你是要將hspice模擬出來的波形,然後用Matlab叫出來比較呢?' D% U, g, R8 q4 v- A8 q  z
還是要將hspice模擬出來的數據,然後使用matlab做分析?
34#
發表於 2008-4-28 11:34:36 | 只看該作者
目前我是要將hspice模擬出來的波形,然後用matlab叫出來做比較,請問這要怎麼弄呢?
35#
發表於 2008-4-28 12:18:21 | 只看該作者
另外,也要將hspice模擬出來的數據,丟到matlab裡面做比較分析) a& u1 G& j3 J# {7 p5 H  D+ z
請各位高手幫忙,謝謝.
36#
 樓主| 發表於 2008-4-28 17:19:49 | 只看該作者
志良你好:
: N6 u1 |; F0 i9 M! V/ X( S, `; Q如果你是要將hspice的波形用matlab叫出來比較,你可以去Matlab網站下載hspice toolbox來用,至於用法,我之前有在網路上搜尋到hspice toolbox的英文及簡體的說明檔,我另外自己也寫了一份繁體中文檔,我把他們全部置於附件中,供你參考,你看完說明檔後,應該就會用了,有問題再發問吧。
' h! e- ]$ O5 u/ ?  c關於你的第二個問題,這說起來可能有點複雜,你可以看一下版面上我之前與版主及副版主的問與答內容,應該可以知道如何從hspice下指令得到所需的資料,matlab程式的寫法,可以去買有關matlab的書來看,到時有問題再發問了。希望對你有幫助。& w6 Y8 V) F2 F) E& P

# X  c) M. ]. V; t[ 本帖最後由 緣緣 於 2008-4-28 05:48 PM 編輯 ]

本帖子中包含更多資源

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

x

評分

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

查看全部評分

37#
發表於 2008-4-29 12:53:25 | 只看該作者
請問一下,第一個問題我看完附件後,第三個步驟還是不太懂,是要先把hspice的波形檔放到hspice toolbox裡面嗎?那在matlab裡要怎樣叫出波形檔呢?
38#
 樓主| 發表於 2008-4-29 14:03:58 | 只看該作者

回復 37# 的帖子

1.首先你跑完hspice會產生一個*.tr0的檔案。
7 G1 J7 W% E9 {/ Q2 v1 I2.然後開啟matlab軟體。
( H# e2 t, f, y9 H# d3.從matlab的工具列會有一行current directory設定你hspice *.tr0檔案的存放路徑,或是把檔案copy到你現在matlab工作的路徑。3 D& x2 N' R: l, [8 [
4.在matlab的命令執行列執行X=loadsig('xxx.tr0')指令(說明檔裡面都有);  載入波形檔xxx.tr0到結構x中。9 w# o2 k; t# V7 R/ B5 `8 J4 N
5.再執行說明檔中相關指令,即可看到你所想看的各點波形。
39#
發表於 2008-4-29 16:17:54 | 只看該作者
請問結構x是什麼意思呢?3 ^- X1 H# _5 a6 H: o- _

* O2 k: @+ P- m+ ~6 Y8 \0 a& werror in hs_allocate_sf: unexpected values in block1 header
' |1 F& ^. i1 v: }??? One or more output arguments not assigned during call to 'loadsig'.
- l* x4 j. E6 c: l3 W5 T這是怎樣的錯誤呢?
40#
 樓主| 發表於 2008-4-30 13:42:31 | 只看該作者
首先x結構類似數學中的X函數,只是將loadsig('xxx.tr0')的指令指向X函數,你也可以用y,z....,此種寫法類似C語言的寫法。- q  w' u: G- q  f
第二個問題好像是你的電路輸出節點有重複或是你的*.tr0檔案有問題,這我就沒遇過了,你可能要自己查一下。
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-5-18 09:21 AM , Processed in 0.138018 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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