※ 引述《k0939620064 (skan)》之銘言:
: 標題: [問題]是否有更快的做法?
: 時間: Wed Apr 30 17:59:24 2014
:
: 各位大大
: 小弟目前遇上一個問題就是用for迴圈做訊號處理時,往往都要跑個1.20分鐘以上
: 想請問各位大大是否有更快的方法?
:
: 以下是小弟的程式碼
:
: for m=1:4
: for n=1:500000
在迴圈中動態的擴大矩陣會有數量未知的記憶體配置動作,
所以迴圈中的變數需要再迴圈外先配置好確定大小的記憶體。
p.s. matlab editor 右邊有一堆橘色的提示,看一下好嗎....
: signal_square(n,m)=sum(sig((n-1)+1:n,m).^2);
~~~~~~~~~
啊不就是n,你多做了一次加法與建立矩陣的動作,而且一個數字不需sum
: % 將收到的訊號平方
: phase_noise(n,m) = angle(signal_square(n,m))./2;
: % 將平方的訊號取角度後除2 = phase noise
: phase_sig((n-1)+1:n,m) = (((angle(sig((n-1)+1:n,m)))- phase_noise(n,m)));
: % 原始訊號= arg(收下來的訊號)-phase noise
: phase_comp((n-1)+1:n,m) = exp(j*phase_sig((n-1)+1:n,m));
: % 原始訊號
: end
: end
:
整個程式可寫成:
signal_square = sig.^2;
phase_noise = angle(signal_square)/2;
phase_sig = angle(sig) - phase_noise;
phase_comp = exp(j*phase_sig);
其實完全不用迴圈的,
用matlab就要用matlab的精神來寫阿。
p.s.
你若是想把原來的 sig 用大小和相位來表示的話,
signal_square 不是應該為 abs(sig).^2 嗎?
: