资讯详情

hosa工具箱与3/2谱:用双谱分析揭示信号中的相位耦合关系

📅 2026/10/20 11:52:30 | 华诺云谱 👁 阅读
hosa工具箱与3/2谱:用双谱分析揭示信号中的相位耦合关系
简介一份高阶谱分析HOSA完整工具箱资源兼容MATLAB R12面向信号处理、机械故障诊断、生物医学与通信工程领域的研究者。该工具箱通过计算高阶累积量、矩函数及相关函数支持一至四阶谱含双谱、三谱计算、多变量联合分析、数据预处理与图形界面可揭示非线性非高斯信号中的相位耦合、二次/三次非线性特征。包内共147个文件以.m源码为主另有.mat数据、.dat测试数据、.c底层程序及说明文档总大小仅2.74MB携带方便。目前已有112人学习下载。借助太阳黑子、猞猁种群等内置实测数据读者可快速复现双谱估计、谐波恢复、非最小相位系统辨识等典型流程并灵活迁移至脑电信号非线性分析、机械振动故障检测、非高斯噪声下的通信信号处理等场景。1. hosa工具箱与3/2谱一段噪声信号里藏着的耦合关系为什么双谱能看见功率谱看上去干干净净的信号不一定真没问题。之前我接过一段设备振动数据频谱上只有几个清晰尖峰怎么看都正常可设备就是间歇性出毛病后来有人提醒我试试双谱结果在频率分量互相“纠缠”的位置冒出一个明显峰。这就是标题里 3/2谱双谱的意义它不是玄学而是用三阶统计量在二维频域里找频率分量之间的耦合关系。hosa工具箱hosa toolbox是干这件事最顺手的老牌工具网上常见的 hosa.rar 解压出来就能在 Matlab/Octave 里用。这篇笔记讲清楚它是什么、最小命令怎么跑、参数怎么调、坑在哪儿适合做故障诊断、水声、生物电信号和雷达信号分析的工程师。2. 看懂3/2谱高阶谱的数学逻辑与hosa toolbox能干的三件事2.1 从三阶累积量到双谱3/2谱这个名字怎么来的功率谱是二阶统计量的傅里叶变换它只回答“信号里有哪些频率分量、各自多强”完全不关心这些分量之间有没有相位关系。可工程信号里大量有用的特征正好藏在相位关系里两个频率分量的相位被“锁”在第三个分量上这在功率谱里一点痕迹都没有。要看到这层关系就得往三阶统计量上走。定义上零均值信号的三阶累积量写成C3(m, n) E{ x(t) · x(tm) · x(tn) }对它做二维傅里叶变换得到的就是双谱B(f1, f2) Σm Σn C3(m, n) · exp(-j2π(f1·m f2·n))双谱是复数自变量从一维频率变成了二维频率平面f1, f2。功率谱是一维的来源于二阶量双谱是二维的来源于三阶量于是有些中文笔记直接叫它“3/2谱”。这个叫法不算严谨但很好记三阶统计量对应二维谱三对二就成了 3/2。高斯噪声的三阶累积量理论上是零所以只要信号里没有真正的三阶耦合成分双谱上就不该出峰。这一点比功率谱“抗噪”得多——功率谱里高斯噪声还有一条底噪基线双谱里高斯噪声直接被平均没了。这也是很多故障特征在功率谱上看不到、在双谱上一看一个准的根本原因。2.2 幅值、相位、双相干双谱输出里每一样能拿来干什么hosa工具箱算出来的双谱是个二维复数矩阵。工程上不要直接盯着复数看先拆成幅值和相位两部分。幅值反映耦合强度某个频率组合f1, f2上幅值越大说明这三个频率分量的相位耦合越稳定、越强。相位部分则记录耦合的具体形态比如二次相位耦合的方向是非线性系统产生的还是纯随机碰出来的。还有一个更稳的指标叫双相干bicoherence它把双谱幅值做了归一化数值落在 0 到 1 之间。接近 1 说明这个频率组合的耦合关系稳定可信接近 0 说明那个峰可能只是随机相位凑出来的假象。做诊断时我一般先看双相干确认“是不是真的”再用双谱幅值看“有多强”。双谱既然是二维的那它就能沿某个方向“切”出一维线来用。最常见的是固定 f2 看 f1 的响应或者沿 f1f2 的对角线切一个对角切片。这样做的好处是把二维图像压成一维曲线量化阈值、自动寻峰都变得简单。标题里的 3/2谱如果出现在某篇笔记的代码注释里多半指的就是这条切片。2.3 什么时候值得掏HOSA高斯噪声、二次相位耦合与非线性检测我一般只在三种情况下掏 hosa工具箱。第一高斯噪声背景下的弱信号检测双谱能把噪声压掉信噪比远好于功率谱第二怀疑信号里有二次相位耦合比如机械故障时出现的调制边带、载波与故障特征频率之间的耦合双谱直接在对应频率坐标上出峰第三鉴别系统非线性线性系统不会产生新的频率耦合双谱上出现意料之外的峰往往说明通道里存在非线性环节。反过来有些场景不该用。信号长度太短分段后凑不出足够多的观测样本双谱的方差会压不下来峰全是毛刺信号本身是平稳线性谱功率谱已经能说明问题再上HOSA属于白费力气。最典型的误用是把双谱当“更好的功率谱”一上来就全频段扫图结果既看不出峰又不知道怎么解释。正确做法是先有具体怀疑的耦合关系再让双谱去验证它。3. 装上hosa工具箱并跑出第一张双谱解压、路径与最小命令3.1 解压、目录结构与路径配置你手里的 hosa.rar 解压后核心是一批 .m 源文件部分版本还带编译好的 mex 二进制文件文件名结尾常见 .mexw64、.mexa64 之类。这些 .m 文件就是工具箱的全部逻辑mex 文件只是一些核心函数的加速版本。理解这一点很重要后面避坑章节会讲mex 文件在旧版编译的可不一定能在新环境里跑。拿到解压目录后第一步是把目录加进 Matlab 搜索路径。我一般用绝对路径避免相对路径在切换工作目录后失效addpath(D:/tools/hosa); % 换成你自己的解压绝对路径 savepath; % 保存路径下次启动仍有效 which bispecd % 检查是否找到主函数addpath只对当前会话生效savepath把路径写入 Matlab 的路径配置文件这样重启以后还能用。如果savepath提示没有写入权限那就不要挣扎直接在用户启动脚本里加一行addpath(D:/tools/hosa)每次启动自动加载。which bispecd是验证手段它能确认 Matlab 实际找到的是不是 hosa 目录里的那个函数——这一步能提前暴露很多路径冲突问题。3.2 最小可用流程造一段二次相位耦合信号画出双谱为了不拿真实数据试错我习惯先造一段已知结构的仿真信号跑通流程再换真数据。下面这段代码造了一个最经典的二次相位耦合信号第三个频率分量的相位是前两个的和双谱一定会在对应坐标上出峰等于给自己留了一个可校验的答案。fs 1000; % 采样率 1000 Hz t (0:4095) / fs; % 4 秒信号 fa 50; fb 90; % 两个基频分量 phi1 0.3; phi2 0.7; % 二次相位耦合第三个分量的频率 fafb相位 phi1phi2 x cos(2*pi*fa*t phi1) cos(2*pi*fb*t phi2) ... cos(2*pi*(fafb)*t phi1 phi2) ... 0.2 * randn(size(t)); % 加一点高斯噪声 % 直接法双谱估计 nfft 256; % FFT 点数 wind hamming; % 窗类型 nsamp 256; % 每段长度 overlap 0.5; % 50% 重叠 B bispecd(x, nfft, wind, nsamp, overlap); % 画出双谱幅值 figure; mesh(abs(B)); xlabel(f1 下标); ylabel(f2 下标); zlabel(|B(f1,f2)|);这里bispecd走的是直接法路径分段、加窗、做 FFT、对每段谱做三重乘积后平均。信号特意加了高斯噪声功率谱上会多一条噪声底但双谱上噪声会被平均掉最后的峰只来自那三个相位锁定的余弦分量。nfft256决定频率轴的分辨率nsamp256表示每一段取 256 个点overlap0.5让相邻段有一半重叠相当于在不加长数据的前提下把段数翻倍压低估计方差。3.3 函数家族怎么分工从累积量到双谱再到三谱hosa工具箱不是只有一个函数而是一族。我整理了一份常用分工表照着选函数基本不会走错函数全称含义典型输出适用场景cumest / cum3est累积量估计三阶累积量矩阵先算累积量再做后续处理bispecd直接法双谱估计nfft×nfft 复数矩阵数据较长追求速度最常用bispeci间接法双谱估计nfft×nfft 复数矩阵噪声较重先平滑累积量再变换trispecd三谱估计四维复数数组需要看四阶统计量时bicoher双相干估计归一化 0~1 矩阵判断双谱峰是否真实可信直接法和间接法的选择是刚上手最容易纠结的点。bispecd直接对分段数据做 FFT 再三重相乘平均速度快适合数据量大、先把结果跑出来看看的场景bispeci先估计三阶累积量再做二维傅里叶变换因为累积量估计过程本身有平滑效果所以噪声重的情况下峰更干净代价是慢一点、参数多一个最大延迟长度。实际项目里我通常先用bispecd出图确认有峰之后再用bispeci复核一遍。两个结果互相对得上这个峰才敢写进报告。trispecd用到得少但碰上信号四阶耦合、双谱上没反应的情况它就是你最后一张牌。4. 把双谱调出可用的峰bispecd参数、频率轴与降维切片4.1 直接法参数搭配逻辑分辨率与方差怎么权衡bispecd的四个参数看起来简单搭配起来全是经验。nfft决定频率轴的采样点数也决定画出来的图有多少个像素点nsamp是每段长度直接决定频率分辨率段越长分辨率越高overlap增加段与段之间的重叠等效增加统计平均次数压低方差wind控制加窗形态抑制频谱泄漏。写在这里的参数表是我常用的起点参数作用起点建议调参方向nfft频率轴长度256 或 512峰变宽时增大nsamp每段长度与 nfft 相等频率分辨率不够时增大overlap段间重叠比例0.5图太毛糙时提高到 0.75wind窗类型hamming泄漏严重时换窗最核心的权衡发生在nsamp和方差之间。固定总长度时段切得越短可平均的段数越多方差越小但每段频率分辨率越差双谱峰会被抹宽段切得越长峰越尖锐但段数少方差压不住图上一片刺。我的经验是先用nsampnfft256、overlap0.5跑一版如果峰糊成一团就增大nfft如果图变成刺猬就增大overlap。一个很容易忽略的细节是信号要先做零均值化再做双谱估计。hosa工具箱内部一般会处理但如果你先对数据做了带通滤波滤完一定要重新去均值否则直流泄漏会在双谱低频区域制造一片假峰。去均值就一行x x - mean(x)不亏。4.2 频率轴约定与峰位置换算别把坐标看反bispecd返回的 B 是一个 nfft×nfft 的复数矩阵行和列分别对应两个频率轴但不同版本的 hosa工具箱对频率归一化的约定不完全一样。常见的有两种一种把采样频率当成 1矩阵下标直接乘采样率就是物理频率另一种把奈奎斯特频率当成 1下标要乘采样率的一半。这个差异足以让刚上手的人对着一个“位置不对”的峰怀疑人生。我处理这个问题的方法很简单——用 3.2 节里那段已知频率的仿真信号去校准。fa50Hz、fb90Hz、采样率1000Hz跑完双谱后用find定位最大峰的行列下标把下标与理论频率做对比一次就能确定当前版本的坐标约定B_abs abs(B); [kr, kc] find(B_abs max(B_abs(:)), 1); % 第一种约定下标/nfft*fs f1_est (kr - 1) / nfft * fs; f2_est (kc - 1) / nfft * fs; % 如果算出来是 25/45 这种半数值说明约定是把奈奎斯特当 1各乘 2 即可这里find定位的是双谱幅值最大的位置理论上应该落在 (50, 90) 或 (90, 50) 附近因为双谱对 f1 和 f2 是对称的两处都会有峰。校准完之后把换算公式写死在处理脚本开头后面换真实数据时就不会再迷茫。坐标如果差了正好一半多半就是归一化约定问题不是信号问题。4.3 从二维谱里提一维特征固定频率切片与对角切片二维双谱图画出来好看但做成自动诊断特征就麻烦了——阈值怎么定、峰值怎么全自动提取都不好办。工程落地上我几乎总是把双谱降维成一维曲线再用。两种切片最常用固定 f2 在某一个特征频率看 f1 方向的响应或者沿 f1f2 对角线切一刀看倍频耦合的整体分布。下面这段代码展示了固定频率切片怎么用它跟在 3.2 节代码后面直接运行% 固定 f2 在 90 Hz 对应的下标由校准阶段确定 kc_ref kc_ref round(90 / fs * nfft) 1; % 按采样率为 1 的约定估算 slice abs(B(:, kc_ref)); % 取整列得到一维谱线 % 换算 f1 轴 f1_axis (0:nfft-1) / nfft * fs; plot(f1_axis, slice); xlabel(f1 (Hz)); ylabel(切片幅值); grid on;固定频率切片拿到的这组数天然就是“某个特征频率和其他所有频率的耦合强度曲线”。做齿轮箱或轴承诊断时我常把故障特征频率定在 f2 上然后看 f1 轴出现在哪些频率上有峰峰出现的位置就能反推是哪两个分量在耦合。这样做的好处是二维图里的主观判断变成了一维曲线上的固定阈值比较自动化程度高很多。对角切片则适合做“整体耦合程度”的粗筛查。把对角线上的幅值累加成一个标量或者画成一条随频率变化的曲线哪段频率区间耦合多一眼就能看出来。它牺牲了频率组合的细节换来的是稳定性和可解释性。这两个切片方向配合使用差不多能覆盖 80% 的故障筛查需求。5. hosa工具箱避坑指南5个让新手翻车的细节5.1 坑addpath 之后重启 Matlab 又找不到函数现象第一次addpath能用重启后which bispecd报“未找到”脚本直接中断。原因savepath没有真正生效。常见情况是 Matlab 安装在系统受保护目录里普通用户没有写路径配置文件的权限另一种情况是你在脚本里加了addpath但脚本退出后路径自然消失。解决先执行savepath看有没有报错。报权限错就用用户启动脚本方案在 startup.m 里写addpath(D:/tools/hosa)每次启动自动加。加完用which bispecd -all确认找到的是 hosa 目录下那个函数而不是别的目录里的同名文件。5.2 坑新版 Matlab/Octave 加载不了旧 mex 文件现象跑某个函数时报“无法加载 mex 文件”或者提示“不是有效的 Win64 应用程序”。原因hosa.rar 里自带的 mex 二进制是在旧版环境或 32 位系统下编译的新版 Matlab 需要的 .mexw64 格式对不上在 Octave 里还需要对应平台的 .mex 文件混用基本必炸。解决先找同名 .m 文件替代。hosa工具箱的大部分核心函数都有纯 .m 版本去掉对 mex 的依赖也能跑只是慢一点。如果某个函数只有 mex 没有源码就得找原始源码重新编译在 Octave 下可以用mkoctfile重新编译。实在不行就换一个以 .m 为主的版本来用别和二进制文件较劲。5.3 坑双谱图密密麻麻全是刺找不到峰现象mesh(abs(B))出来一片毛刺看起来像随机噪声和功率谱比没有任何优势。原因双谱是三阶统计量的平均结果它比功率谱需要多得多的样本去压低方差。总数据长度固定时段切得太长导致段数太少或者overlap太低统计平均次数不够方差压不下来。解决先把nsamp降到 128 或 256增加分段数再把overlap提高到 0.75让同一段数据被多次利用如果整段数据本身太短前面所有参数都没用必须先采集更长数据或者降采样把点数压缩到目标频带里。我调参数有个习惯动作先用仿真信号把参数调到能干净出峰再保持同样的参数组合上真实信号这样至少排除“参数不合适”这个变量。5.4 坑峰的坐标和理论频率对不上还差一半现象双谱峰明显存在但坐标换算出来是 25Hz 和 45Hz而理论值是 50Hz 和 90Hz刚好差一半。原因频率归一化约定不同。有的 hosa版本把采样频率当 1有的把奈奎斯特频率当 1后者算出来的物理频率就少一半。坐标方向也可能反两个频率轴谁对应行、谁对应列不同版本里不一定一致。解决不要对着文档猜直接用已知频率的二次相位耦合仿真信号校准。跑完用find定位最大峰下标分别按两种约定换算看哪个和理论值吻合。校准过后把这个换算关系固定到一个函数里以后所有数据都走同一个转换。5.5 坑和别的工具箱或同名函数冲突现象调用cumest或bispecd时报错错误信息指向的路径不是 hosa 目录而是另一个工具箱或你自己脚本里定义的同名 m 文件。原因Matlab 按搜索路径顺序找函数同名函数先被找到的先执行。老工具箱函数名很短很短像cumest这种名字很容易和别人脚本里的函数撞车。解决用which bispecd -all列出所有同名版本确认优先级。把 hosa 目录用addpath(..., -begin)加到搜索路径最前面或者干脆用完整路径调用run(D:/tools/hosa/bispecd.m)这种方式绕开路径搜索。项目目录里如果有自己写的同名脚本尽早改名别和高阶谱函数较劲。6. 把hosa双谱用成诊断工具先校准、再切片、后下结论6.1 校准先行每个新环境都要跑一遍自检信号把 hosa 当工具箱用和当诊断工具用是两回事。前者只需要函数能跑后者需要一整套验证闭环。我的固定动作是每换一台机器、每换一个版本、每新装一次 Matlab都先跑一遍 3.2 节那段二次相位耦合仿真信号确认三个东西——函数能正常返回、频率轴换算正确、给定参数组合能干净出峰。这三个确认完了真实数据的结论才站得住。6.2 工程验证套路功率谱打底、双谱定位、切片量化现在我处理一段新信号的标准套路分四步。第一步跑功率谱把信号里占主导的频率分量搞清楚确定可疑的频率组合第二步用bispecd出双谱图看可疑组合处有没有峰第三步用bicoher确认峰是否可信避免随机相位碰出来的假峰混进来第四步把固定频率切片做成曲线设置阈值、提取峰位置输出可量化的特征值。这套流程下来双谱不再是“看起来很厉害”的图而是能写进报告、能对比不同工况的定量指标。6.3 一个诚实的前提与一个偷懒外的坚持说句实在话双谱不是万能的。我见过不少信号功率谱上什么问题都能看到双谱反而平平无奇——这种情况就别硬上高阶谱了。真正值得用双谱的是那些“频率成分都清楚、但就是解释不了故障为什么发生”的信号。耦合关系是 HOSA 独有的信息维度其他工具给不了。我现在拿到一段陌生信号第一步永远先跑功率谱怀疑有耦合再掏 hosa这个顺序省了我大量无效计算。也希望这套做法帮你在新项目里少走几步弯路直接落在能用的双谱结果上。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