• 无线通信与编码_新型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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    在这里插入图片描述

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

    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]));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述

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

    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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这里插入图片描述

    
    
    % 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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

    ***声明:所使用的代码来自MATLAB官方文档,略有修改

  • 相关阅读:
    Flutter框架实现登录注册功能,不连接数据库
    React报错之map() is not a function
    传奇单机架设教程,五分钟完成单机架设
    图像的特征类别
    Android SDK安装配置学习
    Kafka入门介绍一
    【Rust】简介、安装和编译
    cadence SPB17.4 - allegro - Allegro2Altium.bat 初探
    CountDownLatch
    基于JavaGUI的图书管理系统
  • 原文地址:https://blog.csdn.net/qq_45908742/article/details/125405432