※ 引述《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 吗?
: