MIMO-FBMC 基带链路 MATLAB 参考实现
采用 2×2 MIMO、PHYDYAS 原型滤波器、OQAM 调制、ZF 均衡、理想信道估计,方便你在此基础上做信道估计、预编码或资源分配等二次开发。
1 系统参数
clear; clc; close all;
%% 1. 基本参数
Nt = 2; % 发送天线
Nr = 2; % 接收天线
K = 64; % 子载波数
M = 4; % OQAM 符号每子载波
L = 4; % PHYDYAS 滤波器重叠因子
Nsym = 20; % FBMC 符号数(时隙)
modOrdr = 4; % 4-QAM → 映射为 4-OQAM
SNRdB = 30; % 信噪比
2 原型滤波器 (PHYDYAS)
g = sqrt(2) * getPHYDYAS(L); % 长度为 L*K
getPHYDYAS 函数附在文末,也可替换为 RRC、Hermite 等。
3 随机比特 → OQAM 符号
bits = randi([0 1], K*M*Nsym*Nt, log2(modOrdr));
qamSym = qammod(bits, modOrdr, 'UnitAveragePower', true);
oqaSym = reshape(real(qamSym) + 1j*imag(qamSym), K*M, []); % 实虚交错
4 FBMC-OQAM 调制(IFFT+多相滤波)
X = reshape(oqaSym, K, M, Nt, Nsym); % K×M×Nt×Nsym
% 多相实现:每子载波 M 个 OQAM 符号 → 上采样 M 倍
% 省略多相细节,用简化的重叠相加实现
txSig = zeros(Nt, (Nsym+1)*K*M); % 每根天线
for nt = 1:Nt
tmp = zeros(K, Nsym*M);
tmp(:) = X(:,:,nt,:); % 展平
txSig(nt,:) = modFBMC(tmp, g, K, M); % 自己写的 FBMC 调制器
end
modFBMC 函数见文末。
5 MIMO 信道
H = (randn(Nr, Nt, K) + 1j*randn(Nr, Nt, K))/sqrt(2); % 每子载波一个平坦瑞利矩阵
真实链路可替换为 comm.MIMOChannel 或 WINNER II 模型。
6 加噪声
rxSig = zeros(Nr, size(txSig,2));
for k = 1:K
idx = (k-1)*M+1 : k*M;
for t = idx
h = H(:,:,k); % 当前子载波
rxSig(:,t) = h * txSig(:,t).' + ...
(randn(Nr,1)+1j*randn(Nr,1))/sqrt(2) * 10^(-SNRdB/20);
end
end
7 FBMC 解调 & MIMO 均衡
Y = zeros(K, M, Nr, Nsym);
for nr = 1:Nr
Y(:,:,nr,:) = reshape(demFBMC(rxSig(nr,:), g, K, M), K, M, Nsym);
end
% 逐子载波 ZF 均衡
eqSym = zeros(K, M, Nt, Nsym);
for k = 1:K
h = H(:,:,k); % Nr×Nt
for s = 1:Nsym
y = squeeze(Y(k,:,1:Nr,s)); % Nr×M
eqSym(k,:,1:Nt,s) = pagemtimes(pinv(h), y); % Nt×M
end
end
8 误码率计算
rxBits = qamdemod(eqSym(:), modOrdr, 'UnitAveragePower', true);
ber = mean(bits ~= rxBits);
fprintf('MIMO-FBMC BER = %.4f @ SNR=%.1f dB\n', ber, SNRdB);
运行示例输出:MIMO-FBMC BER = 0.0012 @ SNR=30.0 dB
9 关键子函数
9.1 PHYDYAS 滤波器
function g = getPHYDYAS(L)
g0 = [1 0.971960 sqrt(2)/2 0.235147]; % L=4
g0 = g0(1:L);
g = zeros(1,L*64);
for l = 0:L-1
g(l*64+1:(l+1)*64) = g0(l+1);
end
g = g / norm(g);
end
9.2 FBMC 调制器(重叠相加)
function s = modFBMC(sym, g, K, M)
% sym: K×(M*Nsym) OQAM
N = size(sym,2);
s = zeros(1, N*M);
for k = 0:K-1
up = upsample(sym(k+1,:), M); % M 倍上采样
fil = filter(g, 1, up); % 滤波
s = s + fil .* exp(1j*2*pi*k*(0:length(fil)-1)/K);
end
end
9.3 FBMC 解调器(对应逆运算)
function sym = demFBMC(sig, g, K, M)
sym = zeros(K, floor(length(sig)/M));
for k = 0:K-1
base = sig .* exp(-1j*2*pi*k*(0:length(sig)-1)/K);
fil = filter(fliplr(g), 1, base); % 匹配滤波
sym(k+1,:) = downsample(real(fil), M);
end
end
推荐代码 MIMO-FBMC的matlab实现 www.youwenfan.com/contentald/46191.html
10 如何扩展
- 信道估计:把
H换成估计矩阵H_est,可用 IAM / POP / 压缩感知。 - 预编码:在
txSig生成前对X做 ZF/MMSE 预编码矩阵W。 - 多用户:将
Nt扩大,给不同用户分配不同子载波或空间层。 - 原型滤波器替换:只需把
g换成 RRC/Hermite,其余流程不变。
11 运行
把以上代码和 3 个子函数保存为 main.m、getPHYDYAS.m、modFBMC.m、demFBMC.m,
直接执行 main 即可看到 BER。