You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

绘制Ricker小波FFT振幅时触发索引越界错误

问题原因

你的索引越界错误本质是频谱数组长度和频率轴长度不匹配:

  • fft(w)的输出长度等于输入信号w的长度(101),Octave中fft默认输出与输入等长的结果。
  • 你用全局参数nt=512生成了长度为512的freq数组,但W_amp只有101个元素,当尝试取W_amp(1:nt/2)(即前256个元素)时,索引超出了W_amp的最大长度101,触发错误。
解决方案

根据需求,有两种修正方式:

方式1:将小波补零至全局采样点长度(推荐,对齐全局频率轴)

如果需要让小波频谱与全局时间数组的采样率、频率范围完全对齐,先把小波w补零到nt个采样点,再做FFT:

% 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

% --- 新增补零步骤 ---
w_padded = zeros(1, nt);
w_padded((nt-nw)/2 + 1 : (nt+nw)/2) = w; % 将小波居中补零到nt长度
% -------------------

% Frequency spectrum calculation
W_amp = abs(fft(w_padded)); % 现在长度为512,和freq匹配
freq  = (0:nt-1) / (nt * dt);
% 正常绘制至奈奎斯特频率
plot(freq(1:nt/2), W_amp(1:nt/2)/max(W_amp));
xlabel('频率 (Hz)');
ylabel('归一化振幅');
title('补零后Ricker小波的频谱');

方式2:基于小波自身长度计算频率轴

如果不需要对齐全局参数,直接用小波的实际长度nw生成频率轴,避免长度不匹配:

% 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)); % 长度为101
% 基于nw生成对应频率轴
freq  = (0:nw-1) / (nw * dt);
% 绘制至小波的奈奎斯特频率(nw/2)
plot(freq(1:nw/2), W_amp(1:nw/2)/max(W_amp));
xlabel('频率 (Hz)');
ylabel('归一化振幅');
title('原始长度Ricker小波的频谱');
关键说明
  • 补零操作不会改变小波的频谱信息,只是在频率轴上增加了采样点,让频谱更平滑,同时对齐全局的频率范围。
  • 奈奎斯特频率的计算始终是1/(2*dt),两种方式最终的频率上限一致,仅采样点数量不同。

内容的提问来源于stack exchange,提问作者Yusuf Bagja Zayana Sumampouw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 05:04:53