简介:本资源是一套面向信号处理与时间序列分析初学者及科研人员的MATLAB小波分析工具集,聚焦交叉小波、小波相关性与多尺度同步性研究,适用于地震、金融、生理信号等非平稳数据的联合时频特征挖掘。压缩包共3个核心.m文件,总大小仅9KB,轻量高效:其中包含小波变换(wt)、交叉小波变换(xwt)及综合分析主脚本(wtc),覆盖小波分解、交叉谱计算、相位差可视化与显著性检验等关键流程。已有759人下载学习,说明其在教学实践与快速复现实验中具备良好口碑。用户可直接调用函数完成双信号多尺度相关性分析,获取交叉小波功率谱、相干谱及相对相位图,无需从零编写底层算法,显著降低小波相关分析入门门槛,并为后续自定义扩展提供清晰模块化基础。 做信号相关性分析的人,迟早会撞上这样一组词:wtc-r16、交叉小波、交叉谱、小波相干、小波相关分析。我第一次在项目里用交叉小波分析两个传感器信号的时频相关性时,也被这些概念绕得头大。这套方法的核心其实很朴素:解决“两个序列在什么时间尺度上、什么频段上相关”的问题。普通相关系数只能给一个数,交叉小波可以给出一张随时间、随频率变化的相关系数图,还能看出谁领先谁滞后。这篇文章我围绕自己搭的一套LabVIEW小波分析模块(内部代号wtc-r16)来讲,从原理到参数设计,再到实际跑通的细节和踩坑记录,全程可复现。
这套分析适合谁用?主要面向做振动、气象、水文、电力、生物信号等时序数据研究的人,以及需要在LabVIEW里做在线或离线信号关联分析的工程师。不管你是刚接触小波分析的学生,还是已经写过不少谱分析代码的老手,下面这些东西都会有用。我尽量不堆公式,把每个选择背后的“为什么”讲透。
1. 交叉小波分析到底在算什么
1.1 从皮尔逊相关说起:一个数字解决不了的时变关系
很多人最早接触的相关分析就是皮尔逊相关系数,给两个序列算一个 r,正负和大小能说明全局的线性相关程度。但这个全局数值掩盖了大量信息。举个我实际遇到过的例子:监测一台风机塔筒的振动和发电功率,整体算下来相关系数可能只有0.3,好像关系很弱。可如果把数据按时间切开看,某些时段两者相关性很高,某些时段几乎没有关系,甚至某些频段上一直是反相位的。
这就是普通相关分析的局限:它把所有时间、所有频率的信息揉成了一个数,丢失了“何时相关、在哪个周期上相关”这两个关键维度。小波分析的价值就是把这个被压扁的信息重新展开,得到一张时间-频率-相关强度的三维图。
我经常用一个生活类比来解释这件事:两个人聊天,一个说话一个接话,有时候立刻接上,有时候隔几秒才回应,聊的话题(对应频率)也一直在变。皮尔逊相关只告诉你“这两人整体上有没有默契”,交叉小波却能告诉你“哪个时间段、在聊哪个话题时他俩最默契,谁总是先开口”。
1.2 连续小波变换:先给每个信号做时频展开
要说交叉小波,得先讲清楚连续小波变换(CWT)。它把一维时间序列 x(t) 展开成一个二维平面,横轴仍然是时间,纵轴变成尺度或频率,每个位置上的幅值代表“这个时刻、这个尺度附近的能量有多大”。
数学上对每个尺度 a 和时间位置 b,小波系数可以写成:
W_x(a,b) = (1/sqrt(a)) * ∫ x(t) * ψ*((t-b)/a) dt
其中 ψ 是母小波,“*”表示共轭。尺度 a 小的时候,小波被压缩,能看到高频细节;a 大的时候,小波被拉伸,看到的是低频趋势。这种多分辨率特性,是短时傅里叶变换(STFT)做不到的——STFT的窗宽固定,频率分辨率和时间分辨率没办法同时调节。
我在LabVIEW里第一次尝试用FFT实现CWT时,最大的认知转变是意识到尺度与频率不是一回事,但可以换算。后面会专门讲这个换算关系,因为很多人在参数设置上栽跟头,根源就是没把尺度档位和实际频率对上。
1.3 交叉谱、交叉小波变换、小波相干到底怎么分
这三个概念非常容易被混在一起,我先用最直白的话做个区分。
交叉谱(cross-spectrum)是经典谱分析里的概念,对两个信号做傅里叶变换后,把一个的频谱乘以另一个的共轭频谱,得到复数的交叉谱密度。它能看频段上的相关性,但没有时间分辨率。
交叉小波变换(XWT)是把交叉谱的做法搬到小波域:先分别对两个信号做CWT,得到 W_x 和 W_y,然后定义 W_xy = W_x * conj(W_y)。它的幅值表示两个信号在某个时刻、某个尺度上共同的高能量区域,相位表示它们之间的局部相位差。XWT适合找“两个信号同时出现高能量”的区域,但如果某个信号能量很低、只是波形形态上跟另一个信号像,XWT就体现不出来。
小波相干(WTC)解决的就是这个缺陷。它把交叉小波谱做了平滑归一化,得到类似相关系数的值,范围在0到1之间。即使两个信号能量都很小,只要局部波形相关性稳定,相干值也可以很高。所以WTC更适合度量“局部相关强度”,这也是我最终选择以WTC为核心的wtc-r16模块的原因。
模块代号里的R16,我解释一下:它代表我在这套流程里把尺度轴按对数等间隔分成16档。选择16不是随手拍的,后面有详细计算逻辑。
2. WTC-R16的模块功能与参数设计
2.1 模块的定位和整体流程
wtc-r16不是一个商业软件,而是我在LabVIEW里自己搭的一套小波相干分析模块。为什么不在MATLAB里直接用现成工具箱?因为我当时的应用场景需要和采集系统对接,数据从采集卡进来之后马上要做实时关联判断,LabVIEW在数据采集和界面交互上天然有优势。如果只是离线分析一段文件,我反而建议直接用Python或者MATLAB,省事得多。
模块整体流程是这样的:读取两个时间序列 → 预处理(去均值、去趋势、可选归一化)→ 分别做CWT → 计算交叉小波谱 → 做时频平滑 → 计算相干谱R² → 做显著性检验 → 绘图输出。每一步在LabVIEW里对应一个独立的SubVI,主VI负责流程调度和界面刷新。
我强烈建议把每个步骤做成独立的VI,而不是堆在一个大框里。项目后期你一定会遇到“为什么结果变差了”的问题,独立SubVI可以让你单独验证每个环节的输出。我吃过这个亏:一开始把预处理和CWT写在一个VI里,结果发现某个通道去趋势有问题,排查了很久才定位到,浪费时间。
2.2 小波基选择:为什么锁定Morlet小波
小波基函数的选择会直接影响结果,而且没有绝对的最优解。市面上常见的母小波有Morlet、Mexican Hat(墨西哥草帽)、Morse、Haar等。对交叉小波相干分析来说,我们最关心三个点:能不能提供相位信息、时频分辨率是否均衡、计算是否稳定。
Morlet小波是复值小波,实部和虚部天然携带幅度和相位,这对计算相位差至关重要。Mexican Hat是实值小波,只能看能量分布,算不了局部相位差。Haar虽然简单,但不光滑,频域旁瓣高,分析连续信号容易产生虚假结构。Morse小波参数调节能力强,但参数越多调整越复杂,对工业项目来说没必要增加这个自由度。
Morlet还有一个非常实用的特性:它的中心频率可以设置。工程上我默认把中心频率 f0 设为6。这个值能保证时间分辨率与频率分辨率相对均衡,也就是所谓的“时频窗乘积”最优。f0太小,小波波形压缩,时间分辨率好了但频率分辨率变差;f0太大,频率分辨率提高,但时间定位模糊,而且对低频信号的边界效应更严重。6是文献里最常用的折中值,也是我实测下来对大多数信号都稳妥的默认选择。
2.3 尺度档位与频率换算里的门道
小波尺度 a 和我们直觉中的频率 f 不直接相等。对Morlet小波,尺度与中心频率的关系近似为:
f = f0 / (a * dt)
其中 dt 是采样间隔,f0 是Morlet小波的中心频率。如果你采样率是1000Hz,dt=0.001s,f0=6,那么尺度 a=6 对应的频率就是 6/(6*0.001)=1000Hz,这已经到奈奎斯特频率了,所以实际操作时,最小尺度不能随便取。
典型做法是从最小尺度 a0 开始,按倍数步长增长:a_j = a0 * 2^(j*δj),j=0,1,...,J。δj是尺度方向的步长,通常取0.125或0.25。δj=0.125意味着每个倍频程内取8个尺度点,频率分辨率更高;δj=0.25则每个倍频程4个点,计算量减半。
R16里的“16档”就是设置J=16,意味着总共有17个尺度点(从j=0到j=16)。我一般会先根据目标最低频率倒推最大尺度。假设采样率1000Hz,目标最低频率是0.01Hz(周期100秒),那么最大尺度约 a_max = f0/(0.01dt) = 6/(0.010.001)=600000。显然太大,计算量和边界效应都不可接受。实际项目中很少需要从直流附近开始分析,我会根据信号特征把最低频率设在一个合理范围,比如0.1Hz,这样 a_max=6000,用δj=0.125反推J。
更直观的做法是直接从频率档位来定尺度列表:从 f_max=fs/2 往下到 f_min,按对数等间隔取17个频率点,再反推尺度。这种“频率优先”的方式对工程师更友好,因为你关心的永远是频段而不是抽象尺度。我当时在wtc-r16里就实现了这种换算函数,输入采样率和目标频率范围,自动生成尺度数组,省去手动翻公式的麻烦。
2.4 平滑窗设计:相干谱计算最容易出错的地方
小波相干的数学定义是这样的:
R² = |S(W_xy)|² / ( S(|W_x|²) * S(|W_y|²) )
这里的 S 是平滑算子。没有平滑,R²在绝大多数点上会接近1,因为分子分母都包含幅度平方,直接相除会抵消大量信息,得到一堆无意义的尖峰。平滑的目的是在局部邻域内统计稳定的相关关系。
平滑分成时间方向和尺度方向。时间方向我用高斯窗,窗宽大约取当前尺度下小波时窗宽度的数倍,工程上我常用“6倍小波时间尺度”的经验值。尺度方向用与母小波匹配的滤波窗。在实现时,最省事的方法是构造一个二维高斯核,对交叉谱矩阵做二维卷积。但要注意,尺度轴是对数分布的,不能用普通等间隔卷积核,否则高尺度区域会被过度平滑。
我在wtc-r16里踩过的最大一个坑就在这里:一开始用统一大小的二维卷积核,结果高频区域相干值被抹平,低频区域反而出现条带状虚假结构。后来改成“时间窗宽随尺度增大而增大”的自适应平滑,结果才正常。这个细节常规文档很少写,但实际影响非常大。
3. 在LabVIEW里把交叉小波跑起来
3.1 整体VI架构和数据类型规划
LabVIEW是图形化编程,模块规划比写代码更依赖架构。我把wtc-r16主VI拆成6个核心SubVI:Preprocess.vi(预处理)、CWT.vi(连续小波变换)、XWT.vi(交叉小波谱)、CoherenceSmooth.vi(平滑相干谱)、Significance.vi(显著性检验)、PlotResult.vi(绘图)。
数据类型方面,所有时域信号统一用一维双精度数组,时频矩阵用二维双精度数组。复数矩阵在LabVIEW里可以用复数双精度二维数组直接存,但要注意,LabVIEW的复数数组在内存里比普通实数数组大一倍,数据较长时要考虑内存占用。
主VI建议用生产者-消费者结构。生产者循环负责读数据,消费者循环负责计算和绘图。小波计算的耗时通常在几百毫秒到几秒之间,如果放在前面板事件结构里直接跑,界面会卡死。很多人觉得LabVIEW自动多线程,其实复杂的数值计算节点并不总是自动并行,明确写两个循环反而可控。
3.2 预处理环节:别急着滤波
预处理直接决定了后续分析的质量。这一步我按顺序做四件事:去掉首尾无效数据段(比如采集系统刚启动时的异常值)、减去均值、去线性趋势、按需归一化方差。
去均值和去趋势是必须的,因为小波变换对常数偏置和线性趋势不敏感,但会消耗大量低频能量,干扰低尺度区域的分析。我一般用LabVIEW的Detrend VI,对非平稳趋势明显的信号,也可以考虑高阶多项式拟合去趋势,但别过度,否则会破坏真实的低频成分。
有一个很多人问我的问题:能不能先做带通滤波再做交叉小波?我的建议是不要。小波变换本身就是多尺度滤波,你再做一次带通滤波,一方面改变了信号的相位结构,另一方面会抹掉部分频段的真实相关性。只有当数据里混入50Hz工频这类强干扰时,才需要在预处理时做陷波,而且最好做成可选项而不是默认开启。
如果两个通道的量纲差异很大,比如一个电压是毫伏级、另一个是千伏级,一定要分别做方差归一化,否则交叉谱的幅度会完全被大信号主导,小信号的有效信息被淹没。归一化不会改变相关性方向和相位结构,只会让不同通道的能量在交叉谱里公平竞争。
3.3 CWT用FFT快速实现:LabVIEW里的具体做法
CWT最直接的实现是对每个尺度做卷积,可是单尺度卷积就是O(NM)的计算量,17个尺度做下来,对长序列来说非常慢。我采用的是频域快速卷积,思路是:
W(a) = IFFT( FFT(x) * conj(FFT(ψ_a)) )
也就是说,对每个尺度,先构造该尺度下Morlet小波的频域采样,与信号频谱相乘,再做逆FFT。这样每个尺度的计算量降为O(N log N),17个尺度总共也能在秒级完成。
Morlet小波在频域里是一个高斯形状的带通滤波器:
ψ(ω) = π^(-1/4) * H(ω) * exp(-(ω - ω0)² / 2)
其中H(ω)是Heaviside阶跃函数,只保留正频率,ω0对应中心频率。这个频域表达式用LabVIEW实现非常方便,只需要构建一个频率数组,按公式填充复数数组,再调用FFT VI。
实际编码时要注意,LabVIEW的FFT VI默认会做归一化,你在一个尺度上算完再对下一个尺度做FFT时,不要反复归一化同一份信号;更稳的方案是只对信号做一次FFT,循环里对不同尺度的频率响应相乘,最后统一IFFT,能省大量重复计算。
3.4 交叉谱、相干谱与相位差的计算
拿到两个通道的CWT结果 W_x 和 W_y 后,交叉小波谱就是一个复数矩阵:
C_xy = W_x * conj(W_y)
在LabVIEW里直接做复数乘法即可。这个矩阵的幅值就是交叉小波能量,相位角用 atan2(虚部, 实部) 计算,取值范围是[-π, π]。
这里我提一个实用的可视化建议:交叉小波能量图适合用对数色标来显示,因为能量分布往往跨越好几个数量级,线性色标会让低频弱能量区域看不见。相干谱R²本身是0到1的数值,用线性色标就行,一般我会把阈值设在0.5以上才认为有实际意义,低于0.5的区域默认显示为蓝色。
相位差的绘制是工程上比较讨巧的部分。在时频图上,用箭头表示相位差:箭头指向右侧表示两个信号同相位,指向左侧表示反相位,指向上方表示信号1领先信号2 90度,指向下方表示滞后90度。这个表示法在文献里很流行,LabVIEW实现时只需把相位角转换成箭头的二维向量,再叠加在相干谱色图上。
3.5 显著性检验:把置信区间做进LabVIEW
小波相干谱算出来后,你会看到一片连绵的色块,但不代表所有色块都有统计意义。显著性检验是区分“真实相关”和“随机波动”的关卡。
最常用的检验方法是以一阶自回归(AR(1))红噪声为原假设,生成大量随机序列,计算它们的WTC,取95%分位数作为显著性水平。具体到LabVIEW实现,我建议不要实时跑Monte Carlo,太慢了。一次性预生成查找表:对固定的信号长度、采样率、尺度参数,预先算好每个尺度下95%显著性阈值,保存成数组或文件,运行时直接读取插值。只有在样本参数变化时才重新生成。
AR(1)系数的估计我采用的是简化公式:α = (r1 + sqrt(r2)) / 2,其中 r1 和 r2 分别是滞后1和滞后2的自相关系数。这个公式比单纯用lag-1系数更稳定,抗噪能力更好。有了α,就可以生成红噪声序列,再做同样参数的CWT和WTC统计阈值。
在实际项目中,我把显著性检验做成了可选开关。探索性分析阶段可以关掉,快速看形状;写报告或出结论时必须打开,否则审稿人或领导一眼就能看出你给的是未经检验的原始谱。
3.6 绘图与输出:让结果能直接放进报告
LabVIEW的绘图控件本身可以做简单的强度图和XY图,但小波相干图通常需要三个维度:横轴时间、纵轴频率、颜色表示相干值,再加箭头表示相位。纯粹用原生图表控件做这种图很丑也很费劲。
我的做法是调用Python节点(LabVIEW 2021以上版本支持)或MATLAB Script节点来画图,把相干矩阵、时间轴、频率轴、相位矩阵传过去,用Python的matplotlib一次性生成Publication Quality的图,输出PNG返回到LabVIEW前面板。这种混合架构既保留了LabVIEW的采集控制能力,又补足了绘图短板。
图表输出层面,我会固定输出三张图:CWT能量图(可以作为中间检查用)、XWT交叉能量图、WTC相干谱叠加显著性等值线和相位箭头。三张图放一起,基本就是一篇分析报告的核心内容。
4. 常见问题与排查技巧实录
4.1 边界效应:影响锥到底是什么
小波变换在数据两端尤其不可靠,因为小波窗在边界处没有足够的数据支撑。这个受影响区域就是“影响锥”(Cone of Influence,COI)。尺度越大,影响范围越宽。我在实际项目中统计过,一个10000点的序列,低频端(大尺度)的有效区域可能只有中间一半,两端全是边界伪影。
处理办法不是删除数据,而是在绘图时把COI区域用半透明覆盖,让读者知道这部分结果不可信。LabVIEW里可以通过调整图片的透明度或叠加白色斜线区域来实现。COI的具体宽度,我通常采用“指数衰减到e倍”的准则,即每个尺度上边界影响范围与该尺度成正比,具体比例系数在代码里做可配置项,默认值用Morlet小波的e-folding时间。
如果你发现某些低频相关性恰好落在COI内,别急着下结论。要么延长采集时间,要么降低低频分析范围,把有效信号拉回到可信区域内。
4.2 尺度步长δj与档位数怎么选
选多少档、δj取多少,本质是在计算量、频率分辨率和稳定性之间做平衡。我试过不同组合,直观经验如下:
δj=0.25时,速度最快,每个倍频程4个点,但窄带信号的相关峰可能被漏掉;δj=0.125时,每个倍频程8个点,频率细节明显改善,是绝大多数情况下的推荐值;δj=0.0625时,结果更细腻,但计算量翻倍,而且尺度方向平滑窗如果没跟着调,反而会出现过度冗余的假峰。
16档在δj=0.125下大约覆盖2个倍频程,适合频带范围不宽、关注中高频段的场景。如果信号频带跨了3个数量级(比如从0.01Hz到10Hz),16档就不够,至少需要24档以上。我的建议是不固定档位,把档位数做成参数,根据实际频率输出范围自动计算。
4.3 相干值虚高怎么排查
我刚开始写wtc-r16时,发现输出的R²谱简直像碎玻璃一样到处是尖峰,而且很多非相关区域相干值高达0.9以上。后来定位到原因:平滑窗太大或者太小都不行。平滑不足时,R²趋近于1;平滑过大时,分辨率丢失,相关性被抹平。
典型的排查顺序是这样:先检查时间方向平滑窗宽度,我一般设为当前尺度对应周期的3到6倍;再检查尺度方向平滑窗,它应该与母小波在尺度域的宽度相关,常规取小波函数在尺度域的标准差;最后用一对纯随机序列跑一遍流程,如果随机序列的相干谱上还能看到大片高相干区域,说明平滑参数或显著性检验参数有问题。
这个方法我一直当作模块自检步骤:每次改代码后,先喂一组白噪声数据,确认95%以上的区域相干值低于显著性阈值,再进行真实数据分析。
4.4 计算性能与内存优化
LabVIEW在处理大数据量时有一些实际工程经验。一是尽量避免在For循环里连续做FFT并自动索引输出二维数组,因为自动索引会在内存里反复复制数组。更高效的做法是预先分配二维复数数组,循环里用In Place Element结构直接写入。
二是Monte Carlo检验千万别在界面上实时跑。我把预生成的显著阈值文件存成二进制数组,运行时加载,计算时间从分钟级降到毫秒级。
三是如果数据长度超过几十万点,小波计算仍然吃力。一个务实做法是分段分析,但分段会损失低频信息。对低频关切度不高的场合,可以先做合理降采样,保留目标最高频率的2到3倍作为新的采样率,既减体量又不损失有效信息。
5. 工具选型与扩展思路:不只是LabVIEW
5.1 LabVIEW、MATLAB、Python做小波相干怎么选
不少朋友会问,既然交叉小波分析这么多细节,为什么不用现成的工具?我的看法是,不同场景有不同最优解。下面这个对比表是我根据自己的使用体验整理的:
| 对比维度 | LabVIEW | MATLAB | Python |
|---|---|---|---|
| 现成小波相干函数 | 几乎没有,需自建 | 第三方工具箱(如Grinsted) | PyCWT库可用 |
| 数据采集实时性 | 最强 | 弱 | 弱 |
| 开发速度 | 中等偏慢 | 快 | 快 |
| 绘图质量 | 一般,需外挂 | 好 | 极好 |
| 部署与界面 | 方便,可打包独立应用 | 一般 | 较灵活 |
| 适用阶段 | 在线监测、集采系统 | 离线科研分析 | 离线科研、服务化 |
如果你要做的是科研论文级别的离线分析,我推荐Python的PyCWT库,参数调整灵活,画图效果可以直接投稿;如果你要搭的是工业在线监测系统,信号采集、实时报警和界面展示都在LabVIEW里,那就是wtc-r16这类自定义LabVIEW模块的用武之地。两者并不冲突,甚至可以结合:LabVIEW负责数据采集和预处理,把信号导出给Python分析,再把结果存回来显示。
5.2 从双通道到多通道小波相干矩阵
wtc-r16目前是双通道分析,但项目后期我发现多通道场景很常见,比如3轴振动信号两两之间的相干关系。扩展思路是构建小波相干矩阵:每个时间-频率点上都有一组两两通道的相干值,分析时先看整体平均相干强度,再针对强相干时段做详细分析。
这种多维扩展的代价是计算量成指数增长,可视化也更难。我目前的处理方式是先降维:计算一个参考通道,其他通道分别与参考通道做WTC,输出成一个多通道相干曲线合集。如果需要分析通道间的净相互作用关系,再考虑偏相干方法,但那是更深一层的方法论了。
5.3 相位分析在工程诊断中的实际价值
相干谱只告诉你有关系和关系强度,相位差则告诉你关系的方向。我在轴承故障诊断项目中就充分利用了这个信息:当振动信号与电流信号的WTC相干值高且相位差稳定在90度左右时,往往对应机电耦合的故障模式;相位差随时间翻转,则提示可能有松动或间隙变化。
这类结论如果只看时域波形或者普通相关,几乎无法得到。这也是交叉小波分析真正值钱的地方:它让“相关性”从单一数值升级成了可定位、可解释、可追踪的时频图谱,你可以在图上清晰指认“这段相关是从哪一天开始的、持续了多久、在哪个频段上发生”。
6. 结合个人经验的最后提醒
写到这里,wtc-r16这套模块的核心设计思路和实操细节基本都过了一遍。最后说几点我个人的体会。
第一,小波分析的参数设置没有一劳永逸的组合。采样率不同、信号特征不同、分析目的不同,尺度和平滑参数都应该跟着调。最好的做法是模块支持参数扫描,先把几个关键参数粗扫一遍,观察结果的稳定性,再确定最终设置。
第二,交叉小波的输出图信息量很大,非常容易被过度解读。我给自己定了一条规矩:任何高相干区域,必须同时满足三个条件才写入结论——相干值超过显著性阈值、落在COI有效区域内、相位方向连续稳定而非杂乱无章。三条缺一不可。这能挡掉很多假阳性结论。
第三,如果只是临时分析一次数据,别在LabVIEW里从头造轮子。用Python的PyCWT跑一遍分分钟出图。但如果你要的是可以反复使用、能嵌入自动化流程、能实时响应新数据的工具,那么花一两个星期在LabVIEW里搭一套类似wtc-r16的小波相干分析模块,是值得的。这套模块后来被我用在三个不同项目里,只改参数不改代码,性价比很高。
最后再分享一个小技巧:无论用哪套工具,先拿一对已知关系的仿真信号测试整套流程。比如生成一个包含公共周期成分、且带固定相位差的两路信号,分析结果应当能在预期的时频位置看到高相干区和恒定相位箭头。通过这个测试,你对你的参数设置和代码实现就会非常有底。这比直接分析真实信号后再花费大量时间排查问题要高效得多。
本文还有配套的精品资源,点击获取