1

私は巨大な波形マトリックスを持っています:

[w,fs] = wavread('file.wav');
length(w)
ans =

  258048

このマトリックスをセグメント(たとえば50)で調べ、これらのセグメントの最大値を取得して、別の値と比較したいと思います。私はこれを試しました:

thold = max(w) * .04;
nwindows = 50;
left = 1;
right = length(w)/nwindows;
counter = 0;
for i = 1:nwindows
  temp = w(left:right);
  if (max(temp) > thold)
      counter = counter + 1;
  end
  left = right;
  right = right+right;
end

しかし、MATLABは大量の警告をスローし、次のエラーを出しました。

Index exceeds matrix dimensions.

Error in wlengthdur (line 17)
  temp = w(left:right);

私はコースを閉じますか、それともコースから外れますか?

4

1 に答える 1

1

別のアプローチは、ベクトルを 2D 行列に配置するために reshape を使用することです。nつまりceil(length(w) / n)、matlab 行列は長方形でなければならないので、割り切れるように切り上げます。このようにして、ループすることなく、最大値または必要なものを 1 つのステップで見つけることができます。

w = randn(47, 1);
%this needs to be a column vector, if yours isn't call w = w(:) to ensure that it is

n = 5;

%Pad w so that it's length is divisible by n
padded = [w; nan(n - mod(length(w), n), 1)];

segmented_w = reshape(padded, n, []);

max(segmented_w)
于 2013-03-19T07:12:48.303 に答える