绘制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
相关产品推荐
相关产品推荐

