十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

地震频谱分析实战:基于MATLAB的FFT实现与避坑指南

地震频谱分析实战:基于MATLAB的FFT实现与避坑指南 简介本资源是一套面向地震学研究者与地球物理方向初学者的MATLAB频谱分析实践工具包聚焦快速傅里叶变换FFT在地震波形处理中的核心应用解决地震时间序列到频率域转换、频谱可视化及特征识别等关键问题。压缩包共含4个文件2个.asv备份脚本、1个.m主程序、1个.fig图形结果总大小仅11KB轻量实用其中.m文件实现完整流程地震数据读取、采样率估算、FFT计算、正频率截取、幅度谱绘制.asv文件保留调试过程便于理解代码演进逻辑.fig直观呈现频谱分布。已有306人学习下载适合课程实验、科研入门或项目快速复现。用户可直接运行主程序获得可复用的地震频谱分析框架掌握P波/S波频段识别、采样率适配、幅度谱归一化等实操要点并基于现有结构拓展滤波、时频分析等进阶功能。 做地震数据处理这行绕不开频域分析。不管是天然地震的震相识别、工程地震的场地反应计算还是微震监测里的噪声压制FFT快速傅里叶变换都是用得最多的基础工具之一。很多人下载过各种以“FFT地震”命名的MATLAB脚本包但真正拿到手能跑通、跑对、跑出能解释的结果往往还要踩不少坑。这篇文章就围绕“地震频谱分析”这个主题结合MATLAB从原理到底层实现再把实操中容易翻车的地方逐条梳理一遍。先说说这篇文章是给谁看的。如果你是刚接触地震信号处理的本科生或研究生手里有一段地震波形但不知道怎么转成频谱这篇文章可以帮你把来龙去脉理顺如果你已经跑过一些现成脚本但发现出来的频谱形状怪异、幅值对不上、主频和预期不符那这篇文章的避坑部分应该能解决你大部分困惑。我会先在概念层面讲清楚为什么做频谱分析再带大家走一遍完整的MATLAB实现流程最后用一个实测风格的地震记录做案例拆解把所有参数和代码都摆出来。1. 地震频谱分析的核心思路与原理基础1.1 为什么要做地震频谱分析地震记录的原始形态是时间域上的振幅波形它记录了地面运动随时间的快慢变化。但时间域波形有一个天然的局限它只能告诉你“什么时刻震动了多大”很难直接回答“这次振动的能量集中在哪个频率范围”。而地震学里很多关键问题恰恰需要频率信息来回答。比如场地效应评估同一场地震建在软土上的建筑和建在基岩上的建筑破坏程度差异巨大本质就是因为软土对特定频段有放大作用而这个频段正是通过频谱分析才能确定。再比如震源参数反演地震矩、应力降、拐角频率这些物理量都是从位移谱的形态里提取的。还有结构健康监测里桥梁或高层建筑的自振频率是否发生了偏移也是通过对比环境振动记录傅里叶谱在不同时期的变化来判断的。一句话总结地震波形是“信号”频谱分析就是把信号从时间域投影到频率域让我们能看清这个信号里每个频率成分的能量大小。FFT不是地震学的专属工具但它是把地震信号“解剖”成频率成分最快速、最标准的手段这也是为什么MATLAB里几乎每个处理地震数据的工具箱都绕不开fft函数。1.2 FFT与DFT的关系为什么地震数据处理都用FFT傅里叶变换在教科书上的定义是连续积分但计算机只能处理离散的有限长序列所以实际使用的是离散傅里叶变换DFT。DFT的计算公式是X(k) Σ_{n0}^{N-1} x(n)·e^(-j·2π·kn/N)直接按这个公式算N个点需要N²次复数乘法当N是256点或512点还勉强能接受但当N是4096、8192甚至更大时计算量就非常恐怖了。FFT是Cooley和Tukey在1965年提出的快速算法它利用旋转因子的周期性和对称性把计算量从N²降到N·log₂N。当N8192时直接DFT大约需要6700万次乘法而FFT只需要约10万次差距是三个数量级。地震记录采样率通常是100Hz、200Hz甚至更高一段60秒的记录按200Hz采样就是12000个点不做FFT的话很多实时处理脚本根本跑不完。此外MATLAB的fft底层还做了大量的内存访问优化对于多通道数据比如三分量地震仪同时输出东西、南北、垂直三分量直接调用fft的矩阵运算能力比逐个通道循环快得多。1.3 采样定理、频率分辨率与奈奎斯特频率在动手写代码之前有三个概念必须刻在脑子里它们决定了频谱图的横轴范围和分析精度。第一个是奈奎斯特频率它是信号在数字域里能表示的极限频率等于采样率的一半。如果采样率是200Hz那奈奎斯特频率就是100Hz。任何超过奈奎斯特频率的成分都会被混叠到低频段伪造出虚假的“鬼影频率”。所以地震仪在采集前都会经过抗混叠滤波器这属于硬件层面的保障。第二个是频率分辨率它等于采样率除以FFT点数也就是Δf fs / N。这个公式非常关键它说明了时间和频率之间是“跷跷板”关系想要分辨出间隔只有0.01Hz的两个相邻频率峰就需要把FFT点数撑到fs/0.01那么大对应的时域信号长度也要够长。第三个是FFT点数与记录长度的关系。很多初学者以为FFT点数可以随意设置实际上如果你只是调用fft(x, N)N大于原始信号长度时MATLAB会自动补零小于时会自动截断这会带来两个后果补零可以提高频谱的“显示分辨率”让曲线更平滑但不会提高真实的“物理分辨率”两个靠得很近的频率峰仍然分辨不出来截断则会丢失有效信号严重时导致频谱严重畸变。后面我会专门讲这两者的区别和正确用法。2. 地震信号预处理FFT之前必须做的事2.1 去掉均值与线性趋势拿到一段原始的地震记录第一件事不是做FFT而是预处理。为什么因为FFT的数学本质是周期延拓它默认你截取的这段信号是周期性重复的。如果信号不满足这个假设频谱就会产生“泄漏”现象能量从一个频率扩散到附近的频率上导致主频模糊、旁边出现虚假的旁瓣。最常见的预处理操作是去均值。地震计输出的原始数据通常有一个直流偏置这个直流分量的频率是0Hz它的存在会让0Hz处出现一个巨大的尖峰把其他频段的幅度压得几乎看不见。用MATLAB的detrend函数可以同时完成去均值和去线性趋势% 去均值和线性趋势 x_detrend detrend(x, constant); % 只去均值 x_detrend detrend(x, linear); % 去均值去线性趋势到底是选constant还是linear对于几十秒长度的地震记录仪器响应漂移通常不明显用constant就够。但对于长周期地脉动记录或是对原始记录做了积分处理后线性趋势经常出现这时候要用linear。我自己的经验是如果不知道选哪个就两个都试试看频谱的形态哪个更干净、主峰更突出。2.2 滤波与限带处理地震信号的频带范围视震源类型和传播路径而定。远震体波的主频通常在0.01Hz到1Hz之间近震S波可能在1Hz到10Hz而工程微震或地脉动的频率范围可以到几十赫兹。在做FFT之前最好根据你的研究目的先做一个带通滤波把无关频段的干扰去掉。滤波要特别注意边界效应。MATLAB自带的filter函数是有延迟和边界震荡的处理地震数据时更推荐用filtfilt也就是零相移滤波。它会对信号做正向和反向两次滤波消除相位畸变但代价是计算量翻倍以及信号首尾各自有一小段被“抹平”。实操中为了减少这种边界效应可以先把信号延长一小段再滤波滤波后裁掉延长的部分。另一个细节是滤波顺序应该先滤波再去均值还是反过来严格来说应该先去均值再滤波。如果先滤波滤波器的瞬态响应会引入新的临时偏置而且有些高通滤波器设计不够好的话会把直流分量重新“振”出来。稳妥的操作顺序是原始数据 → 去均值/去趋势 → 带通滤波 → 重新去均值 → 再做FFT。2.3 数据截断与窗函数选择预处理做完之后还有一道工序加窗。前面提到FFT默认信号是周期的但实际截取的地震记录首尾几乎不可能完美衔接这就会造成频谱泄漏。加窗的作用就是让信号在两端平滑衰减到零强制“伪造”连续性。地震数据处理里最常用的窗函数是汉宁窗Hanning和汉明窗Hamming两者的主瓣宽度和旁瓣衰减略有差异。曾经有一次我在处理爆破振动信号时不加窗的时候主频怎么都稳定不下来换几种FFT参数结果都不一样。后来加了一个Hanning窗主频立刻稳定在某一个值附近和理论值完全吻合。加窗的本质就是用主瓣变宽一点点去换取旁瓣的大幅衰减这是一个性价比极高的取舍。但要注意加窗会改变信号的总能量因为窗函数在两端把信号乘了接近零的系数。如果要保持幅值谱的物理意义位移振幅、速度振幅等需要对FFT结果做幅值恢复也就是除以窗函数的均值。MATLAB里可以这样操作win hanning(N); x_win x(1:N) .* win; X fft(x_win); X X / mean(win); % 幅值恢复这个幅值恢复步骤很容易被忽略很多书上没有强调但如果有定量分析需求省掉这一步会导致振幅系统性偏低。3. MATLAB中地震FFT的具体实现与参数详解3.1 fft函数的基本调用与输出含义MATLAB的fft函数最基本的调用是X fft(x)但在地震数据处理中更规范的写法是X fft(x, NFFT);x是输入的时间序列NFFT是变换点数。这里有一个关键点需要理解fft的输出X是一个复数数组长度为NFFT。X(1)对应0Hz直流分量X(2)对应频率为fs/NFFT的成分X(3)对应频率为2·fs/NFFT的成分以此类推。在X的后半段保存的是负频率部分也就是X(NFFT/22)到X(NFFT)对应的是负频率到0-的频率。很多初学者直接plot(abs(X))最后画出来的频谱是双边谱横轴范围从0到fs而且后半段还是镜像的看起来非常奇怪。正确的做法是取前半段并把横轴换算成实际频率也就是% 单边谱处理 NFFT length(x); X fft(x, NFFT); X_single X(1:NFFT/21); X_amp abs(X_single) / NFFT; % 单边谱的幅值是双边谱的两倍直流分量除外 X_amp(2:end-1) X_amp(2:end-1) * 2; freq (0:NFFT/2) * fs / NFFT;这个“乘以2”的步骤是另一个高频翻车点。为什么单边谱要乘以2因为负频率部分虽然不画出来但它在物理上对应的能量是被解析到正频率这边的真实的正频率幅值应该等于正负频率贡献之和。如果不乘2幅值谱会恰好偏低一半而很多人做定量分析时发现振幅和原始记录对不上问题很可能就出在这里。3.2 幅值谱、功率谱与相位谱的取舍FFT的结果是复数从中可以提取出三种常用谱幅值谱Amplitude Spectrum就是复数模值除以NFFT它给出了信号在某个频率上的“振动幅度”有多大单位与原始信号一致。如果要关心的是地面运动峰值加速度或峰值速度就应该看幅值谱。功率谱密度Power Spectral Density, PSD则是幅值的平方除以频率分辨率单位是信号单位的平方/Hz。它的物理意义是能量的频率分布密度特别适合对比不同频带内的能量大小和信噪比。地震学里的场地放大效应、地脉动H/V谱比分析都使用PSD而不是幅值谱。相位谱给出了各频率成分的相位信息但在绝大多数地震频谱分析场景中不是首要关心对象因为地震波形受传播路径影响相位信息复杂且不易解释。只有在做反演或合成波形拟合时才会重点用相位。MATLAB里计算PSD有不止一种方法。最直接的是基于FFT的Welch方法使用pwelch函数[psd, f] pwelch(x, window, noverlap, nfft, fs);Welch方法的核心思想是把长信号切成多段分别做FFT后取平均。这样做的优点是方差小谱线平滑代价是频率分辨率变差因为每段变短了。我经常在环境地脉动测量中用它来判断微震信号中的卓越频率是否有时间漂移。实际建议在地震记录中如果信号本身比较平稳如地脉动、环境振动用pwelch效果好如果是一次性瞬态事件如天然地震或爆破振动用整段fft更合适。3.3 零填充、补零与FFT点数的进阶用法零填充是另一个常被误解的操作。很多人以为把fft点数设得很大比如原始数据只有2000点却设NFFT16384就能“提高分辨率”。严格来说这只能提高频谱的插值精度让曲线更平滑并不能把两个真实间隔为0.5Hz的频率峰区分开。真正做到区分两个频率峰需要的是更长的真实数据记录而不是补零。举个例子就明白了假设你有10秒的记录采样率100Hz那么实际可分辨的频率间隔是0.1Hz即1/10秒。如果你补零让FFT点数变成8192横轴上的间隔变小了看起来“分辨率”提高了但物理上两个相差0.05Hz的正弦波仍然无法被区分它们在补零后的频谱里只会显示为一个宽包络。这一点在论文写作中如果处理不当很容易被审稿人质疑。零填充推荐用法只有两种一是为了FFT计算效率把点数凑成2的幂次二是为了在频谱图上找到更精确的峰位置时做插值显示。实际代码可以这样做% 凑2的幂次 NFFT 2^nextpow2(length(x)); X fft(x, NFFT);nextpow2会返回满足2^n 长度L的最小n这能让FFT计算速度达到最快但并不是所有的NFFT都必须是2的幂。MATLAB的fft在点数包含较大质数因子时速度会变慢但包含小质数因子2、3、5、7时速度仍然非常快所以2的幂只是为了省时间不是硬性要求。3.4 完整的地震数据处理流程代码下面给出一段可以直接复制运行的标准流程。这段代码我一般在一个工程地震项目里会作为模块反复调用输入是原始地震波形输出是预处理后的时程和单边幅值谱。function [freq, amp_spectrum, t_clean, x_clean] seismic_fft_analysis(x_raw, fs) % 输入x_raw为原始地震加速度记录向量fs为采样率 % 输出freq为频率轴amp_spectrum为单边幅值谱t_clean为时间轴x_clean为预处理后的信号 % 1. 去除趋势与均值 x_raw detrend(x_raw(:), constant); % 2. 带通滤波这里以0.1Hz-40Hz为例按需修改 fl 0.1; fh 40; [b, a] butter(4, [fl/(fs/2), fh/(fs/2)], bandpass); x_filt filtfilt(b, a, x_raw); % 3. 加窗 N length(x_filt); win hanning(N); x_win x_filt .* win; % 4. FFT NFFT 2^nextpow2(N); X fft(x_win, NFFT); X X / mean(win); % 幅值恢复 % 5. 单边幅值谱 halfN NFFT/2 1; amp abs(X(1:halfN)) / N; amp(2:end-1) amp(2:end-1) * 2; freq (0:halfN-1) * fs / NFFT; % 6. 输出预处理后信号 x_clean x_filt; t_clean (0:N-1) / fs; % 7. 绘图 figure; subplot(2,1,1); plot(t_clean, x_clean); xlabel(时间 (s)); ylabel(幅值); title(预处理后的地震记录); subplot(2,1,2); plot(freq, amp); xlabel(频率 (Hz)); ylabel(幅值); title(单边幅值谱); xlim([0, 50]); end这个函数充分考虑了前面所有的细节去趋势、零相移滤波、Hanning窗、幅值恢复、单边谱乘2、2的幂点数优化。直接调用即可基本不会出错。要注意的是butter滤波器阶数4只是默认具体阶数需要根据频带和衰减需求调整后面避坑部分会展开讲。4. 实操案例用合成地震记录验证FFT流程4.1 构造已知频谱特征的合成信号为了检验代码的正确性最有说服力的办法是用一个“已知答案”的信号来测试。假设我们模拟一段地震记录其中包含三个主要频率成分4Hz、10Hz和25Hz幅度分别为2.0、1.0和0.5采样率200Hz时长30秒。同时加入白噪声模拟环境干扰fs 200; t 0:1/fs:30-1/fs; N length(t); % 合成信号 f1 4; A1 2.0; f2 10; A2 1.0; f3 25; A3 0.5; x A1*sin(2*pi*f1*t) A2*sin(2*pi*f2*t) A3*sin(2*pi*f3*t); x x 0.2*randn(size(t)); % 加噪声理论上这个信号的频谱在4Hz、10Hz、25Hz处应该有明显的峰峰值约为2.0、1.0、0.5均方根振幅会略低因为噪声叠加后能量重新分配。如果我们的FFT流程处理正确这三个峰的幅值应当非常接近理论值。4.2 运行流程代码并解读结果把上面的x和fs代入seismic_fft_analysis函数观察输出的频谱图能得到三个清晰的峰。4Hz处幅值接近2.0510Hz处接近1.0325Hz处接近0.52与理论值之间的误差主要来自随机噪声的叠加。这说明整条处理链路的幅值标定是准确的。如果你不乘2三个峰的幅值会变成大约1.0、0.5、0.26一下子少了一半这就验证了前面说的单边谱乘2的步骤确实不能省。如果不做幅值恢复峰幅值也会系统性偏低Hanning窗的均值是0.5那么所有峰幅值都会打对折也是明显错误。4.3 用pwelch做功率谱密度估算对比如果改用pwelch验证[psd, f_psd] pwelch(x, hanning(512), 256, 1024, fs); plot(f_psd, psd);频率分辨率大约为fs/5120.39Hz三个频率峰照样能被看到但峰的宽度比直接用整段FFT更宽一些。这是welch分段平均导致的它的好处是谱线平滑适合观察宽频背景噪声但坏处是频率上的精细结构被抹平。所以对于研究尖峰明显的线谱整段FFT更合适对于连续谱、随机振动pwelch更稳。两者配合使用能互相验证结论的可靠性。5. 地震记录频谱分析中的常见问题与避坑指南5.1 频谱泄漏与窗函数的“治标不治本”频谱泄漏是FFT处理中最常见的问题。典型的症状是本来应该在某个频率上的一个尖峰变成了在它附近一坨小突起主峰两侧还附带振荡的旁瓣。泄漏的根源是截断。任何有限长信号在边界处都是突变的FFT把这个突变强行当成周期信号的一部分于是原本只有单一频率的正弦波突然多了许多高频成分来“拟合”这个突变。加窗能缓解边界突变但不同窗函数的抑制能力差异很大矩形窗泄漏最严重Hanning次之Blackman-Harris窗旁瓣衰减最干净但主瓣最宽。我一般遇到能量相差很大的两个信号源同时出现时会用Kaiser窗并把β值调大效果比固定窗好很多。但要说清楚窗是“治标”真正的“治本”是让截取窗口内的信号本身尽可能平稳。如果地震记录里含有明显的震相突变比如初至P波到达时振幅突然跳变那么在这个跳变点上必然会产生大量高频泄漏。正确做法是只选P波到达前的噪声段分析背景噪声或者只选S波之后的尾波段分析地脉动而不是把整段波形不分青红皂白直接做FFT。5.2 滤波阶数与filtfilt边界效应很多人看到butter函数随手填个阶数8或10觉得阶数越高滤波越“干净”。但实际上高阶Butterworth滤波器会带来严重的相位延迟和数值稳定性问题而且filtfilt一次处理下来边界效应会加倍。我曾经在处理一批强震记录时用了10阶带通结果信号前50个点和后50个点出现了明显的“飞边”频谱也出现高频震荡的假象排查半天才发现是滤波器阶数过高。根据我的经验带通滤波器阶数4~6足够应付绝大多数地震数据场景。如果滤波需求非常窄带比如提取0.2Hz~0.3Hz的窄带信号可以改用Chebyshev II型或Elliptic滤波器它们的通带波纹和阻带衰减特性更适合窄带提取但要注意群延迟会变得不均匀。实在没办法的时候也可以考虑用最小二乘拟合的时域滤波器计算速度慢但控制精度极高。另外filtfilt边界效应有一个实用对策在滤波前把信号两端各延拓一段例如每端加200个点延拓值取信号首尾的均值并用窗函数平滑过渡。滤波完成后裁剪掉延拓部分。这个做法能显著减少边界的瞬时振荡。5.3 采样率不一致导致谐波错位有时候你的地震记录不是自己采的而是从不同仪器上导出的。有的仪器采样率是100Hz有的可能是120Hz有的记录由于时钟漂移导致实际采样率偏离标称值。如果你把所有记录用同一个标称采样率代入FFT频谱的横轴就会整体偏移表现为同一个已知频率峰的“漂移”。排查方法很简单找一个记录中已知的稳定频率源比如50Hz交流电干扰或某个已知谐波信号做标定。如果你的频谱中50Hz峰显示成52Hz那就说明采样率实际偏高了4%反过来就要校正时间轴。多数现代的SAC或miniSEED格式文件头里都记录了采样率但转换过程中容易丢失或误写处理前养成检查head的快照习惯非常有用。MATLAB里可以用auftach或SAC相关工具读取头段确认采样率没有歧义。5.4 长记录分段处理与内存优化一台高采样率连续记录仪一天就会产生约1728万点数据假设200Hz24h。这么长的信号如果一次性做FFT不仅计算慢而且频率分辨率极高却毫无意义因为低频段的细微变化不需要全局分辨率倒是高频段的非平稳细节需要局部化处理。处理长记录的正确思路是分段。分段长度按照目标频段来决定如果只是分析0.5Hz以上的短周期振动用5~10秒一段做平均如果要分析0.01Hz量级的固体潮或长周期面波可能需要几十分钟甚至更长的一段数据才能获得足够分辨率。另一方面分段之间可以设置50%的重叠来减少段首段尾的影响这是Welch方法的标准配置。在MATLAB中处理大矩阵FFT时还有个容易忽略的性能杀手fft对列向量和矩阵的处理方式不同。如果X是一个N行多列的矩阵fft(X)会对每一列分别做FFT因此三分量数据可以直接拼成N×3矩阵一次性变换比循环三次快很多。内存占用方面N点FFT的中间复数数组约需要16×N字节一般几百兆以内的数据都不会有压力但如果是长记录多通道分析建议用single类型来减半内存精度损失对频谱分析来说完全可以接受。5.5 频谱图可视化中的比例尺与纵轴选择最后一个常见“坑”是画图方式误导解读。不少人在画地震频谱时直接用线性纵轴结果主频太高把低幅值的背景信息压成了一团“零线”有人用对数纵轴又过分放大噪声。正确做法是根据分析目的选择纵轴如果要突出能量集中的主频用线性纵轴合适如果要看全频带的衰减趋势最好用对数dB纵轴。另外如果不特别说明很多人画频谱图时纵轴是普通的1/Hz密度或原始幅值但科学论文里通常要求标注单位。比如加速度记录的PSD单位是(m/s²)²/Hz幅值谱单位是m/s²。我在自己的脚本中会把纵轴标签和单位直接内置避免后期返工。横轴也建议默认画到奈奎斯特频率但是要按需限制显示范围比如目标是看1~20Hz的工程频段就不要把0~100Hz整段画出来那样会浪费幅面而且看不清细节。6. 地震FFT分析的延伸应用与工具箱搭配6.1 从加速度记录计算反应谱时的FFT思路工程地震里经常需要从一条加速度时程计算阻尼反应谱。虽然反应谱的计算通常用Newmark-β法等时域方法或杜哈梅积分但FFT可以大幅加速弹性反应谱的计算尤其当结构自振周期非常多、数量达到几百个时时域循环会非常慢。快速解法是把加速度记录一次性变换到频域再用结构频响函数乘以地震波频谱最后做一次逆FFT得到结构位移、速度和加速度时程。这个过程本质上是频域求解线性振动方程比逐周期计算快了不止一个量级。如果对计算精度要求高需要注意微分算子在频域中表示为乘以jω而加速度到速度是除以jω零频处会出现奇异点必须先对频谱做低截处理去除长周期漂移。6.2 结合H/V谱比法评估场地卓越频率H/V谱比法是当前场地效应评估里很简单有效的工具核心思想是对同一时间段的地表三分量记录分别做FFT得到水平向和垂直向的傅里叶幅值谱然后计算水平向平均谱除以垂直向谱的比值。H/V谱中的峰值对应的频率通常就是场地的卓越频率。实现H/V谱比时FFT参数的选择非常重要。经验表明分析窗口长度至少应包含100个目标频率的周期否则分辨率不足。比如场地卓越频率如果是1Hz那么窗口至少40~100秒才合适。此外各段取的窗口长度要一致否则谱比会出现人为的“毛边”。可以用前面介绍的分段pwelch方法分别计算三个分量的PSD再开方转成幅值谱最后相除这样平滑效应比较好曲线也稳定。6.3 MATLAB工具箱的替代方案与效率对比MATLAB原生的Signal Processing Toolbox已经覆盖了绝大多数FFT相关需求不需要为了频谱分析特地去安装额外工具箱。如果确实需要更高级的分析比如短时傅里叶变换(STFT)、小波变换、希尔伯特黄变换(HHT)需要额外的Wavelet Toolbox或自己写代码。STFT是FFT的滑动窗口变体在时频图上可以看到不同时刻的频率变化对震相识别非常有帮助。MATLAB的spectrogram函数直接可用不用额外工具箱。如果项目数据规模特别大或者需要和地震学专业软件打通可以考虑用SACSeismic Analysis Code做前期预处理将预处理后的波形通过格式转换导出为MATLAB格式再做FFT分析。SAC在时间域文件头处理和滤波上有更高的自由度而MATLAB强在可视化和自定义迭代计算。两者结合是一种很顺手的组合拳我在处理一批连续波形微震数据时经常这么配合。6.4 逆FFT恢复信号时的注意事项FFT不只是从时间域到频域有时也要从频域回到时间域比如滤波操作本质上是频域乘以一个谱窗再逆变换回时域。MATLAB的ifft函数会把复数频谱恢复成时间序列。逆FFT的坑和正变换对应如果你修改了频谱比如把某个频段归零那重建的信号可能不再是实信号而是带有虚部的小量。这时应该用real(x_ifft)提取实部同时应该意识到对频谱做过零点切除之后时域信号两端会自动出现振铃这是因为滤波器在频率域的突变对应时域的sinc函数卷积。所以频域滤波的截止频率两端要尽量平滑过渡给一个过渡带振铃会小很多。我屡次在用频域方法去除地脉动记录中的机械噪声时发现平滑过渡带比生硬切除重要得多直接截断则会在波形上留下人眼可见的一系列共振式波纹。7. 后续还能往哪个方向扩展如果这段FFT地震频谱分析的流程你已经跑通了下一步可以考虑的方向很多。一是把批处理能力做起来比如面对上百条波形记录时用一个循环统一完成预处理和频谱提取并把结果输出成结构数组或表格。二是在频域里加入多通道交叉分析比如计算两个台站同一地震记录在频域内的相干性就能估计波速和衰减参数这是地震层析成像的前置步骤之一。三是从频域反演混合信号中的震源谱项和路径效应项这是开展震源物理研究的地基。我个人在实际操作中最想提醒大家的一句经验是FFT本身是一个数学工具算法层面几乎没有门槛真正的门槛全在预处理和参数选择上。同一个地震记录滤波参数不同、窗函数不同、FFT点数不同画出来的频谱差别会非常大甚至可能得出完全相反的结论。所以在整个频谱分析流程中最值得花时间的不是把fft代码跑通而是把你手里的信号“伺候”舒服让它能干净地进入FFT。当你发现自己的频谱图主频变得清晰、旁瓣消失、幅值符合物理直觉时这套流程才算真正过了关。如果哪天你遇到频谱形态怎么都解释不通的案例不妨回头看一眼我们上面聊过的每一个细节大概率问题就藏在你忽略的那一步里。希望这篇文章能帮你少走一些弯路早点把心念已久的地震频谱图做出来。本文还有配套的精品资源点击获取
返回列表