波形比对算法迁移成功

This commit is contained in:
2025-09-04 18:41:53 +08:00
parent 7c18d0038a
commit c414f1a42a
5 changed files with 23 additions and 22 deletions

View File

@@ -25,10 +25,10 @@ public class AnalysisServiceStreamTest {
private ICompareWaveService compareWaveServiceImpl; private ICompareWaveService compareWaveServiceImpl;
// 测试文件路径 - 请根据实际情况修改 // 测试文件路径 - 请根据实际情况修改
private static final String SOURCE_CFG_PATH = "F:\\hatch\\wavecompare\\wave\\PQMonitor_PQM1_000001_20200430_113404_845.cfg"; private static final String SOURCE_CFG_PATH = "C:\\Users\\hongawen\\Desktop\\Event\\192.168.1.239\\PQ_PQLD1_000251_20250904_145126_769.cfg";
private static final String SOURCE_DAT_PATH = "F:\\hatch\\wavecompare\\wave\\PQMonitor_PQM1_000001_20200430_113404_845.dat"; private static final String SOURCE_DAT_PATH = "C:\\Users\\hongawen\\Desktop\\Event\\192.168.1.239\\PQ_PQLD1_000251_20250904_145126_769.dat";
private static final String TARGET_CFG_PATH = "F:\\hatch\\wavecompare\\wave\\PQMonitor_PQM1_000001_20200430_113407_075.cfg"; private static final String TARGET_CFG_PATH = "C:\\Users\\hongawen\\Desktop\\Event\\192.168.1.238\\PQ_PQLD2_000099_20250904_145126_750.cfg";
private static final String TARGET_DAT_PATH = "F:\\hatch\\wavecompare\\wave\\PQMonitor_PQM1_000001_20200430_113407_075.dat"; private static final String TARGET_DAT_PATH = "C:\\Users\\hongawen\\Desktop\\Event\\192.168.1.238\\PQ_PQLD2_000099_20250904_145126_750.dat";
// 输出路径 // 输出路径
private static final String OUTPUT_PATH = "./test-output/"; private static final String OUTPUT_PATH = "./test-output/";

View File

@@ -296,7 +296,7 @@ public class WaveformAligner {
* 计算可进行计算的200ms窗口数量 * 计算可进行计算的200ms窗口数量
* 每个窗口需要10个周波的数据用于电能质量分析 * 每个窗口需要10个周波的数据用于电能质量分析
*/ */
int windowSamples = (int) (data1.getSmpRate() * 10); int windowSamples = (int) (data1.getFactSmpRate() * 10);
int availableWindows1 = (data1.getSmpNum() - startCalPos1) / windowSamples; int availableWindows1 = (data1.getSmpNum() - startCalPos1) / windowSamples;
int availableWindows2 = (data2.getSmpNum() - startCalPos2) / windowSamples; int availableWindows2 = (data2.getSmpNum() - startCalPos2) / windowSamples;
int maxWindows = Math.min(availableWindows1, availableWindows2); int maxWindows = Math.min(availableWindows1, availableWindows2);
@@ -344,7 +344,7 @@ public class WaveformAligner {
* 寻找从负值到正值的过零点 * 寻找从负值到正值的过零点
* 注意:使用严格不等号(< 和 >避免0值影响判断 * 注意:使用严格不等号(< 和 >避免0值影响判断
*/ */
if (voltageData[i] < 0 && voltageData[i + 1] > 0) { if (voltageData[i] <= 0 && voltageData[i + 1] >= 0) {
// 返回过零点后的第一个正值位置 // 返回过零点后的第一个正值位置
return i + 1; return i + 1;
} }

View File

@@ -93,7 +93,7 @@ public class ComtradeReader {
lineFreq = 50.0f; lineFreq = 50.0f;
} }
float samplesPerCycle = (float)cfgInfo.getSampleRate() / lineFreq; float samplesPerCycle = (float)cfgInfo.getSampleRate() / lineFreq;
dataBuf.setFactSmpRate(samplesPerCycle);
// 验证采样率限制要求 // 验证采样率限制要求
if (samplesPerCycle < 128) { if (samplesPerCycle < 128) {
log.error("采样率过低:每周波采样点数={}最小要求128", samplesPerCycle); log.error("采样率过低:每周波采样点数={}最小要求128", samplesPerCycle);

View File

@@ -42,8 +42,11 @@ public class DataPq {
/** 实际采样点数 */ /** 实际采样点数 */
private int smpNum; private int smpNum;
/** 实际采样率 */
private float factSmpRate;
/** 采样率 (Hz) */ /** 改良后的采样率 */
private float smpRate; private float smpRate;
/** 系统频率 (Hz) */ /** 系统频率 (Hz) */

View File

@@ -19,7 +19,7 @@ import java.util.List;
/** /**
* 波形比对分析服务实现类 * 波形比对分析服务实现类
* *
* <p>提供电能质量波形数据的分析和比对功能,支持:</p> * <p>提供电能质量波形数据的分析和比对功能,支持:</p>
* <ul> * <ul>
* <li>COMTRADE格式文件的流式读取和解析</li> * <li>COMTRADE格式文件的流式读取和解析</li>
@@ -40,7 +40,7 @@ public class CompareWaveServiceImpl implements ICompareWaveService {
/** /**
* 电能质量配置参数 * 电能质量配置参数
* *
* <p>包含分析计算所需的各项配置:</p> * <p>包含分析计算所需的各项配置:</p>
* <ul> * <ul>
* <li>谐波分析参数(谐波次数、计算方式等)</li> * <li>谐波分析参数(谐波次数、计算方式等)</li>
@@ -59,7 +59,7 @@ public class CompareWaveServiceImpl implements ICompareWaveService {
* @param sourceDatStream 源DAT文件流 * @param sourceDatStream 源DAT文件流
* @param targetCfgStream 目标CFG文件流 * @param targetCfgStream 目标CFG文件流
* @param targetDatStream 目标DAT文件流 * @param targetDatStream 目标DAT文件流
* @param lineConfig 接线方式 0=星型接线, 1=V型接线 * @param lineConfig 接线方式 0=星型接线, 1=V型接线
* @return 解析后的数据结果 * @return 解析后的数据结果
*/ */
@Override @Override
@@ -118,8 +118,8 @@ public class CompareWaveServiceImpl implements ICompareWaveService {
/** /**
* 应用配置参数(带接线方式和额定值) * 应用配置参数(带接线方式和额定值)
* *
* @param dataBuf 数据缓冲区 * @param dataBuf 数据缓冲区
* @param lineConfig 接线方式0: 星型接线, 1: V型接线 * @param lineConfig 接线方式0: 星型接线, 1: V型接线
*/ */
private void applyConfiguration(DataPq dataBuf, int lineConfig) { private void applyConfiguration(DataPq dataBuf, int lineConfig) {
@@ -141,7 +141,7 @@ public class CompareWaveServiceImpl implements ICompareWaveService {
/** /**
* 执行分析和比较的核心逻辑 * 执行分析和比较的核心逻辑
* *
* @param sourceDataBuf 源数据缓冲区 * @param sourceDataBuf 源数据缓冲区
* @param targetDataBuf 目标数据缓冲区 * @param targetDataBuf 目标数据缓冲区
* @return 是否成功 * @return 是否成功
@@ -191,7 +191,7 @@ public class CompareWaveServiceImpl implements ICompareWaveService {
// 如果没有设置对齐参数,使用默认值(兼容性) // 如果没有设置对齐参数,使用默认值(兼容性)
if (startCalTime == null) { if (startCalTime == null) {
startCalPos = 0; startCalPos = 0;
calNum = Math.min(dataBuf.getSmpNum() / (int)(dataBuf.getSmpRate() * 10), 100); calNum = Math.min(dataBuf.getSmpNum() / (int) (dataBuf.getSmpRate() * 10), 100);
startCalTime = new ClockStruct(); startCalTime = new ClockStruct();
startCalTime.setYear(2024); startCalTime.setYear(2024);
startCalTime.setMonth(1); startCalTime.setMonth(1);
@@ -203,7 +203,7 @@ public class CompareWaveServiceImpl implements ICompareWaveService {
} }
// 计算周期每200ms10个周波计算一次 // 计算周期每200ms10个周波计算一次
int samplesPerWindow = (int)(dataBuf.getSmpRate() * 10); // 10个周波的采样点数 int samplesPerWindow = (int) (dataBuf.getSmpRate() * 10); // 10个周波的采样点数
log.info("使用对齐参数 - 起始位置: {}, 窗口数: {}, 每周波采样点数: {}", log.info("使用对齐参数 - 起始位置: {}, 窗口数: {}, 每周波采样点数: {}",
startCalPos, calNum, dataBuf.getSmpRate()); startCalPos, calNum, dataBuf.getSmpRate());
@@ -265,12 +265,10 @@ public class CompareWaveServiceImpl implements ICompareWaveService {
results.add(result); results.add(result);
// 日志输出部分结果用于调试 // 日志输出部分结果用于调试
if (window == 0) { log.info("" + window + "个窗口计算结果 - UA有效值: {}, UB有效值: {}, UC有效值: {}, 时间为:" + result.getClocktime().format(),
log.info("第一个窗口计算结果 - UA有效值: {}, UB有效值: {}, UC有效值: {}", result.getRms()[0], result.getRms()[1], result.getRms()[2]);
result.getRms()[0], result.getRms()[1], result.getRms()[2]); log.info("" + window + "个窗口计算结果 - IA有效值: {}, IB有效值: {}, IC有效值: {}, 时间为:" + result.getClocktime().format(),
log.info("第一个窗口计算结果 - IA有效值: {}, IB有效值: {}, IC有效值: {}", result.getRms()[3], result.getRms()[4], result.getRms()[5]);
result.getRms()[3], result.getRms()[4], result.getRms()[5]);
}
} }
return results; return results;