我正在尝试编写一个简单的代码,它将生成一个大窗口的总和,并除以小运行窗口的总和,以获得能量比。
我的代码在MATLAB中看起来像这样
S = data1;
[nt,ntraces] = size(S);
!Create sliding windows for First Break Picking:
!define a window length
!for large Window
nl = 300
!for small running Window
ns = 50
! tolerance/Fudge Factor
beta = 0.0000
for i_slide = 1:nt-nl
for i_large = i_slide:(i_slide+nl)
large_window(i_large) = sum(S(i_large).^2)';
for i_small = i_slide+ns:i_slide+nl
small_window(i_small) = sum(S(i_small).^2)';
end
end
ER(i_slide) = small_window/(large_window + beta);
end
我遇到的问题是我的小型运行窗口没有正确索引,也没有在最大幻灯片的整个大窗口长度上运行总和。
我能如何克服这个问题?
答案 0 :(得分:0)
一般来说,你真正试图解决的问题似乎是一般的2-D(或1-D?)卷积。您可以使用MATLAB的conv或conv2函数(或过滤器或imfilter,如果您有图像处理工具箱)来执行此操作。如果您需要来编写二维卷积函数,我不会尝试编写一个进行两次卷积并获取该比率的函数。而是编写一个简单的卷积函数:my_conv并运行它两次,然后取比例。例如,你正试着写:
output = my_double_conv(data,smallFilt,bigFilt); %this does ratios
我认为这不是一个好主意。不要那样做。做
output = my_conv(data,smallFilt) ./ my_conv(data,bigFilt);
你可能会看到一些速度优势,因为不必在my_double_conv中将所有内容编入索引两次,但如果计算问题是你的问题,那么你不应该首先编写自己的卷积;相反,你应该使用FFT卷积或积分图像卷积(例如,http://hebb.mit.edu/courses/9.29/2004/readings/c13-1.pdf或http://en.wikipedia.org/wiki/Summed_area_table)
那就是说,你的代码有几个问题。您是否尝试过使用MATLAB调试器进行调试?
例如,这显然是错误的,因为i_small是一个标量索引:
for i_small = i_slide+ns:i_slide+nl
small_window(i_small) = sum(S(i_small).^2)';
end
由于i_small将成为标量,因此该总和不会对任何事物进行“求和”......
你想要:
small_window= S(i_slide+ns:i_slide+nl);
small_window_sum = sum(small_window.^2);
另请注意,对于逐元素矩阵运算,例如:
small_window /(large_window + beta);
如果small_window和large_window是标量,则需要:
small_window ./(large_window + beta); %注意“。”