无线通信与编码_新型OFDM波形集_使用MATLAB仿真实现UFMC并与OFDM作对比_含实现代码

无线通信与编码—使用MATLAB仿真实现UFMC

1、简介

UFMC是通用滤波多载波 Universal Filtered Multi-Carrier的简称,是一种面向5G的多载波体制,可以被看作广义的滤波正交频分复用和滤波器组多载波(Filter Bank Multicarrier,FBMC),它继承了OFDM和FBMC的优点,同时克服了它们的一些不足。

OFDM 信号在调制解调时只需要进行 IFFT 和 FFT,因此简洁性是 OFDM 的一大优点。OFDM 的主要不足是其频谱的旁瓣过高,这导致OFDM 容易受到频率偏移和定时偏移的影响,在实际的系统中,必须进行高精度的同步才能确保系统性能的最大化。

新型的波形大都采用了滤波的方法,通过多个载波滤波减小频谱的旁瓣水平,从而减小OFDM的缺点,同时减小保护带开销。

(OFDM无法有效对抗ICI,与OFDM相比,FBMC是在每个子载波上滤波和不采用CP,而OFDM是在整个带上滤波,所以FBMC的频谱旁瓣和载波间的干扰(ICI)较小。UFMC采用折衷的方案,它使用了冲激响应较小的滤波器,把子载波分成多个子带,然后在每个子带上进行滤波,与FBMC相比,UFMC的滤波长度会短一些,一定程度上继承了FBMC的优点,又提高了突发短帧的传输效率。)

UFMC 对一组连续的子载波而非单个子载波进行滤波,因此 UFMC 滤波器的通带宽度比FBMC中滤波器的通带宽度要大,缩短了滤波器长度,解决了 FBMC 中复杂度过高的问题。与 FBMC 类似,UFMC也可以抑制功率谱的旁瓣,从而减小由于频偏而导致的子载波间干扰。

近年来,UFMC技术由于其带外辐射低、抗载波频偏能力强、时频效率高和可不添加循环前缀等优点而收到广泛关注,然而实际中,由于信道的多径效应,在不添加CP的UFMC系统中ISI是不可避免的。

与OFDM系统相比,UFMC的优势主要体现在以下几个方面:

  • 无CP的设计使得通信系统的效率提高。UFMC系统可以通过合理设计滤波器参数来对抗ICI和ISI,所以CP不再是必要的,在传输持续时间较短的数据帧时,系统效率相对于OFDM系统有所提高。
  • 带外辐射低。OFDM系统是整个子带使用一个滤波器,而UFMC是把整个频带分为若干个子频带,每个子频带都有自己的滤波器,这样做会降低系统的带外辐射。
  • UFMC可以通过改变滤波器长度,从而提升符号中有效信息所占比例,同时缩短符号长度,使得系统适用于短突发通信。
  • UFMC可以通过改变子频带宽度、数据部分长度和循环前缀长度以满足不同业务的需求。

(在 AWGN 信道下UFMC 和 OFDM 误码率性能相近,OFDM 在大信噪比时的误码率性能略好于 UFMC)

2、UFMC原理概述

UFMC系统介绍

在这里插入图片描述

UFMC符号时域采样信号由B个子带构成,每个子代又由若干个连续的子载波构成。子带的频域数据符号向量经过N点IDFT变换得到时域信号向量,输出符号经过一个长度为L的FIR滤波器,经过滤波器的卷积处理后,每个子带的输出信号长度由N变成N+L-1,然后叠加构成一个完整的UFMC发送符号。

接收端:通过在尾部加零的操作来使一个UFMC符号由N+L-1长度变成2N,然后进行2N点FFT计算,舍弃序号为奇数倍的数据,剩下的N点数据即为发送端发送的N点频域数据,然后解调即可得到发送数据。

在这里插入图片描述

在这里插入图片描述

3、代码部分

UFMC系统参数:子载波数=20,子带数目=10,切比雪夫滤波器长度=43,阻带衰减=40dB,子载波采用16QAM调制。
OFDM系统参数:

2.1设置系统参数

