一、系统架构设计
matlab
% 主程序流程
信号生成 --> 预处理 --> 功率谱分析 --> 包络解调 --> 特征提取 --> 故障诊断
二、核心代码实现
1. 轴承信号生成模块
matlab
function [s, params] = generate_bearing_signal(fs, duration, fault_type)
% 参数设置
f_r = 1797; % 转速(rpm)
Z = 9; % 滚动体数量
d = 0.3126e-3; % 滚动体直径(mm)
D = 1.537e-3; % 节径(mm)
alpha = 0; % 接触角(°)
% 理论故障频率计算
f_bpfi = f_r/60 * Z/2 * (1 + d/D*cosd(alpha)); % 内圈故障频率
f_bpfo = f_r/60 * Z/2 * (1 - d/D*cosd(alpha)); % 外圈故障频率
f_bsf = (D/(2*d)) * f_r/60 * (1 - (d/D*cosd(alpha))^2); % 滚动体故障频率
% 生成基础信号
t = 0:1/fs:duration-1/fs;
s = sin(2*pi*f_r/60*t); % 轴承旋转基频
% 添加故障特征
switch fault_type
case 'inner'
s = s + 0.5*sin(2*pi*f_bpfi*t);
case 'outer'
s = s + 0.5*sin(2*pi*f_bpfo*t);
case 'ball'
s = s + 0.5*sin(2*pi*f_bsf*t);
end
% 添加噪声
s = awgn(s, 20, 'measured');
params = struct('fs',fs, 'f_bpfi',f_bpfi, 'f_bpfo',f_bpfo, 'f_bsf',f_bsf);
end
2. 信号预处理模块
matlab
function clean_signal = preprocess(s, fs)
% 小波去噪(db4小波,4层分解)
wname = 'db4';
level = 4;
[c,l] = wavedec(s, level, wname);
thr = wdcbm2(c,l,'sqtwolog');
denoised = wdencmp('lvd',c,l,wname,thr,'s',0);
% 去除直流分量
clean_signal = denoised - mean(denoised);
% 归一化处理
clean_signal = (clean_signal - min(clean_signal)) / (max(clean_signal) - min(clean_signal));
end
3. 功率谱分析模块
matlab
function [Pxx,f] = power_spectrum(s, fs)
% 参数设置
nfft = 2^nextpow2(length(s));
window = hamming(1024);
noverlap = 512;
% 计算功率谱密度
[Pxx,f] = pwelch(s,window,noverlap,nfft,fs);
% 峰值检测
[peaks,locs] = findpeaks(Pxx);
[~,max_idx] = max(peaks);
dominant_freq = f(locs(max_idx));
end
4. Hilbert包络解调模块
matlab
function [env_spectrum] = envelope_spectrum(s, fs)
% Hilbert变换
y = hilbert(s);
envelope = abs(y);
% 包络谱分析
N = length(envelope);
P = fft(envelope);
env_spectrum = abs(P(1:N/2)).^2 / N;
f_env = (0:N/2-1)*fs/N;
end
5. 故障特征提取模块
matlab
function features = extract_features(s, fs)
% 时域特征
features.rms = rms(s);
features.peak = max(abs(s));
features.kurt = kurtosis(s);
% 频域特征
[Pxx,f] = power_spectrum(s,fs);
[~,idx] = max(Pxx);
features.dominant_freq = f(idx);
% 包络谱特征
env_spectrum = envelope_spectrum(s,fs);
[~,env_idx] = max(env_spectrum);
features.env_freq = f_env(env_idx);
end
三、完整仿真流程
matlab
%% 参数设置
fs = 12000; % 采样频率(Hz)
duration = 2; % 信号时长(s)
fault_type = 'outer'; % 故障类型:inner/outer/ball/normal
%% 信号生成与预处理
[s, params] = generate_bearing_signal(fs, duration, fault_type);
clean_signal = preprocess(s, fs);
%% 谱分析
[Pxx,f] = power_spectrum(clean_signal, fs);
[env_spectrum, f_env] = envelope_spectrum(clean_signal, fs);
%% 特征提取
features = extract_features(clean_signal, fs);
%% 可视化
figure;
subplot(3,1,1);
plot((0:length(clean_signal)-1)/fs, clean_signal);
title('预处理后信号时域波形');
xlabel('时间(s)'); ylabel('幅值');
subplot(3,1,2);
plot(f,10*log10(Pxx));
title('功率谱密度分析');
xlabel('频率(Hz)'); ylabel('功率谱密度(dB/Hz)');
xlim([0 5000]);
subplot(3,1,3);
plot(f_env, env_spectrum);
title('Hilbert包络谱分析');
xlabel('频率(Hz)'); ylabel('包络幅值');
xlim([0 5000]);
%% 结果验证
disp(['理论外圈频率: ', num2str(params.f_bpfo), ' Hz']);
disp(['检测到主频: ', num2str(features.dominant_freq), ' Hz']);
disp(['包络谱主频: ', num2str(features.env_freq), ' Hz']);
四、扩展应用
1. 故障分类器集成
matlab
% 使用SVM进行分类
load('bearing_dataset.mat'); % 加载预处理数据集
model = fitcsvm(X_train, y_train, 'KernelFunction', 'rbf', 'Standardize', true);
predicted = predict(model, X_test);
accuracy = sum(predicted == y_test)/length(y_test);
2. 实时监测系统
matlab
% 基于App Designer的实时监控界面
app = uifigure('Name', '轴承健康监测系统');
ax1 = uiaxes(app); plot(app, t, s); title('实时波形');
ax2 = uiaxes(app); plot(app, f, 10*log10(Pxx)); title('实时功率谱');
参考代码 滚动轴承信号的保罗谱分析 www.youwenfan.com/contentcss/59579.html
五、常见问题处理
-
频谱泄漏
- 解决方案:使用加窗(汉宁窗)和重叠处理
matlabwindow = hanning(2048); noverlap = 1024; [Pxx,f] = pwelch(s,window,noverlap); -
噪声干扰
- 解决方案:改进小波去噪参数
matlabthr = wdcbm2(c,l,'minimaxi'); % 改进阈值选择 -
特征频率偏移
- 解决方案:动态基频跟踪
matlabf_r = mean(peak_detect(s, fs, [10, 200])); // 自动检测基频
六、参考文献
- 3GPP TS 38.901 V17.0.0 (2023-06) - 5G NR; Radio propagation model
- 《轴承故障诊断技术》(机械工业出版社)
- IEEE Transactions on Industrial Electronics, "Deep Learning for Bearing Fault Diagnosis"