多回路信号干扰仿真:用 Python 量化接地与滤波的真实收益
"某精细化工车间,4个反应釜共用一套接地网,变频器、固态继电器、大功率加热管全部挤在同一个电气柜里。投产后发现:3号釜温度显示每隔30秒跳变±5℃,PID输出跟着抽风,阀门一天动作2000多次,定位器3个月坏了4个。仪表班长第一反应是'传感器坏了',换了3根Pt100屏蔽线,问题依旧。最后请外部专家来做接地阻抗测试和信号频谱分析,发现控制柜接地电阻1.8Ω(标准是≤0.1Ω),变频器谐波通过地线串到温度信号上。整改接地+加装信号滤波器后,温度波动降到±0.3℃,阀门日均动作降到180次,年省定位器更换费+废品损失合计约28万元。"
—— 参考哈尔滨工程大学《工业过程控制》第4章"检测变送环节"、第11章"抗干扰技术"
一、实际应用场景描述
在化工、制药、食品等流程工业中,一个控制柜里往往同时跑着多个控制回路。当变频驱动、大功率加热、开关量执行器共处一室时,信号干扰是绕不开的问题。
┌──────────────────────────────────────────────────────────────┐
│ 多回路控制系统 · 信号干扰与滤波方案评估 │
│ │
│ 【现场电气布局(典型问题场景)】 │
│ │
│ ┌──────────── 同一个控制柜 ────────────────┐ │
│ │ ┌─────────┐ ┌──────────┐ ┌────────┐ │ │
│ │ │ 变频器 │ │ 加热SSR │ │ 继电器 │ │ ← 干扰源 │
│ │ │ 22kW水泵│ │ 12kW×4路│ │ 组24路 │ │ │
│ │ └────┬────┘ └────┬─────┘ └───┬────┘ │ │
│ │ │ │ │ │ │
│ │ ═══╪═════════════╪════════════╪═══════│══ 共用地线 │
│ │ │ │ │ │ (1.8Ω!) │
│ │ ┌────┴────┐ ┌────┴────┐ ┌───┴────┐ │ │
│ │ │ Pt100 │ │ 4~20mA │ │ Pt100 │ │ ← 被干扰信号 │
│ │ │ 温度变送│ │ 流量变送│ │ 温度变送│ │ │
│ │ └────┬────┘ └────┬────┘ └───┬────┘ │ │
│ │ └─────────────┴──────────┘ │ │
│ │ 信号电缆(并行敷设) │ │
│ └─────────────────────────────────────────┘ │
│ │
│ 【干扰耦合路径】 │
│ ① 传导耦合: 变频器谐波 → 共用地线 → 信号参考点漂移 │
│ ② 电容耦合: 动力线与信号线并行 → 寄生电容 → 高频噪声 │
│ ③ 电感耦合: 大电流突变 → 空间磁场 → 信号环路感应 │
│ │
│ 【多回路互相干扰的连锁反应】 │
│ 回路1(PID温度) ← 干扰跳变 → PID输出突变 → 阀门猛动 │
│ ↓ 阀门动作影响流量 │
│ 回路2(PID流量) ← 流量波动 → PID输出调整 → 泵频率变化 │
│ ↓ 泵频率变化产生新的谐波 │
│ 回路1 ← 更多干扰...(正反馈循环) │
│ │
│ 【本方案仿真架构】 │
│ ┌────────────┐ ┌──────────────┐ ┌───────────────────┐ │
│ │ 干扰源模型 │ │ 耦合通道模型 │ │ 被干扰回路模型 │ │
│ │ · 变频谐波│ │ · 传导/电容 │ │ · PID+过程+传感器 │ │
│ │ · 开关噪声│ │ · 接地阻抗 │ │ · 含噪声PV │ │
│ └────────────┘ └──────────────┘ └───────────────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ 滤波器模型(对比组) │ │
│ │ · 无滤波(baseline) │ │
│ │ · 一阶RC低通(硬件滤波) │ │
│ │ · 移动平均(软件滤波) │ │
│ │ · 中值滤波(抗脉冲) │ │
│ │ · 接地改善(降低地线阻抗→减小共模干扰) │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ 评估指标: 信号信噪比(SNR)、PID输出标准差、阀门日均动作次数 │
└──────────────────────────────────────────────────────────────┘
二、引入痛点(含量化对比)
2.1 现场真实困境
某食品添加剂厂电气负责人的反馈:
"我们这条线4个反应釜,每个釜有温度PID、流量PID、压力PID,一共12个控制回路。控制柜是外包做的,图便宜把所有东西塞一个柜子里——22kW变频器、48kW固态加热、24路继电器、12路4~20mA信号全在一起。
投产第一天就发现问题:3号釜温度显示每隔30秒就从155℃跳到160℃,又掉回来。PID一看'超温了'就关小加热阀,过几秒又'欠温'开大阀门。阀门一天动作2000多次,定位器3个月坏了4个,一个定位器6000多。
仪表班换了3根Pt100屏蔽线,问题没解决。又换了一台温度变送器,还是跳。最后找专家来测接地电阻,发现整个柜子的接地端到真正大地是1.8Ω——国家标准要求≤0.1Ω。变频器产生的谐波通过这根'半吊子地线'串到了所有模拟量信号上。
专家说:'你这不是传感器问题,是地线问题。' 我们花了2天重新做接地网,又给每个温度通道加了信号隔离器和RC滤波器。改完后温度波动从±5℃降到±0.3℃,阀门动作从2000次/天降到180次/天。
我后来算了一笔账:如果设计阶段就用仿真评估过接地和滤波方案,这2天的停产损失+定位器更换费+专家咨询费,总共能省28万。问题是——没人会在设计阶段做这种仿真。"
2.2 无滤波/差接地 vs 接地改善+滤波(量化对比)
指标 无滤波+差接地(1.8Ω) 接地改善(0.05Ω)+双级滤波 改善效果
信号峰峰值噪声 ±5.2℃ ±0.28℃ -94.6%
PID输出标准差 18.7% 2.1% -88.8%
阀门日均动作次数 2000次 180次 -91%
定位器更换频率 4个/3个月 0个/年 消除
温度控制精度(σ) ±3.8℃ ±0.35℃ -90.8%
产品一等品率 76% 93% +17pp
月均废品损失 8.5万元 0.9万元 -89.4%
停产排查时间 5天(反复试错) 0天(仿真预判) -100%
年综合损失 约38万元 约6万元 -84.2%
关键发现:信号干扰问题看起来是仪表问题,根子上是电气设计问题。接地不良+无滤波的组合,让12个回路互相"打架"。用仿真在设计阶段就评估不同接地阻抗和滤波方案的效果,可以把排查时间从"天"压缩到"分钟",避免投产后的连锁损失。
2.3 核心矛盾
多回路系统的核心矛盾是"信号共享物理介质(电源线/地线/空间)"与"每个回路要求独立、干净的信号"之间的冲突。
传统做法"出了问题再排查"是事后救火;本方案用仿真做事前预测——在电脑上建模干扰源、耦合通道、滤波器,量化评估不同方案的效果。这就像建房子前先用软件做抗震模拟,不用等地震来了才知道墙不结实。
三、核心逻辑讲解(大白话版)
3.1 用大白话解释"多回路信号干扰"
想象你在一个房间里开4个电话会议:
问题场景:
- 4个人同时打电话,每个人用扬声器(互相能听到对方的声音)。
- A在跟客户吵架(大声、高频)。
- B的信号里就混进了A的吵架声。
- B以为客户在骂自己,也开始大声回怼。
- C又听到了B的回怼声……
- 最后4个人全在互相吼,谁也听不清谁。
工业现场版:
- 打电话的人 = 控制回路(温度、流量、压力……)
- 扬声器声音 = 干扰信号(变频器谐波、继电器开关噪声)
- 互相听到 = 信号耦合(通过地线、空间电磁场)
- 大声回怼 = PID输出突变 → 阀门猛动 → 影响其他回路
- 谁也听不清 = 所有回路都失控
解决方案(对应工业措施):
1. 降低扬声器音量 = 改善接地(减小地线阻抗→共模干扰降低)
2. 每人戴耳塞 = 加装滤波器(硬件RC / 软件移动平均)
3. 用耳机代替扬声器 = 信号隔离器(切断地环路)
4. 去不同房间打电话 = 分开布线(动力线与信号线分开走)
大白话总结:
- 干扰源:谁在制造噪声?(变频器、SSR、继电器)
- 耦合路径:噪声怎么传过去的?(地线、空间、电容)
- 被干扰对象:谁受到了影响?(温度传感器、4~20mA信号)
- 滤波/接地:怎么把噪声压下去?(RC低通、移动平均、降阻抗)
- 评估:压下去了多少?(SNR、PID输出波动、阀门动作次数)
3.2 工业过程控制模型(哈工程《工业过程控制》标准建模)
信号干扰的传递模型:
y_{measured}(t) = y_{true}(t) + n_{coupled}(t)
其中耦合噪声:
n_{coupled}(t) = \underbrace{k_{conductive} \cdot i_{noise}(t) \cdot R_{ground}}_{\text{传导耦合}} + \underbrace{k_{capacitive} \cdot \frac{dV_{noise}}{dt}}_{\text{电容耦合}} + \underbrace{k_{inductive} \cdot \frac{di_{noise}}{dt}}_{\text{电感耦合}}
滤波器模型:
滤波器类型 时域差分方程 频域特性
一阶RC低通 y_k = \alpha \cdot y_{k-1} + (1-\alpha) \cdot x_k 截止频率 f_c = \frac{1-\alpha}{2\pi\alpha \Delta t}
移动平均 y_k = \frac{1}{N}\sum_{i=0}^{N-1} x_{k-i} 理想低通,抑制周期N的纹波
中值滤波 y_k = \text{median}(x_{k-m}, ..., x_k, ..., x_{k+m}) 消除脉冲尖峰
PID输出方差与噪声增益关系:
\sigma_{u}^2 \approx K_c^2 \cdot \left(1 + \frac{T_s}{T_i}\right)^2 \cdot \sigma_n^2 + K_c^2 \cdot \left(\frac{T_d}{T_s}\right)^2 \cdot \sigma_{\Delta n}^2
可见:噪声直接放大为PID输出波动,滤波降噪=降阀门动作=省设备+提品质。
参考哈工程《工业过程控制》:
- §4.4 "检测变送环节的抗干扰措施"
- §11.2 "工业控制系统的抗干扰设计"
- §11.3 "接地技术与滤波技术"
3.3 如何映射到代码中
数学模型/概念 Python 代码
噪声源 n(t)
"NoiseGenerator" 类(正弦+脉冲+高斯白噪声)
耦合通道
"CouplingChannel" 类(增益×噪声+接地阻抗项)
传感器模型
"SensorModel" 类(含真实值+叠加噪声)
滤波器
"FilterBase" 子类:
"MovingAverageFilter"、
"MedianFilter"、
"LowPassFilter"
PID控制器
"PIDController" 类(对含噪声的PV做运算)
过程模型
"ProcessModel" 类(一阶惯性+纯滞后)
评估指标
"Evaluator" 类(计算SNR、输出方差、阀门动作次数)
核心设计思想:
1. 噪声是可生成的:用确定性+随机性组合模拟真实干扰。
2. 滤波器是可替换的:统一接口,方便A/B对比。
3. 回路是可组合的:多回路之间共享噪声源,模拟互相干扰。
4. 指标是可量化的:SNR、方差、动作次数——用数字说话。
四、OOP 代码实现(精简可运行)
4.1 项目结构
signal_integrity_sim/
├── signal_sim.py # 核心代码(单文件,~350行)
├── README.md # 使用说明
└── requirements.txt # 依赖库(无强制依赖)
4.2 完整源代码(可直接运行)
<details>
<summary></summary>
"""
多回路信号干扰仿真与接地/滤波方案评估
参考: 哈尔滨工程大学《工业过程控制》第4章"检测变送环节"、第11章"抗干扰技术"
功能:
- 模拟多回路系统中的信号干扰(传导/电容/电感耦合)
- 模拟不同接地阻抗对共模干扰的影响
- 实现3种滤波器:一阶RC低通、移动平均、中值滤波
- 对比评估:无滤波 vs 单级滤波 vs 双级滤波+接地改善
- 量化指标:SNR、PID输出标准差、阀门日均动作次数
运行:
python signal_sim.py
# 纯Python标准库,无需安装任何第三方包
"""
import math
import random
from collections import deque
from dataclasses import dataclass, field
from typing import Deque, List, Optional
# ─── 随机数种子(保证可复现) ─────────────────────────────────────────────
random.seed(2026)
# ─── 噪声源生成器 ──────────────────────────────────────────────────────────
class NoiseGenerator:
"""
干扰噪声源模型
参考: 哈工程《工业过程控制》§11.2 "干扰源分析"
包含三种典型工业噪声:
1. 变频谐波: 低频正弦叠加(30Hz基波 + 谐波)
2. 继电器/SSR开关: 周期性脉冲
3. 背景噪声: 高斯白噪声
"""
def __init__(
self,
vfd_amplitude: float = 2.0, # 变频谐波幅度
vfd_base_freq: float = 0.033, # 变频基频(Hz, 对应30秒周期)
switch_amplitude: float = 3.0, # 开关脉冲幅度
switch_period: int = 20, # 开关周期(步数)
white_std: float = 0.3, # 白噪声标准差
):
self.vfd_amplitude = vfd_amplitude
self.vfd_base_freq = vfd_base_freq # 步数倒数
self.switch_amplitude = switch_amplitude
self.switch_period = switch_period
self.white_std = white_std
self._step = 0
def generate(self) -> float:
"""生成一个噪声样本"""
self._step += 1
# 1) 变频谐波(多频叠加)
t = self._step
vfd = 0.0
for harmonic in [1, 2, 3]:
freq = self.vfd_base_freq * harmonic
vfd += self.vfd_amplitude / harmonic * math.sin(2 * math.pi * freq * t)
# 2) 开关脉冲(周期性尖峰)
switch = 0.0
if t % self.switch_period == 0:
switch = self.switch_amplitude * random.choice([-1, 1])
# 3) 高斯白噪声
white = random.gauss(0, self.white_std)
return vfd + switch + white
def reset(self) -> None:
self._step = 0
# ─── 耦合通道模型 ──────────────────────────────────────────────────────────
class CouplingChannel:
"""
干扰耦合通道模型
参考: 哈工程《工业过程控制》§11.2 "干扰耦合途径"
三种耦合方式综合为一个增益系数:
n_coupled = gain_conductive × i_noise × R_ground
+ gain_capacitive × dV/dt
+ gain_inductive × di/dt
"""
def __init__(
self,
ground_resistance: float = 1.8, # 接地电阻(Ω), 差接地=1.8, 好接地=0.05
conductive_gain: float = 0.1, # 传导耦合增益
capacitive_gain: float = 0.05, # 电容耦合增益
inductive_gain: float = 0.02, # 电感耦合增益
):
self.ground_resistance = ground_resistance
self.conductive_gain = conductive_gain
self.capacitive_gain = capacitive_gain
self.inductive_gain = inductive_gain
self._prev_noise = 0.0
def couple(self, noise: float) -> float:
"""
计算耦合到信号线上的噪声
Args:
noise: 原始干扰噪声
Returns:
耦合后的噪声分量
"""
# 传导: 噪声电流 × 接地阻抗
conductive = self.conductive_gain * abs(noise) * self.ground_resistance
# 电容: dV/dt 近似
dv_dt = noise - self._prev_noise
capacitive = self.capacitive_gain * dv_dt
# 电感: di/dt(与电容类似,用噪声变化率)
inductive = self.inductive_gain * abs(dv_dt)
self._prev_noise = noise
return conductive + capacitive + inductive
# ─── 传感器模型 ────────────────────────────────────────────────────────────
class SensorModel:
"""
传感器+信号链模型(含干扰叠加)
参考: 哈工程《工业过程控制》§4.1 "检测元件与变送器"
"""
def __init__(
self,
name: str,
true_value: float = 155.0,
noise_generator: Optional[NoiseGenerator] = None,
coupling: Optional[CouplingChannel] = None,
filter_chain: Optional[List['FilterBase']] = None,
):
self.name = name
self.true_value = true_value
self.noise_generator = noise_generator or NoiseGenerator()
self.coupling = coupling or CouplingChannel()
self.filter_chain = filter_chain or []
self._raw_history: List[float] = []
def read(self) -> float:
"""读取含噪声+滤波后的测量值"""
raw_noise = self.noise_generator.generate()
coupled = self.coupling.couple(raw_noise)
raw_value = self.true_value + coupled
self._raw_history.append(raw_value)
# 通过滤波器链
filtered = raw_value
for f in self.filter_chain:
filtered = f.process(filtered)
return filtered
def get_raw_history(self) -> List[float]:
return list(self._raw_history)
# ─── 滤波器基类与实现 ────────────────────────────────────────────────────
class FilterBase:
"""滤波器基类"""
def process(self, value: float) -> float:
raise NotImplementedError
class NoFilter(FilterBase):
"""无滤波(直通)"""
def process(self, value: float) -> float:
return value
class MovingAverageFilter(FilterBase):
"""
移动平均滤波器
参考: 哈工程《工业过程控制》§4.4 "信号滤波方法"
"""
def __init__(self, window_size: int = 5):
self.window: Deque[float] = deque(maxlen=window_size)
def process(self, value: float) -> float:
self.window.append(value)
return sum(self.window) / len(self.window)
class MedianFilter(FilterBase):
"""
中值滤波器(抗脉冲干扰)
参考: 哈工程《工业过程控制》§4.4 "非线性滤波"
"""
def __init__(self, window_size: int = 5):
self.window: Deque[float] = deque(maxlen=window_size)
def process(self, value: float) -> float:
self.window.append(value)
sorted_vals = sorted(self.window)
n = len(sorted_vals)
if n % 2 == 1:
return sorted_vals[n // 2]
return (sorted_vals[n // 2 - 1] + sorted_vals[n // 2]) / 2.0
class LowPassFilter(FilterBase):
"""
一阶RC低通滤波器(软件实现)
差分方程: y[k] = α·y[k-1] + (1-α)·x[k]
截止频率: fc = (1-α)/(2π·α·Ts)
"""
def __init__(self, alpha: float = 0.3):
self.alpha = alpha
self._prev = 0.0
self._initialized = False
def process(self, value: float) -> float:
if not self._initialized:
self._prev = value
self._initialized = True
return value
self._prev = self.alpha * self._prev + (1 - self.alpha) * value
return self._prev
# ─── PID 控制器(简化版,用于评估干扰影响) ──────────────────────────────
class PIDController:
"""
简化PID控制器(用于评估噪声对输出的影响)
参考: 哈工程《工业过程控制》§2.3 "PID控制算法"
"""
def __init__(self, Kc: float = 3.0, Ti: float = 120.0, Td: float = 30.0,
Ts: float = 1.0):
self.Kc = Kc
self.Ki = Kc / Ti if Ti > 0 else 0
self.Kd = Kc * Td
self.Ts = Ts
self._integral = 0.0
self._prev_pv = 0.0
self._prev_output = 50.0
def compute(self, setpoint: float, pv: float) -> float:
"""计算PID输出"""
error = setpoint - pv
# 比例
P = self.Kc * error
# 积分(无抗饱和,仅评估噪声影响)
self._integral += self.Ki * error * self.Ts
self._integral = max(-50, min(50, self._integral))
I = self._integral
# 微分(对PV微分)
derivative = -(pv - self._prev_pv) / self.Ts
D = self.Kd * derivative
output = 50.0 + P + I + D
output = max(0, min(100, output))
self._prev_pv = pv
self._prev_output = output
return output
# ─── 评估器 ────────────────────────────────────────────────────────────────
class Evaluator:
"""
性能指标评估器
参考: 哈工程《工业过程控制》§2.5 "控制系统性能指标"
"""
@staticmethod
def snr(signal_true: List[float], signal_noisy: List[float]) -> float:
"""计算信噪比(SNR, dB)"""
if len(signal_true) != len(signal_noisy):
return -999.0
signal_power = sum(v ** 2 for v in signal_true) / len(signal_true)
noise_power = sum((signal_noisy[i] - signal_true[i]) ** 2
for i in range(len(signal_true))) / len(signal_true)
if noise_power < 1e-10:
return 99.9
return 10 * math.log10(signal_power / noise_power)
@staticmethod
def output_std(outputs: List[float]) -> float:
"""PID输出标准差"""
if len(outputs) < 2:
return 0.0
mean = sum(outputs) / len(outputs)
var = sum((v - mean) ** 2 for v in outputs) / (len(outputs) - 1)
return math.sqrt(var)
@staticmethod
def valve_moves(outputs: List[float], threshold: float = 1.0) -> int:
"""阀门动作次数(输出变化超过阈值的次数)"""
count = 0
for i in range(1, len(outputs)):
if abs(outputs[i] - outputs[i - 1]) > threshold:
count += 1
return count
# ─── 仿真引擎 ────────────────────────────────────────────────────────────
@dataclass
class SimulationConfig:
"""仿真配置"""
steps: int = 500
setpoint: float = 155.0
true_value: float = 155.0
sample_time: float = 1.0
def run_scenario(
name: str,
config: SimulationConfig,
sensor: SensorModel,
pid: PIDController,
) -> dict:
"""运行单个场景"""
sensor.noise_generator.reset()
sensor._raw_history.clear()
pid._integral = 0.0
pid._prev_pv = 0.0
pv_history = []
output_history = []
true_history = []
for _ in range(config.steps):
pv = sensor.read()
pv_history.append(pv)
true_history.append(config.true_value)
u = pid.compute(config.setpoint, pv)
output_history.append(u)
snr_val = Evaluator.snr(true_history, pv_history)
std_val = Evaluator.output_std(output_history)
moves = Evaluator.valve_moves(output_history)
# 估算日均阀门动作
steps_per_day = 86400 / config.sample_time
moves_per_day = moves * (steps_per_day / config.steps)
return {
"name": name,
"snr_db": snr_val,
"output_std": std_val,
"valve_moves_per_day": moves_per_day,
"pv_peak_to_peak": max(pv_history) - min(pv_history) if pv_history else 0,
}
# ─── 演示 ────────────────────────────────────────────────────────────
def demo() -> None:
"""运行完整对比演示"""
print("=" * 78)
print(" 多回路信号干扰仿真与接地/滤波方案评估")
print(" 参考: 哈尔滨工程大学《工业过程控制》第4章、第11章")
print("=" * 78)
config = SimulationConfig(steps=500, setpoint=155.0, true_value=155.0)
# 基础噪声源(模拟变频器+继电器+背景噪声)
base_noise = NoiseGenerator(
vfd_amplitude=2.0,
vfd_base_freq=0.033,
switch_amplitude=3.0,
switch_period=15,
white_std=0.4,
)
# PID控制器
pid = PIDController(Kc=3.0, Ti=120.0, Td=30.0, Ts=config.sample_time)
# ── 场景定义 ──
scenarios = []
# 场景1: 差接地(1.8Ω) + 无滤波
s1 = SensorModel(
name="差接地+无滤波",
true_value=config.true_value,
noise_generator=NoiseGenerator(
vfd_amplitude=2.0, vfd_base_freq=0.033,
switch_amplitude=3.0, switch_period=15, white_std=0.4,
),
coupling=CouplingChannel(ground_resistance=1.8),
filter_chain=[NoFilter()],
)
scenarios.append(("差接地(1.8Ω)+无滤波", s1))
# 场景2: 差接地 + 移动平均滤波
s2 = SensorModel(
name="差接地+移动平均",
true_value=config.true_value,
noise_generator=NoiseGenerator(
vfd_amplitude=2.0, vfd_base_freq=0.033,
switch_amplitude=3.0, switch_period=15, white_std=0.4,
),
coupling=CouplingChannel(ground_resistance=1.8),
filter_chain=[MovingAverageFilter(window_size=7)],
)
scenarios.append(("差接地(1.8Ω)+移动平均", s2))
# 场景3: 差接地 + 中值滤波
s3 = SensorModel(
name="差接地+中值滤波",
true_value=config.true_value,
noise_generator=NoiseGenerator(
vfd_amplitude=2.0, vfd_base_freq=0.033,
switch_amplitude=3.0, switch_period=15, white_std=0.4,
),
coupling=CouplingChannel(ground_resistance=1.8),
filter_chain=[MedianFilter(window_size=5)],
)
scenarios.append(("差接地(1.8Ω)+中值滤波", s3))
# 场景4: 好接地(0.05Ω) + 无滤波
s4 = SensorModel(
name="好接地+无滤波",
true_value=config.true_value,
noise_generator=NoiseGenerator(
vfd_amplitude=2.0, vfd_base_freq=0.033,
switch_amplitude=3.0, switch_period=15, white_std=0.4,
),
coupling=CouplingChannel(ground_resistance=0.05),
filter_chain=[NoFilter()],
)
scenarios.append(("好接地(0.05Ω)+无滤波", s4))
# 场景5: 好接地(0.05Ω) + 双级滤波(低通+移动平均)
s5 = SensorModel(
name="好接地+双级滤波",
true_value=config.true_value,
noise_generator=NoiseGenerator(
vfd_amplitude=2.0, vfd_base_freq=0.033,
switch_amplitude=3.0, switch_period=15, white_std=0.4,
),
coupling=CouplingChannel(ground_resistance=0.05),
filter_chain=[
LowPassFilter(alpha=0.3),
MovingAverageFilter(window_size=5),
],
)
scenarios.append(("好接地(0.05Ω)+双级滤波", s5))
# ── 运行仿真 ──
print("\n 🔬 运行仿真场景...\n")
print(f" {'场景':<24} {'SNR(dB)':<12} {'输出σ(%)':<12} "
f"{'日均阀门动作':<14} {'PV峰峰值(℃)'}")
print(" " + "-" * 72)
results = []
for name, sensor in scenarios:
r = run_scenario(name, config, sensor, pid)
results.append(r)
print(f" {r['name']:<24} {r['snr_db']:<12.1f} "
f"{r['output_std']:<12.2f} "
f"{r['valve_moves_per_day']:<14.0f} "
f"{r['pv_peak_to_peak']:.2f}")
# ── 对比分析 ──
print("\n" + "=" * 78)
利用AI解决实际问题,如果你觉得这个工具好用,欢迎关注长安牧笛!