s = rng(211);        % Set RNG state for repeatability
numFFT = 512;        % FFT点数
subbandSize = 20;    % >1 
numSubbands = 10;    % numSubbands*subbandSize <= numFFT
subbandOffset = 156; % numFFT/2-subbandSize*numSubbands/2 = 256-10*10 = 156

bitsPerSubCarrier = 4;   % 2: 4QAM, 4: 16QAM, 6: 64QAM, 8: 256QAM
snrdB = 15;              % SNR(dB)

% 使用的是具有参数化旁瓣衰减的切比雪夫(FIR)滤波窗口
filterLen = 43;      % 类似于循环前缀长度
slobeAtten = 40;     % 旁瓣(阻带)衰减 dB

2.2 UFMC调制
UFMC符号时域采样信号由B个子带构成,每个子带又由若干个连续的子载波构成。子带的频域数据符号向量经过N点IDFT变换得到时域信号向量,输出符号经过一个长度为L的FIR滤波器,经过滤波器的卷积处理后,每个子带的输出信号长度由N变成N+L-1,然后叠加构成一个完整的UFMC发送符号。

在这里插入图片描述

% 设计具有指定衰减的窗口
prototypeFilter = chebwin(filterLen, slobeAtten);

% 发送端处理,初始化数组
inpData = zeros(bitsPerSubCarrier*subbandSize, numSubbands);
txSig = complex(zeros(numFFT+filterLen-1, 1)); % 43 - 1  =》 L_CP = 42

hFig = figure;
axis([-0.5 0.5 -100 20]);hold on; grid on
xlabel('归一化频率');ylabel('PSD (dBW/Hz)')
title(['UFMC, ' num2str(numSubbands) ' Subbands, ' num2str(subbandSize) ' Subcarriers each'])

