在绘制小波的FFT幅值时出现索引越界错误

编程语言 2026-07-09

我正在编写一个Octave脚本,用于可视化瑞克波形(Ricker wavelet)的频谱。我的全局时间数组包含 nt = 512 个采样点,但我的波形仅定义为较短的长度 nw = 101 个采样点。当我尝试绘制到奈奎斯特频率(nt/2)的频谱时,程序会因越界错误而中止。

下面是触发错误的最小可重现代码:

% Global parameters
dt = 0.002;
nt = 512;
f0 = 30;
% Wavelet generation (101 samples)
nw  = 101;
t_w = (-(nw-1)/2 : (nw-1)/2) \* dt;
tau = pi \* f0 \* t_w;
w   = (1 - 2\*tau.^2) .\* exp(-tau.^2); % Length is 101
% Frequency spectrum calculation
W_amp = abs(fft(w)); 
freq  = (0:nt-1) / (nt \* dt);
% The error occurs on the following line:
plot(freq(1:nt/2), W_amp(1:nt/2)/max(W_amp));

解决方案

你提供的代码在Octave中无法运行。看起来可能有转义字符把所有的youlr * 变成了 \*。移除这些后我就能运行:

dt = 0.002;
nt = 512;
f0 = 30;
nw  = 101;
t_w = (-(nw-1)/2 : (nw-1)/2) * dt;
tau = pi * f0 * t_w;
w   = (1 - 2*tau.^2) .* exp(-tau.^2); 
W_amp = abs(fft(w)); 
freq  = (0:nt-1) / (nt * dt);
plot(freq(1:nt/2), W_amp(1:nt/2)/max(W_amp));

并产生错误

error: W_amp(256): out of bound 101 (dimensions are 1x101)

该错误发生在最后一行,原因是表达式:

W_amp(1:nt/2)

你定义了 nt = 512,因此你正在调用:

W_amp(1:256)

W_amp 是由 W_amp = abs(fft(w)) 创建的,正如你在 w 的注释中所述,长度应为101,由 nw 定义。当 fft(w) 只有一个输入时,输出的维度与输入相同。

因此,W_amp(256) 会产生越界错误,因为不存在 W_amp 的第256个元素。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章