MATLAB 低压 PLC(电力线通信)仿真模型

MATLAB 低压 PLC(电力线通信)仿真模型,覆盖Zimmermann--Dostert 多径信道 + Middleton Class A 脉冲噪声 + OFDM 基带,是论文/课程设计/原型验证最常用的组合。


一、PLC 建模的三层结构(先对齐)

电力线不是普通 AWGN 信道,恶劣得多,建模要分三层:

核心问题 主流模型
信道 多分支 → 多径;衰减随 f、距离非线性 Zimmermann--Dostert 多径模型
噪声 5 类:有色背景 / 窄带 / 同步周期脉冲 / 异步周期脉冲 / 异步脉冲 前 3 类 → AWGN+有色;后 2 类 → Middleton Class A
物理层 多径+深衰落 → 子载波正交性受破坏 OFDM(G3-PLC / IEEE 1901 / HomePlug)

二、Zimmermann 多径信道

理论公式(IEEE TCOM 2002 原文)

H(f)=∑i=1Ngi e−(α0+α1fk)di e−j2πfτiH(f)=\sum_{i=1}^{N} g_i\, e^{-(\alpha_0+\alpha_1 f^k)d_i}\, e^{-j2\pi f\tau_i}H(f)=i=1∑Ngie−(α0+α1fk)die−j2πfτi

  • (gig_igi):第 i 条路径的复加权(阻抗失配反射)
  • (did_idi):路径长度
  • (τi=diεr/c\tau_i = d_i\sqrt{\varepsilon_r}/cτi=diεr /c):时延
  • (α(f)=α0+α1fk\alpha(f)=\alpha_0+\alpha_1 f^kα(f)=α0+α1fk):衰减随频率的经验式(k≈0.8~1)

MATLAB 实现:plc_channel.m

matlab 复制代码
%% plc_channel.m --- Zimmermann-Dostert 多径 PLC 信道
function [H, h, f] = plc_channel(Nfft, fs, fc_low, fc_high)
% Nfft: FFT 点数, fs: 采样率
% fc_low/fc_high: 频段下限/上限 (Hz),低压 PLC 典型 2-30 MHz

    % ---- 多径参数(低压家庭场景典型值,Zimmermann 论文)----
    Npath = 6;
    d  = [50 85 120 180 250 350] * 1e-3;   % 路径长度 (km→m 已换算, 这里直接 m)
    g  = [0.7 0.45 0.3 0.2 0.15 0.1];       % 复加权幅值(简化取实)
    eps_r = 2.2;                            % PVC 绝缘等效介电
    c = 3e8;
    tau = d .* sqrt(eps_r) / c;             % 时延 (s)

    % 衰减参数(低压 2-30MHz 拟合)
    alpha0 = 0.001;    % Np/m
    alpha1 = 0.8e-8;   % Np/m/MHz^k
    k = 0.9;

    % ---- 频点 ----
    f = (0:Nfft-1)/Nfft * fs;
    H = ones(1, Nfft);

    for i = 1:Npath
        alpha_f = alpha0 + alpha1 * (f(:).^k);   % α(f)
        H = H + g(i) .* exp(-alpha_f * d(i)) ...
                 .* exp(-1j*2*pi*f(:)*tau(i));
    end

    % 只保留 PLC 工作频段
    H(f < fc_low | f > fc_high) = 1e-6;

    % ---- 转时域冲激响应(线性卷积用)----
    H_full = [H, conj(H(end-1:-1:2))];   % 补共轭做实冲激
    h = real(ifft(H_full));
    h = h(1:min(256, Nfft));             % 截断
end

如果想做中压/入户不同场景 ,换 d,g,α0,α1 就行,Zimmermann 原文给了 3 组参考(Type 1/2/3 信道)。


三、噪声模型(两类叠加)

1、背景噪声 → AWGN(前五类里前三种合并)

matlab 复制代码
%% 背景噪声(简化 AWGN,色度可加 AR 滤波)
function n_bg = plc_background_noise(N, snr_db, signal_power)
    n_bg = sqrt(signal_power/(10^(snr_db/10))/2) ...
           * (randn(N,1) + 1j*randn(N,1));
end

2、脉冲噪声 → Middleton Class A

Class A 是泊松-高斯混合:

p(n)=∑m=0∞e−AAmm! 12πσm2exp⁡ ⁣(−n22σm2),σm2=m/A+Γ1+Γσ2p(n)=\sum_{m=0}^{\infty} \frac{e^{-A}A^m}{m!}\, \frac{1}{\sqrt{2\pi\sigma_m^2}}\exp\!\left(-\frac{n^2}{2\sigma_m^2}\right),\quad \sigma_m^2=\frac{m/A+\Gamma}{1+\Gamma}\sigma^2p(n)=m=0∑∞m!e−AAm2πσm2 1exp(−2σm2n2),σm2=1+Γm/A+Γσ2

matlab 复制代码
%% plc_impulse_classA.m --- Middleton Class A 脉冲噪声
function n_imp = plc_impulse_classA(N, A, Gamma, sigma2)
% N: 样本数, A: 脉冲指数(0.001~1), Gamma: 高斯/脉冲功率比(0.01~1)
% sigma2: 总噪声功率

    n_imp = zeros(N,1);
    M_max = 20;   % 泊松截断

    for i = 1:N
        % 抽样 m ~ Poisson(A)
        m = rand() < (poisscdf(0:A, A));  % 简化:直接抽 0:M_max
        m = min(find(rand() <= cumsum(exp(-A)*A.^(0:M_max)./factorial(0:M_max)),1)-1, M_max);

        sigma_m2 = sigma2 * (m/A + Gamma) / (1 + Gamma);
        n_imp(i) = randn() * sqrt(sigma_m2);
    end
