
1. 信号生成从正弦波到复合信号在MATLAB中生成信号是频谱分析的起点。我习惯先用简单的正弦信号练手因为它的频谱特性最直观。假设我们要生成一个频率为50Hz、振幅为2的正弦波采样率设为1000Hz根据奈奎斯特定理这能完整保留1000/2500Hz以内的频率成分fs 1000; % 采样频率(Hz) T 1/fs; % 采样间隔(s) t 0:T:1-T; % 1秒时间向量 f 50; % 信号频率(Hz) A 2; % 信号幅度 x A*sin(2*pi*f*t); % 生成正弦波实际工程中的信号往往更复杂。比如同时包含15Hz、40Hz和100Hz成分的复合信号x_composite 0.5*sin(2*pi*15*t) 1.2*sin(2*pi*40*t) 0.8*sin(2*pi*100*t);采样参数设置的坑我踩过不少有次分析振动信号时采样率设的太低导致高频成分出现混叠后来才明白采样率至少要是信号最高频率的2倍。现在我的经验法则是采样时长决定频率分辨率1/T采样率决定能分析的最高频率fs/2总采样点数影响计算效率最好取2的幂次2. FFT计算与频率轴构建MATLAB的fft函数使用非常简单但有几个关键细节需要注意N length(x_composite); % 信号长度 X fft(x_composite); % 计算FFT这里X是复数数组包含幅度和相位信息。新手最容易忽略的是频率轴的构建我早期就犯过直接plot(abs(X))的错误。正确的频率轴应该这样生成f_axis (0:N-1)*(fs/N); % 频率轴(Hz)为什么要这样计算因为第k个点对应的实际频率是k*fs/N。比如当N1000fs1000Hz时第0点0Hz直流分量第1点1Hz...第500点500Hz奈奎斯特频率第501点开始对应负频率3. 频谱可视化从双边谱到单边谱原始FFT结果是对称的双边谱实际分析通常只需要看单边谱P2 abs(X/N); % 双边谱幅度 P1 P2(1:N/21); % 取前半部分 P1(2:end-1) 2*P1(2:end-1); % 除直流和奈奎斯特点外都乘2 f_single fs*(0:(N/2))/N; % 单边谱频率轴 figure plot(f_single, P1) xlabel(频率(Hz)) ylabel(幅度) title(单边幅度谱)遇到过的一个典型问题有次频谱出现镜像泄漏原来是信号截断时没加窗。后来学会了加汉宁窗window hann(N); x_windowed x_composite .* window; X_windowed fft(x_windowed);4. 相位谱分析与应用幅度谱看得多但相位谱同样重要。提取相位信息phase angle(X(1:N/21)); % 取单边相位 figure plot(f_single, phase*180/pi) % 转为角度显示 xlabel(频率(Hz)) ylabel(相位(度))相位谱在故障诊断中特别有用。曾经通过比较正常和异常电机的相位变化提前发现了轴承磨损问题。实用技巧用unwrap函数解相位缠绕phase_unwrapped unwrap(phase);5. 频谱分析实战噪声信号处理真实信号总会有噪声。生成含噪声信号noise 0.5*randn(size(t)); % 高斯白噪声 x_noisy x_composite noise;用FFT分离信号和噪声X_noisy fft(x_noisy); P_noisy abs(X_noisy/N).^2; % 功率谱 % 滤波处理 threshold 0.3; % 功率阈值 X_filtered X_noisy .* (P_noisy threshold); x_filtered ifft(X_filtered); % 逆变换回时域经验分享噪声中的周期信号检测我常用这三步计算功率谱密度设置自适应阈值峰值检测找特征频率6. 频率分辨率与补零技巧频率分辨率Δffs/N。想要更高分辨率可以补零N_padded 2^nextpow2(N); % 扩展为2的幂次 X_padded fft(x_composite, N_padded); f_padded (0:N_padded-1)*(fs/N_padded);但要注意补零不能提高真实分辨率只是让频谱曲线更光滑。有次项目汇报差点出丑就是混淆了这两个概念。7. 实际案例机械振动分析最后分享一个真实案例。某风机振动信号分析load(vibration.mat); % 实测数据 fs 2000; % 采样率2kHz % 计算功率谱 N length(vib_signal); [Pxx,f] pwelch(vib_signal,hann(N/8),[],N,fs); % 找峰值频率 [pks,locs] findpeaks(Pxx,MinPeakHeight,0.1*max(Pxx)); f_peaks f(locs); % 诊断轴承故障特征频率计算 bearing_freq f_peaks(1)/60; % 转频(Hz) BPFO 3.1*bearing_freq; % 外圈故障频率这个分析帮助客户发现了早期轴承外圈裂纹避免了非计划停机。关键点用pwelch比直接FFT更稳定结合设备参数计算特征频率建立基线频谱作对比8. 性能优化与常见问题大点数FFT计算很耗时几个加速技巧% 预分配内存 X zeros(N,1); % 使用GPU加速 if gpuDeviceCount 0 x_gpu gpuArray(x); X_gpu fft(x_gpu); X gather(X_gpu); end % 多线程计算 maxNumCompThreads(automatic);踩过的坑频谱泄漏 → 加窗解决频率混叠 → 提高采样率栅栏效应 → 适当补零幅值失真 → 记得除以NFFT分析就像信号翻译官把时域波形转换成频域语言。掌握这些技巧后我现在能快速诊断出设备异常频率成分比传统听诊器方法效率高多了。建议新手从简单信号开始逐步增加复杂度多对比理论预期和实际结果慢慢就能培养出频谱直觉。