matlab频谱功率谱画图程序完整版 输入% data为待分析信号需要是一维实数也能处理数据信息波例如下图7-9绘制的导入数据的信号 感觉信号的横坐标单位可能不太正确需自行调整一下 后6张为示例 1、第4-6为示例输入叠加的信号情况及频谱图、功率谱图。 2、7-8为示例导入数据信号对应的信号图与功率谱图。江湖救急搞信号分析最头疼的就是频谱图总画不对尤其是实际工程中采集到的奇葩数据。今天咱们手把手折腾Matlab的频谱功率谱画图直接上硬菜——从仿真信号到真实数据处理包教包会matlab频谱功率谱画图程序完整版 输入% data为待分析信号需要是一维实数也能处理数据信息波例如下图7-9绘制的导入数据的信号 感觉信号的横坐标单位可能不太正确需自行调整一下 后6张为示例 1、第4-6为示例输入叠加的信号情况及频谱图、功率谱图。 2、7-8为示例导入数据信号对应的信号图与功率谱图。先来点人造信号热热身。假设咱要模拟吉他弦振动三个谐波叠加Fs 1000; % 采样率要记牢 t 0:1/Fs:1-1/Fs; % 时间轴生成有门道 f1 50; f2 120; f3 300; % 基频泛音 data 0.7*sin(2*pi*f1*t) sin(2*pi*f2*t) 0.3*sin(2*pi*f3*t);这段代码生成的信号就像三根不同粗细的吉他弦同时振动。画时域图时注意横坐标转换plot(t, data); xlabel(时间(s)); % 千万别用采样点数当坐标 title(人造信号时域图);频谱分析才是重头戏。FFT操作别蛮干记得给信号开个窗N length(data); window hann(N); % 汉宁窗比矩形窗靠谱 data_fft fft(data.*window);这里有个新手必踩的坑——频谱横坐标转换。正确姿势f Fs*(0:(N/2))/N; % 只看正频率部分 amplitude abs(data_fft/N); amplitude amplitude(1:N/21)*2; % 能量补偿 amplitude(1) amplitude(1)/2; % 直流分量特殊处理 plot(f, amplitude); xlabel(频率 (Hz)); ylabel(幅度); title(单边振幅谱);功率谱就更实用了。Matlab其实内置了pwelch函数但咱自己实现更明白[Pxx,f] pwelch(data, window, 0, N, Fs); plot(f, 10*log10(Pxx)); xlabel(频率 (Hz)); ylabel(功率谱密度 (dB/Hz)); title(Welch法功率谱估计);遇到真实数据时头更大。比如采集的振动信号存成了txt时间单位是毫秒raw_data load(vibration.txt); data raw_data(:,2); % 第二列是幅值 time raw_data(:,1)/1000; % 第一列转成秒 Fs 1/(time(2)-time(1)); % 自动计算采样率 % 检查采样是否均匀 if max(diff(time))-min(diff(time)) 1e-6 error(非均匀采样要重采样); end真实信号常有毛刺功率谱上会出现诡异尖峰。这时候可以加个滑动平均Pxx_smooth movmean(Pxx, 5); % 5点滑动平均 semilogy(f, Pxx_smooth); % 对数坐标更清晰 grid on;几个避坑指南补零能提高频谱分辨率是谣言补零只会让曲线更光滑窗函数选型要看场景——汉宁窗适合多数情况冲击信号用矩形窗功率谱纵坐标单位要看是PSD还是PS搞混了会被甲方怼最后放个大招批量处理数据时把这些代码封装成函数加上自动量程调整function plot_spectrum(data, Fs, unit) %...前面代码... xlim([0 Fs/2]); % 尼奎斯特频率截断 if exist(unit, var) xlabel([频率 ( unit )]); end end实战中采集的ECG信号频谱分析功率谱上60Hz工频干扰立马现形。这时候加个陷波滤波器效果立竿见影——不过那就是另一个故事了。频谱分析就像给信号做CT功率谱就是检查能量分布的X光片掌握这些技能分分钟定位信号中的病灶