1

我正在尝试编写一个简单的代码,它将生成一个大窗口的总和并除以小运行窗口的总和以获得能量比。

我的代码在 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

我遇到的问题是我的小运行窗口没有正确索引,也没有在最大滑动处沿整个大窗口长度运行总和。

有什么想法可以克服这个问题吗?

4

1 回答 1

0

一般来说,您真正要解决的问题似乎是一般的二维(或一维?)卷积。您可以使用 MATLAB 的 conv 或 conv2 函数(或 filter 或 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 是标量,您需要:

small_window./(large_window + beta); %注意“。”

于 2012-10-23T00:59:40.727 回答