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 |