【发布时间】:2014-12-02 01:42:07
【问题描述】:
我有一个函数可以根据信号的其余部分查找和调整峰值。我遇到的问题是,如果信号有 8000 点,它工作得很好并且非常快并且在大约 1 分钟内完成,但如果它有 200000 点,则需要一个小时以上。任何想法如何加快这个功能?
%example [peaks_found,peak_sig_adj]= rtadjpeak (signal, 3,3)
function [peaks_found,peak_sig_adj] =rtadjpeak (signal, T_multi_lower, T_multi_upper)
Af=signal;
% Thresholds
T_lower = -mean(abs(signal))*T_multi_lower
T_upper =mean(abs(signal))*T_multi_upper
% initialisation
[peaks_r,peaks_c] = find( Af < T_lower | Af > T_upper);
peaks = find( Af < T_lower | Af > T_upper);
%find the mean of all the peaks
counter = 0;
while ~isempty(peaks)
peaks = find( Af < T_lower | Af > T_upper);
try
Af(peaks) = ( Af(peaks-1) + Af(peaks+1) ) / 2;
catch
if peaks(1) == 1
Af(1) = 0;
else
Af(end) = 0;
end
end
counter=counter+1;
end
peaks_found=counter
peak_sig_adj=Af;
end
PS:我使用的是 octave 3.8.1
我按照别人推荐的方式做了分析器,但我仍然不知道如何提高此功能的速度
profile on;
rtadjpeak(z_sig_combined_L1, 3, 3);
profile off;
>>>T_lower = -0.50551
>>>T_upper = 0.50551
>>>peaks_found = 1013
profshow (profile ("info"));
# Function Attr Time (s) Calls
---------------------------------------------
14 find 0.043 1017
5 binary < 0.023 1017
1 rtadjpeak 0.023 1
6 binary > 0.022 1019
20 binary | 0.018 1015
23 binary + 0.002 3036
22 binary - 0.002 1013
17 binary / 0.001 1013
21 isempty 0.000 1014
8 prefix ! 0.000 1016
2 abs 0.000 2
3 mean 0.000 2
16 sum 0.000 2
25 profile 0.000 1
9 false 0.000 3
4 nargin 0.000 7
13 size 0.000 2
7 isnumeric 0.000 2
10 binary == 0.000 4
11 true 0.000 2
【问题讨论】:
-
你完成分析了吗? (mathworks.com/help/matlab/ref/profile.html) 如果你这样做,你会看到哪些行/功能导致了减速。
-
@Eugene K 我做了分析器,但我仍然不知道如何提高这个函数的速度
-
出于好奇,我提出的功能有多快?没有时间针对原始功能进行测试。
-
@CST-Link 非常快,旧版本需要一个多小时。你的代码花了 18 多分钟。再次感谢:-)
-
@RickT 很高兴我能帮上忙。 :-)
标签: matlab octave vectorization