% 循环遍历每个子带
for bandIdx = 1:numSubbands

    bitsIn = randi([0 1], bitsPerSubCarrier*subbandSize, 1);% 4 * 20
    % QAM
    symbolsIn = qammod(bitsIn, 2^bitsPerSubCarrier, 'InputType', 'bit', 'UnitAveragePower', true);
    inpData(:,bandIdx) = bitsIn; % log bits for comparison
    
    % 将子带数据打包到OFDM符号中
    offset = subbandOffset+(bandIdx-1)*subbandSize; 
    symbolsInOFDM = [zeros(offset,1); symbolsIn; zeros(numFFT-offset-subbandSize, 1)];
    ifftOut = ifft(ifftshift(symbolsInOFDM));
    
    % 每个子带的滤波器在频率上进行移位
    bandFilter = prototypeFilter.*exp( 1i*2*pi*(0:filterLen-1)'/numFFT* ((bandIdx-1/2)*subbandSize+0.5+subbandOffset+numFFT/2) );    
    filterOut = conv(bandFilter,ifftOut);
    
    % 绘制每个子带的PSD
    [psd,f] = periodogram(filterOut, rectwin(length(filterOut)), numFFT*2, 1, 'centered'); 
    plot(f,10*log10(psd)); 
    
    % 对过滤的子带响应求和以形成聚合传输 
    % 信号
    txSig = txSig + filterOut;     
end
set(hFig, 'Position', figposition([20 50 25 30]));hold off;

在这里插入图片描述

% 计算PAPR
PAPR = comm.CCDF('PAPROutputPort', true, 'PowerUnits', 'dBW');
[~,~,paprUFMC] = PAPR(txSig);
disp(['PAPR for UFMC = ' num2str(paprUFMC) ' dB']);
PAPR for UFMC = 8.2379 dB

PAPR for UFMC = 8.2379 dB

2.3 OFDM调制

% OFDM 不使用循环前缀
symbolsIn = qammod(inpData(:), 2^bitsPerSubCarrier, 'InputType', 'bit', 'UnitAveragePower', true);

% 处理所有子带
offset = subbandOffset; % = 156
symbolsInOFDM = [zeros(offset, 1); symbolsIn; zeros(numFFT-offset-subbandSize*numSubbands, 1)];
ifftOut = sqrt(numFFT).*ifft(ifftshift(symbolsInOFDM));

% 绘制功率谱密度(PSD)
[psd,f] = periodogram(ifftOut, rectwin(length(ifftOut)), numFFT*2, 1, 'centered'); 
hFig1 = figure; 
plot(f,10*log10(psd)); grid on
axis([-0.5 0.5 -100 20]);
xlabel('归一化频率'); ylabel('PSD (dBW/Hz)')
title(['OFDM, ' num2str(numSubbands*subbandSize) ' Subcarriers'])
set(hFig1, 'Position', figposition([46 50 25 30]));

在这里插入图片描述

% 计算PAPR
PAPR2 = comm.CCDF('PAPROutputPort', true, 'PowerUnits', 'dBW');
[~,~,paprOFDM] = PAPR2(ifftOut);
disp(['PAPR for OFDM = ' num2str(paprOFDM) ' dB']);
PAPR for OFDM = 8.8843 dB

PAPR for OFDM = 8.8843 dB

2.4 UFMC Receiver with No Channel
接收端:通过在尾部加零的操作来使一个UFMC符号由N+L-1长度变成2N,然后进行2N点FFT计算,舍弃序号为奇数倍的数据,剩下的N点数据即为发送端发送的N点频域数据,然后解调即可得到发送数据。

在这里插入图片描述

% Add WGN
rxSig = awgn(txSig, snrdB, 'measured');


% Pad receive vector to twice the FFT Length (note use of txSig as input)
%   No windowing or additional filtering adopted
yRxPadded = [rxSig; zeros(2*numFFT-numel(txSig),1)];

% Perform FFT and downsample by 2
RxSymbols2x = fftshift(fft(yRxPadded));
RxSymbols = RxSymbols2x(1:2:end);

% Select data subcarriers
dataRxSymbols = RxSymbols(subbandOffset+(1:numSubbands*subbandSize));

% Plot received symbols constellation
constDiagRx = comm.ConstellationDiagram('ShowReferenceConstellation', ...
    false, 'Position', figposition([20 15 25 30]), ...
    'Title', 'UFMC Pre-Equalization Symbols', 'Name', 'UFMC Reception', ...
    'XLimits', [-150 150], 'YLimits', [-150 150]);
constDiagRx(dataRxSymbols);

在这里插入图片描述



% Use zero-forcing equalizer after OFDM demodulation
rxf = [prototypeFilter.*exp(1i*2*pi*0.5*(0:filterLen-1)'/numFFT); zeros(numFFT-filterLen,1)];
prototypeFilterFreq = fftshift(fft(rxf));
prototypeFilterInv = 1./prototypeFilterFreq(numFFT/2-subbandSize/2+(1:subbandSize));

% Equalize per subband - undo the filter distortion
dataRxSymbolsMat = reshape(dataRxSymbols,subbandSize,numSubbands);
EqualizedRxSymbolsMat = bsxfun(@times,dataRxSymbolsMat,prototypeFilterInv);
EqualizedRxSymbols = EqualizedRxSymbolsMat(:);

% Plot equalized symbols constellation
constDiagEq = comm.ConstellationDiagram('ShowReferenceConstellation', ...
    false, 'Position', figposition([46 15 25 30]), ...
    'Title', 'UFMC Equalized Symbols', 'Name', 'UFMC Equalization');
constDiagEq(EqualizedRxSymbols);

在这里插入图片描述

BER = comm.ErrorRate;

% Perform hard decision and measure errors
rxBits = qamdemod(EqualizedRxSymbols, 2^bitsPerSubCarrier, 'OutputType', 'bit', 'UnitAveragePower', true);
ber = BER(inpData(:), rxBits);

disp(['UFMC Reception, BER = ' num2str(ber(1)) ' at SNR = ' num2str(snrdB) ' dB']);
UFMC Reception, BER = 0 at SNR = 15 dB
rng(s);% Restore RNG state

注意:我使用的是MATLAB2019a,会提示:“comm.RectangularQAMDemodulator在以后的版本中将会被删除,请改用qamdemod”

猜你喜欢

转载自blog.csdn.net/qq_45908742/article/details/125405432
今日推荐