基于 Syslab 的电机振动频谱分析教学案例
可以直接用于课堂演示、上机实验或课程作业
案例自带数据生成脚本,无需额外准备真实电机振动数据
学生可以通过修改转速、故障幅值、噪声水平和采样频率观察频谱变化
可结合 MWORKS AI 辅助理解代码、修改参数和生成实验结论
一、案例简介
本案例以三相异步电机为对象,模拟电机在不同运行状态下的振动信号,通过时域分析和 FFT 频谱分析,帮助学生理解以下核心概念:
- 时域信号与频域信号的转换(傅里叶变换)
- 转频、倍频的概念及其物理意义
- 不同机械故障对应的频谱特征
- 基于频谱的旋转机械故障诊断基本方法
案例通过模拟数据生成、时域分析、FFT 频谱分析、故障特征识别等步骤,完整覆盖"信号采集→信号处理→特征提取→故障诊断"的教学链路。
二、适用课程
| 课程名称 | 对应内容 |
|---|---|
| 信号与系统 | 傅里叶变换、频谱分析 |
| 数字信号处理 | FFT、采样定理、谱分析 |
| 测试技术 | 振动信号采集与处理 |
| 机械故障诊断 | 旋转机械故障特征提取 |
| 智能制造 | 设备状态监测与预测性维护 |
| 工业大数据入门 | 信号特征提取与数据驱动诊断 |
三、适用专业
- 机械工程 / 机械设计制造及其自动化
- 车辆工程 / 汽车工程
- 自动化 / 电气工程及其自动化
- 测控技术与仪器
- 智能制造工程
- 工业工程
四、建议课时
- 课堂讲解:1 课时(45 分钟),讲解振动频谱分析原理
- 上机实验:1-2 课时(45-90 分钟),运行脚本并完成实验任务
- 课后拓展:学生自主完成,约 2-4 小时
五、学生基础要求
- 了解正弦信号和基本数学概念
- 了解微分/积分、复数(傅里叶变换基础)
- 有基础的编程能力(推荐 Julia/MATLAB/Python 中任一种)
- 对旋转机械(如电机、泵)有基本认识
六、教学目标
通过本案例,学生应能够:
- 理解 时域与频域的基本关系和傅里叶变换的物理意义
- 掌握 FFT 频谱分析的基本方法和参数设置
- 识别 转频、倍频、故障特征频率等概念
- 解释 不同电机故障(不平衡、不对中、松动、轴承故障)的频谱特征
- 应用 频谱分析进行旋转机械故障诊断的基本方法
- 操作 Syslab 进行信号生成、分析、可视化的完整流程
七、案例原理
7.1 电机振动基本概念
电机运行时,转子在轴承支撑下旋转。当电机处于理想状态时,振动信号平稳且幅值较低。当出现机械故障时,振动信号的频率成分会发生变化。
7.2 转频与倍频
- 转频 (fr):转子每秒钟的旋转次数,单位 Hz
- fr = 转速 (rpm) / 60
- 本案例:1800 rpm → fr = 30 Hz
- 1X:1 倍转频 = 30 Hz,基频振动
- 2X:2 倍转频 = 60 Hz
- NX:N 倍转频
7.3 傅里叶变换 (FFT)
傅里叶变换将时域信号转换为频域信号,揭示信号中不同频率成分的幅值分布。幅值谱的横轴为频率,纵轴为该频率对应的振动大小。
时域信号 x(t) —→ FFT —→ 频域信号 X(f) —→ 幅值谱 |X(f)|
7.4 常见故障的频谱特征
| 故障类型 | 频谱特征 | 物理原因 |
|---|---|---|
| 正常状态 | 1X 成分较弱,无明显倍频 | 转子平衡、对中良好、连接紧固 |
| 转子不平衡 | 1X 明显增强 | 质量不平衡产生每转一次的离心力 |
| 轴不对中 | 2X 明显增强 | 联轴器每转经历两次最大应力 |
| 机械松动 | 多个倍频增强 (1X, 2X, 3X, 4X) | 非线性刚度导致多谐波响应 |
| 轴承故障 | 高频冲击,特征频率增强 | 滚动体经过缺陷位置产生冲击 |
八、快速开始
8.1 环境要求
- Syslab 2024b 或更高版本
- 需要安装的 Julia 包:
FFTW,DataFrames,CSV
在 Syslab 中运行以下命令安装依赖:
import Pkg
Pkg.add(["FFTW", "DataFrames", "CSV"])
8.2 运行步骤
在 Syslab 中按顺序运行以下脚本:
# 第 1 步:生成模拟振动数据
include("src/01_generate_vibration_data.jl")
# 第 2 步:时域分析
include("src/02_time_domain_analysis.jl")
# 第 3 步:FFT 频谱分析
include("src/03_fft_spectrum_analysis.jl")
# 第 4 步:故障特征分析
include("src/04_fault_feature_analysis.jl")
# 第 5 步:可视化结果汇总
include("src/05_visualize_result.jl")
注意:脚本使用
@__DIR__确定相对路径,需在src/目录下运行或以include()方式加载。
8.3 运行时间
- 完整运行 5 个脚本约需 1-3 分钟
- 主要耗时在 FFT 计算和图像生成
九、文件结构
motor_vibration_spectrum_analysis/
├── README.md # 本文件
├── data/ # 数据目录(脚本自动生成)
│ ├── motor_vibration_data.csv # 振动信号数据
│ ├── fault_peak_table.csv # 故障峰值表
│ ├── time_domain_features.csv # 时域特征表
│ └── analysis_report.txt # 分析报告
├── src/ # 源代码目录
│ ├── 01_generate_vibration_data.jl # 数据生成
│ ├── 02_time_domain_analysis.jl # 时域分析
│ ├── 03_fft_spectrum_analysis.jl # FFT 频谱分析
│ ├── 04_fault_feature_analysis.jl # 故障特征分析
│ └── 05_visualize_result.jl # 可视化汇总
├── figures/ # 结果图目录(脚本自动生成)
│ ├── time_waveform_compare.png # 时域波形对比
│ ├── spectrum_compare.png # 频谱对比
│ ├── spectrum_individual.png # 单图频谱
│ ├── order_spectrum.png # 阶次谱
│ ├── peak_marking_result.png # 主峰标注
│ └── fault_feature_summary.png # 故障特征总结
└── docs/ # 教学文档
├── 学生实验指导书.md # 学生用实验指导
└── 教师使用建议.md # 教师用教学建议
十、数据字段说明
motor_vibration_data.csv
| 字段 | 含义 | 单位 |
|---|---|---|
| time | 时间 | s |
| normal | 正常状态振动加速度 | m/s² |
| unbalance | 转子不平衡振动加速度 | m/s² |
| misalignment | 轴不对中振动加速度 | m/s² |
| looseness | 机械松动振动加速度 | m/s² |
| bearing_fault | 轴承早期故障振动加速度 | m/s² |
数据参数:
| 参数 | 值 |
|---|---|
| 采样频率 | 2000 Hz |
| 采样时长 | 5 s |
| 采样点数 | 10000 |
| 电机转速 | 1800 rpm |
| 转频 | 30 Hz |
十一、电机转频与倍频说明
11.1 转速与转频的关系
$$\text{转频 } f_r = \frac{\text{转速 (rpm)}}{60}$$
例如:1800 rpm → fr = 1800/60 = 30 Hz
11.2 倍频表
| 倍频 | 频率 (Hz) | 物理含义 |
|---|---|---|
| 0.5X | 15 | 半速涡动(油膜振荡等) |
| 1X | 30 | 基频 / 转频 (Rotor Speed) |
| 2X | 60 | 2 倍转频 (常见于不对中) |
| 3X | 90 | 3 倍转频 (叶片通过频率等) |
| 4X | 120 | 4 倍转频 |
| NX | N × 30 | N 倍转频 |
十二、FFT 频谱分析流程
原始时域信号
│
▼
┌─────────────┐
│ 去均值/加窗 │ ← 减小频谱泄漏
└──────┬──────┘
▼
┌─────────────┐
│ FFT 变换 │ ← 时域 → 频域
└──────┬──────┘
▼
┌─────────────┐
│ 单边幅值谱 │ ← 只保留正频率
└──────┬──────┘
▼
┌─────────────┐
│ 峰值识别 │ ← 找主频率成分
└──────┬──────┘
▼
┌─────────────┐
│ 倍频匹配分析 │ ← 与转频倍频对照
└──────┬──────┘
▼
┌─────────────┐
│ 故障诊断 │ ← 根据频谱特征判断
└─────────────┘
十三、各类故障的频谱特征解释
13.1 正常状态
- 频谱中 1X (30 Hz) 成分较弱(幅值约 0.15-0.30)
- 高频噪声较低
- 无明显的倍频峰
13.2 转子不平衡
- 1X (30 Hz) 幅值明显增大(1-2 倍于正常状态)
- 频谱主峰集中在 1X 位置
- 原理:转子质心偏离旋转中心,产生每转一次的周期性离心力
13.3 轴不对中
- 2X (60 Hz) 幅值明显增强
- 可能同时存在 1X 成分
- 原理:联轴器在每转一周经历两次最大变形(拉伸/压缩)
13.4 机械松动
- 频谱中出现多个倍频峰(1X, 2X, 3X, 4X 等)
- 各倍频幅值相对均衡
- 原理:松动导致系统刚度非线性,产生谐波响应
13.5 轴承早期故障
- 高频区域(>100 Hz)出现局部峰值
- 时域中存在小幅周期性冲击
- 原理:滚动体经过缺陷位置产生冲击,激励起高频振动
十四、运行结果说明
运行所有脚本后,将生成以下结果文件:
数据文件 (data/)
- motor_vibration_data.csv:5 类振动信号的完整时间序列数据
- fault_peak_table.csv:各工况在不同倍频位置 (1X-4X) 的幅值表
- time_domain_features.csv:各工况的时域统计特征
- analysis_report.txt:完整的频谱分析报告(含故障特征文字解释)
图像文件 (figures/)
- time_waveform_compare.png:5 类信号时域波形对比(0-0.5s 细节)
- spectrum_compare.png:5 类信号频谱叠加对比(0-300 Hz)
- spectrum_individual.png:各类信号单独频谱图(含倍频标注)
- order_spectrum.png:阶次谱(横轴为频率/转频,无单位)
- peak_marking_result.png:各类信号的主峰自动标注图
- fault_feature_summary.png:故障特征总结图(条形图+频谱叠加)
十五、教学使用建议
15.1 课堂演示方案
| 环节 | 时间 | 内容 |
|---|---|---|
| 案例背景讲解 | 10 min | 电机振动监测和常见故障类型 |
| FFT 原理讲解 | 15 min | 时域、频域、转频和倍频概念 |
| 代码运行演示 | 15 min | 运行数据生成和频谱分析脚本 |
| 参数修改实验 | 20 min | 修改转速、故障幅值、噪声水平 |
| 结果讨论 | 20 min | 分析不同故障对应的频谱特征 |
| 拓展任务 | 课后 | 增加新故障类型 |
详细内容见 docs/教师使用建议.md。
十六、学生实验任务
基础任务(课堂完成)
- 运行所有脚本,观察输出结果
- 记录各工况的 1X、2X、3X 幅值
- 对比正常状态与故障状态的频谱差异
- 完成思考题
进阶任务(课后完成)
- 将转速从 1800 rpm 改为 1500 rpm,观察倍频位置变化
- 增大噪声水平,观察峰值识别的准确性变化
- 将采样频率从 2000 Hz 改为 1000 Hz,观察频谱变化
- 尝试修改数据生成脚本,增加新的故障类型(如转子碰摩)
详细内容见 docs/学生实验指导书.md。
十七、MWORKS AI 辅助学习提示
学生可以通过以下提示词让 MWORKS AI 辅助学习:
理解代码
请解释 03_fft_spectrum_analysis.jl 中 FFT 频谱分析的实现逻辑。
请解释采样频率、采样点数和频率分辨率之间的关系。
修改参数
请将电机转速从 1800 rpm 改为 1500 rpm,并说明 1X、2X、3X 转频位置会发生什么变化。
请将噪声水平增大 3 倍,观察时域波形和频谱的变化。
扩展案例
请增加一种转子碰摩故障信号,并说明它可能在频谱中表现出哪些特征。
请将当前案例扩展为可以读取真实电机振动 CSV 数据的版本。
理论学习
为什么转子不平衡主要表现为 1X 转频增强,而轴不对中更容易出现 2X 成分?
FFT 的频谱泄漏是什么?如何通过加窗减少频谱泄漏?
实验报告
请根据频谱图结果,生成一段实验报告结论。
请帮我分析 fault_peak_table.csv 中的数据,总结不同故障的频谱特征。
十八、常见问题
Q1:运行脚本时提示 "FFTW not found"?
A:在 Syslab 中运行 import Pkg; Pkg.add("FFTW") 安装后重试。
Q2:如何查看更大的频率范围?
A:修改脚本中的 freq_limit 变量,例如从 300 改为 500。
Q3:能不能使用真实的电机振动数据?
A:可以。只需将真实数据按相同格式保存为 motor_vibration_data.csv,然后从脚本 02 开始运行。
Q4:图片中的中文显示为乱码?
A:请检查 Syslab 的系统字体设置,或尝试在脚本中指定中文字体。
Q5:如何修改电机转速?
A:修改脚本 01 中的 speed = 1800 变量,转频 fr 会自动重新计算。
Q6:为什么轴承故障频谱不如包络分析明显?
A:直接 FFT 对冲击类故障不够敏感。包络解调(Hilbert 变换 + 带通滤波 + FFT)是轴承故障诊断的进阶方法,已在本案例的拓展方向中提及。
十九、拓展方向
19.1 信号处理进阶
- 加窗函数(汉宁窗、汉明窗、布莱克曼窗)的对比实验
- 功率谱密度 (PSD) 分析
- 短时傅里叶变换 (STFT) 进行时频分析
- 小波变换分析非平稳信号
19.2 故障诊断进阶
- 包络解调分析轴承故障特征频率
- 倒频谱 (Cepstrum) 分析
- 阶比分析(适用于变转速工况)
- 多传感器数据融合
19.3 真实数据对接
- 读入真实电机振动 CSV 数据
- 添加数据预处理(去噪、去趋势)
- 与振动测试实验台的数据对接
19.4 算法开发
- 自动峰值提取算法优化
- 基于阈值的故障自动分类
- 机器学习方法(SVM/KNN/CNN)进行故障识别
附录
A. 推荐参考书目
- 《机械故障诊断学》- 钟秉林
- 《振动信号处理与分析》- 杨世锡
- 《数字信号处理——原理与实践》- 方勇
- 《旋转机械故障诊断技术》- 王济宇
B. 技术参数总览
| 参数 | 值 | 说明 |
|---|---|---|
| 采样频率 fs | 2000 Hz | 满足 Nyquist 采样定理 (> 2×最高频率) |
| 采样时长 | 5 s | 足够的分辨率 (Δf = 0.2 Hz) |
| 采样点数 N | 10000 | fs × duration |
| 频率分辨率 Δf | 0.2 Hz | fs / N |
| 电机转速 | 1800 rpm | 四极异步电机典型转速 |
| 转频 fr | 30 Hz | speed / 60 |
| 最大分析频率 | 300 Hz | 10X 倍频范围 |