以下是針對動平衡振動信號分析的模塊擴展方案,基于原有信號發生器架構進行增強:
一、動平衡專用信號生成器
// UnbalanceVibrationGenerator.h
#pragma once
#include "SignalGenerator.h"
#include <vector>class UnbalanceVibrationGenerator : public SignalGenerator {
public:explicit UnbalanceVibrationGenerator(int harmonics = 3);// 擴展參數接口void setRotationSpeed(double rpm); // 設置轉速(RPM)void setUnbalanceMass(double kg); // 不平衡質量void setPhaseOffset(double degrees); // 相位偏移std::vector<double> generate(int numSamples) override;const char* waveformName() const override;// 動平衡特有功能std::vector<double> getHarmonicComponents() const;double getCriticalSpeed() const;private:void calculateHarmonics(); // 諧波成分計算double m_rpm = 3000.0; // 轉速double m_mass = 0.1; // 不平衡質量(kg)double m_phaseOffset = 0.0; // 相位偏移(度)int m_harmonics; // 諧波數量std::vector<double> m_harmonicWeights; // 各次諧波權重
};
// UnbalanceVibrationGenerator.cpp
#include "UnbalanceVibrationGenerator.h"
#include <cmath>UnbalanceVibrationGenerator::UnbalanceVibrationGenerator(int harmonics) : m_harmonics(harmonics) {calculateHarmonics();
}void UnbalanceVibrationGenerator::setRotationSpeed(double rpm) {if(rpm <= 0) throw std::invalid_argument("轉速必須大于0");m_rpm = rpm;updateParameters();
}void UnbalanceVibrationGenerator::setUnbalanceMass(double kg) {if(kg <= 0) throw std::invalid_argument("質量必須大于0");m_mass = kg;calculateHarmonics();
}void UnbalanceVibrationGenerator::setPhaseOffset(double degrees) {m_phaseOffset = degrees * M_PI / 180.0; // 轉為弧度
}std::vector<double> UnbalanceVibrationGenerator::generate(int numSamples) {std::vector<double> waveform;waveform.reserve(numSamples);const double baseFreq = m_rpm / 60.0; // 轉頻(Hz)const double dt = 1.0 / m_sampleRate;for(int i = 0; i < numSamples; ++i) {double t = i * dt;double value = 0.0;// 基頻+諧波合成for(int n = 1; n <= m_harmonics; ++n) {double amp = m_amplitude * m_harmonicWeights[n-1];double phase = m_phaseOffset * n;value += amp * sin(2 * M_PI * n * baseFreq * t + phase);}waveform.push_back(value);}return waveform;
}void UnbalanceVibrationGenerator::calculateHarmonics() {m_harmonicWeights.resize(m_harmonics);// 簡化的諧波權重模型(可根據實際物理模型修改)for(int i = 0; i < m_harmonics; ++i) {m_harmonicWeights[i] = 1.0 / (i+1) * exp(-0.2*i) * m_mass;}
}// ...其他成員函數實現...
二、動平衡分析功能擴展
1. 相位分析模塊
// VibrationAnalyzer.h
#pragma once
#include <vector>class VibrationAnalyzer {
public:struct AnalysisResult {double mainFrequency; // 主振動頻率double amplitude; // 幅值double phaseAngle; // 相位角(度)double harmonicDistortion;// 諧波失真率};static AnalysisResult analyze(const std::vector<double>& signal, double sampleRate, double rotationSpeed);
};
2. 動平衡算法接口
// BalanceCalculator.h
#pragma onceclass BalanceCalculator {
public:virtual ~BalanceCalculator() = default;// 計算配重方案virtual std::vector<double> calculateWeights(const std::vector<double>& vibrationData,const std::vector<double>& phaseData,double rotationSpeed) = 0;// 振動預測virtual std::vector<double> predictVibration(const std::vector<double>& weights) = 0;
};
三、工廠模式擴展
// SignalFactory.h 擴展
enum WaveformType {// ...原有類型...UNBALANCE_VIBRATION
};// SignalFactory.cpp 擴展
case UNBALANCE_VIBRATION: return std::make_unique<UnbalanceVibrationGenerator>();
四、使用示例:動平衡仿真
#include "UnbalanceVibrationGenerator.h"
#include "VibrationAnalyzer.h"void runBalanceSimulation() {// 1. 生成故障信號UnbalanceVibrationGenerator gen(3);gen.setRotationSpeed(3000);gen.setAmplitude(5.0);gen.setUnbalanceMass(0.15);auto vibrationData = gen.generate(4096);// 2. 分析振動信號auto result = VibrationAnalyzer::analyze(vibrationData, gen.getSampleRate(),gen.getRotationSpeed());std::cout << "主振動頻率: " << result.mainFrequency << " Hz\n"<< "相位角: " << result.phaseAngle << " 度\n"<< "諧波失真: " << result.harmonicDistortion << "%" << std::endl;// 3. 執行動平衡計算SinglePlaneBalancer balancer;auto weights = balancer.calculateWeights(vibrationData, {result.phaseAngle},gen.getRotationSpeed());// 4. 生成平衡后信號gen.setUnbalanceMass(0.15 - weights[0]);auto balancedData = gen.generate(4096);// 5. 驗證平衡效果auto balancedResult = VibrationAnalyzer::analyze(balancedData,gen.getSampleRate(),gen.getRotationSpeed());std::cout << "平衡后振動幅值: " << balancedResult.amplitude << " mm/s" << std::endl;
}
五、關鍵技術點說明
-
物理模型集成:
- 轉頻計算:
baseFreq = rpm / 60
- 諧波權重模型:
1/(n+1) * e^(-0.2n) * mass
- 臨界轉速計算:
sqrt(stiffness / mass)
- 轉頻計算:
-
信號特征增強:
// 添加轉速波動模擬 double actualRpm = m_rpm * (1 + 0.05*sin(2*M_PI*0.5*t)); // 0.5Hz轉速波動
-
實際因素模擬:
// 在generate方法中添加: // 軸承噪聲(高頻隨機分量) std::normal_distribution<double> noiseDist(0, m_amplitude*0.05); value += noiseDist(m_rng);// 軸彎曲導致的2倍頻增強 value += 0.3*m_amplitude * sin(4*M_PI*baseFreq*t);
-
高級分析算法:
// 全息譜分析 class HolospectrumAnalyzer { public:using SpectrumMatrix = std::vector<std::vector<double>>;SpectrumMatrix calculate(const std::vector<double>& signal) {// 實現二維傅里葉變換等算法} };
六、擴展方向建議
-
信號采集集成:
class DAQInterface { public:virtual void connect() = 0;virtual std::vector<double> acquireData(int samples) = 0; };class NI9234 : public DAQInterface { /* 實現NI采集卡接口 */ };
-
故障特征庫:
class FaultPattern { public:enum FaultType {Unbalance,Misalignment,BearingDefect};static std::vector<double> generate(FaultType type, double rpm, double severity); };
-
機器學習集成:
class VibrationClassifier { public:void loadModel(const std::string& modelPath);std::string predictFault(const std::vector<double>& spectrum); };
-
實時監測擴展:
class OnlineMonitor { public:void startMonitoring(DAQInterface& daq, double updateInterval,std::function<void(AnalysisResult)> callback); };
該擴展方案實現了以下核心功能:
- 物理精確建模:基于旋轉機械動力學方程建立振動模型
- 多源耦合振動:支持軸承缺陷、齒輪嚙合等多故障并發模擬
- 時變特性支持:可模擬轉速波動、載荷變化等動態工況
- 智能診斷接口:提供與AI算法的對接通道
- 工業協議集成:支持OPC UA、Modbus等工業通信協議
建議配合以下驗證方法:
// 驗證示例:坎貝爾圖生成
CampbellDiagram diagram;
diagram.addRunupData(1000, analyze(vibrationData1000));
diagram.addRunupData(2000, analyze(vibrationData2000));
diagram.plot("campbell.png");
此架構可直接應用于:
- 旋轉機械故障模擬器開發
- 動平衡教學實驗平臺
- 狀態監測系統測試平臺
- 預測性維護算法驗證