end

典型初值:A=0.1, Γ=0.1(稀疏强脉冲);A→∞ 退化为高斯。


四、OFDM-PLC 基带主程序

低压 PLC 典型:NFFT=64, CP=16, 子载波 2-30 MHz,这里简化到基带等效。

matlab 复制代码
%% main_plc_ofdm.m
clear; clc; close all;

%% ========== 参数 ==========
Nfft = 64;
Ncp  = 16;
Nsym = 100;           % OFDM 符号数
M = 4;                % QPSK
fc_low = 2e6; fc_high = 30e6;
fs = 40e6;            % 过采样(基带等效可设 40 MHz)

%% ========== PLC 信道 ==========
[H, h, f] = plc_channel(Nfft, fs, fc_low, fc_high);

figure('Color','white')
plot(f/1e6, 20*log10(abs(H)))
xlabel('Frequency (MHz)'); ylabel('|H(f)| (dB)')
title('PLC Channel Frequency Response (Zimmermann)')
grid on

%% ========== 发射 ==========
data = randi([0 M-1], Nsym*(Nfft-2), 1);   % 去 DC/两端
tx_sym = qammod(data, M, 'UnitAveragePower', true);

% 串 OFDM 帧
tx_frame = [];
for i = 1:Nsym
    sym_block = [0; tx_sym((i-1)*(Nfft-2)+1:i*(Nfft-2)); 0];  % DC 置零
    ofdm_t = ifft(sym_block, Nfft);
    ofdm_cp = [ofdm_t(end-Ncp+1:end); ofdm_t];
    tx_frame = [tx_frame; ofdm_cp];
end

%% ========== 过信道 ==========
rx_frame = conv(tx_frame, h, 'same');

%% ========== 噪声 ==========
EbN0_dB = 0:2:20;
ber = zeros(size(EbN0_dB));

for s = 1:length(EbN0_dB)
    % 背景 AWGN
    snr_lin = 10^(EbN0_dB(s)/10) * log2(M) * (Nfft/(Nfft+Ncp));
    rx_sig = awgn(rx_frame, 10*log10(snr_lin), 'measured');

    % 叠加 Class A 脉冲(稀疏注入)
    A_par = 0.1; Gamma_par = 0.1;
    sigma2 = var(rx_sig - rx_frame);
    n_imp = plc_impulse_classA(length(rx_sig), A_par, Gamma_par, sigma2*10);
    rx_sig = rx_sig + 0.5*n_imp;   % 脉冲占比可调

    % ========== 接收 ==========
    rx_data = [];
    for i = 1:Nsym
        blk = rx_sig((i-1)*(Nfft+Ncp)+Ncp+1 : i*(Nfft+Ncp));
        sym_rx = fft(blk, Nfft);
        rx_data = [rx_data; sym_rx(2:Nfft-1)];  % 去 DC
    end

    rx_bits = qamdemod(rx_data, M, 'UnitAveragePower', true);
    ber(s) = sum(rx_bits ~= data) / length(data);
end

%% ========== BER 曲线 ==========
figure('Color','white')
semilogy(EbN0_dB, ber, 'bo-', 'LineWidth',1.5)
xlabel('E_b/N_0 (dB)'); ylabel('BER')
grid on
title('PLC-OFDM BER (Zimmermann + Class A Impulsive Noise)')

跑出来能看到:脉冲噪声一加,BER 尾巴会上翘------这就是 PLC 比无线难的地方,也是为什么 G3-PLC 要加鲁棒解调 + 重传。

参考代码 电力线通信模型 www.youwenfan.com/contentcsw/82512.html

五、耦合电路

PLC modem 不能直连 220V,要工频隔离 + 阻抗匹配(低压 PLC 特性阻抗 2~10 Ω,波动 1000×)

matlab 复制代码
%% plc_coupling_RLC.m --- 简化耦合等效
% 典型:串联电容隔直 + 并联电感做工频陷波 + 匹配电阻
%  C ~ 100nF(隔 50Hz),L ~ 1mH(陷波 50Hz),R_match = 5Ω
f_sw = 10e6;
C = 100e-9; L = 1e-6; R = 5;
Z_couple = R + 1j*2*pi*f_sw*L + 1./(1j*2*pi*f_sw*C);
% 实际要扫频看 2-30MHz 内平坦度

特性阻抗随位置/频率跳 0.1 Ω → 100 Ω,所以耦合器+匹配网络是 PLC 硬件最难的一块,仿真里一般简化为发送/接收端各乘一个复增益。


六、扩展方向

目标 建议
论文复现 G3-PLC / IEEE 1901 把 OFDM 参数改成 Nfft=256/512, CP=32/64, 子载波 2-28MHz,加 RS+卷积码
窄带 NB-PLC(EN 50065, <500 kHz) fc_low=10kHz, fc_high=490kHz,衰减 α1 更大,多径时延到 ms 级
脉冲抑制算法 限幅器 / Myriad 滤波 / Middleton ML 接收机(UT Austin 工具箱有现成)
时变信道 Zimmermann 静态 → 加 Markov 切换(Zimmermann 原论文用 Markov 模脉冲出现)
接硬件 耦合器 + AFE → 用 dsp.SpectrumAnalyzer 看实际 PSD