Matlab错误:索引超过矩阵维数

Matlab错误:索引超过矩阵维数,matlab,Matlab,我正在尝试对音频文件执行STFT。我需要得到每个窗口的fft 我使用了下面的代码 [wave,fs] = wavread('40.wav'); w_length = 1024; for v = 1:w_length:length(wave) data_sub = wave(v:v+w_length); subsection_fft = fft(data_sub); figure(1) plot(subsection_fft) end 但是我得到了以下错误 ??

我正在尝试对音频文件执行STFT。我需要得到每个窗口的fft

我使用了下面的代码

[wave,fs] = wavread('40.wav'); 
w_length = 1024;
for v = 1:w_length:length(wave)
    data_sub = wave(v:v+w_length);
    subsection_fft = fft(data_sub);
    figure(1)
    plot(subsection_fft)
end
但是我得到了以下错误

??? Index exceeds matrix dimensions.
Error in ==> chk at 7
    data_sub = wave(v:v+w_length);

你能告诉我我能做些什么来纠正这个问题吗。

正如错误消息所说,你正在尝试访问
wave
tat中不存在的位置

请参见此示例:

a    = rand(7,1);
step = 4;

1:step:7
ans =
     1     5
v=5
时,您将尝试访问位置
v:v+step
,即5到9,但
a
最多只能定义7个元素

在您的情况下,
wave
被定义为
length(wave)
,但在上一次迭代中,您将越界

为了避免这种情况,最常用的方法是对末端序列进行采样并减去序列的长度:

pos = (1+w_length:w_length:length(wave))-w_length
for v = pos
% do stuff
end

但是,您将留下一些未处理的部分,作为最后一次迭代,您将不得不在循环之外执行。

正如错误消息所述,您正在尝试访问
wave
tat中不存在的位置

请参见此示例:

a    = rand(7,1);
step = 4;

1:step:7
ans =
     1     5
v=5
时,您将尝试访问位置
v:v+step
,即5到9,但
a
最多只能定义7个元素

在您的情况下,
wave
被定义为
length(wave)
,但在上一次迭代中,您将越界

为了避免这种情况,最常用的方法是对末端序列进行采样并减去序列的长度:

pos = (1+w_length:w_length:length(wave))-w_length
for v = pos
% do stuff
end

但是,您将留下一些未处理的部分,作为最后一次迭代,您必须在循环之外进行。

好的,谢谢。你说用这种方法会有一些未加工的部分。我读过关于零填充的文章。如果我将信号归零,使其长度为1024的倍数会怎么样??这能解决问题吗?我只需在循环之外,在间隔
波(v+w_length+1:end)
上最后一次重复你的代码,因为在循环之后
v=pos(end)
。那么我就试试看。谢谢。好的,谢谢。你说用这种方法会有一些未加工的部分。我读过关于零填充的文章。如果我将信号归零,使其长度为1024的倍数会怎么样??这能解决问题吗?我只需在循环之外,在间隔
波(v+w_length+1:end)
上最后一次重复你的代码,因为在循环之后
v=pos(end)
。那么我就试试看。非常感谢。