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

Octave脚本处理采样率高于50kS/s数据时hist函数报错问题

故障原因定位

该错误由两个高采样率场景下的隐性问题共同触发:

  • 索引值未做合法整数转换:transient = tau * FS的运算结果为浮点数,采样率较高时,浮点存储、运算的精度偏差可能导致索引值不合法,切片得到的s数组存在隐含的长度/类型异常,传入hist后触发内部计算错误。
  • 极低归一化截止频率引发数值不稳定:采样率高于50kS/s时,低通滤波器的归一化截止频率低于2e-5,双精度浮点运算下滤波输出可能出现非有限值(NaN/Inf),或数值坍缩为无波动的常量;旧版本Octave的hist函数处理这类输入时,bin边界计算会出现0值下标,最终抛出下标非法的错误。
修复方案

按以下逻辑修改代码即可解决问题,核心是补全类型转换、边界校验,替换稳定性不足的旧函数:

FILTER_ORDER  = 1;
FILTER_CUTOFF = 1 / (2 * pi * 300e-3);       
% 显式转double避免整型运算误差,同时校验归一化截止频率在合法区间
FS = double(FS);
Wn = FILTER_CUTOFF / (FS / 2);
Wn = max(min(Wn, 0.999), 1e-9);
[b_lp, a_lp] = butter(FILTER_ORDER, Wn, 'low');

% 输入信号显式转double,避免整型滤波溢出
s = double(SCALING_FACTOR) * filter(b_lp, a_lp, double(u_q));   
P = s;                                    

tau  = 20;                            
% 显式将截断索引转为正整数,增加边界保护避免越界
transient = max(1, min(round(tau * FS), length(s)-1));
Pmax = max(P(transient:end));  

s = s(transient:end);  

% 拦截非有限值,避免hist计算异常
s(~isfinite(s)) = 0;

NUMOF_CLASSES = 10000;                              
% 用新版histcounts替代已弃用的旧hist,数值稳定性更好
[bin_cnt, bin_edges] = histcounts(s, NUMOF_CLASSES);
cpf.magnitude = (bin_edges(1:end-1) + bin_edges(2:end))/2; % 输出和原hist逻辑一致,为各bin中心值
快速验证方法

修改后可以在直方图计算前增加两行打印,确认参数合法:

printf('采样率: %.0f S/s, 截断索引: %d, 有效数据长度: %d\n', FS, transient, length(s));
printf('数据范围: [%.4f, %.4f], 非有限值数量: %d\n', min(s), max(s), sum(~isfinite(s)));

只要截断索引为正整数、有效数据长度大于0、数据范围正常且无多余非有限值,代码即可正常运行。

内容的提问来源于stack exchange,提问作者PG_Tech

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 20:06:26