F-OFDM技术

对一篇F-OFDM技术博客的一点补充代码

1.源博客

本文代码基于源博客进行,运行环境matlab r2023a,在此环境源博客代码也可正常运行,且有更加丰富的工具箱。

F-OFDM 系统简单Matlab搭建-CSDN博客

 2.源论文

3.补充调制与解调 QPSK、16QAM、64QAM

主文件中

1)发送端调制

M_1_object = M_1;
rrcFilterNum_M_1 = M_1_object.Numerator;
% wvtool(rrcFilterNum_M_1);
%fvtool(rrcFilterNum_M_1);
% pwelch(rrcFilterNum_M_1);
M_2_object = M_2;
rrcFilterNum_M_2 = M_2_object.Numerator;
M_3_object = M_3;
rrcFilterNum_M_3 = M_3_object.Numerator;

N_fft_1 = 2048;
N_fft_2 = 1024;
N_fft_3 = 8192;
band_width = 720000;    
Sc_spacing_1 = 15000;   
Sc_spacing_2 = 30000;
Sc_spacing_3 = 3750;

N1 = 0;
N21 = 3;
N22 = 3;
N3 = 0;
N_symbol_1 = 7;
N_symbol_2 = 5;
N_symbol_3 = 3;
Num_frame_3 = 1000;

Time_1 = 0.5/Num_frame_3; 
Time_2 = 0.2/Num_frame_3; 
Time_3 = 1/Num_frame_3; 
N_sc_1 = band_width/Sc_spacing_1;
N_sc_2 = band_width/Sc_spacing_2;
N_sc_3 = band_width/Sc_spacing_3;

M_2_min = 76;
M_2_max = 99;
M_1_min = (M_2_min - 1 - N21)*Sc_spacing_2/Sc_spacing_1 -N1 -N_sc_1 +1;
M_1_max = (M_2_min - 1 - N21)*Sc_spacing_2/Sc_spacing_1 -N1;
M_3_min = (M_2_max + N22)*Sc_spacing_2/Sc_spacing_3 +N3 +1;
M_3_max = (M_2_max + N22)*Sc_spacing_2/Sc_spacing_3 +N3 +N_sc_3;


% QPSK
qamMapper1 = comm.RectangularQAMModulator( ...
    'ModulationOrder', 4, 'BitInput', true, ...
    'NormalizationMethod', 'Average power');

bitsIn1 = randi([0 1], 96, 1);
symbolsIn1 = qamMapper1(bitsIn1);%QPSK 
%figure(1);scatter(real(symbolsIn1),imag(symbolsIn1),'*b');
%figure(1);scatter(real(symbolsIn1),imag(symbolsIn1),'.b');作图

% 16QAM  2
qamMapper2 = comm.RectangularQAMModulator( ...
    'ModulationOrder', 16, 'BitInput', true, ...
    'NormalizationMethod', 'Average power');

bitsIn2 = randi([0 1], 96, 1);%
symbolsIn2 = qamMapper2(bitsIn2);%16QAM  
%figure(2);scatter(real(symbolsIn2),imag(symbolsIn2),'*b');title('      16QAM     ');作图

% 64QAM   3
qamMapper3 = comm.RectangularQAMModulator( ...
    'ModulationOrder', 64, 'BitInput', true, ...
    'NormalizationMethod', 'Average power');

bitsIn3 = randi([0 1], 1152, 1);
symbolsIn3 = qamMapper3(bitsIn3);%64QAM  
 
%figure(3);scatter(real(symbolsIn3),imag(symbolsIn3),'*b');title('   64QAM   ');作图
%OFDM
M_1_seq_symbol = [zeros(M_1_min-1,1);symbolsIn1;zeros(N_fft_1-M_1_max,1)];
M_2_seq_symbol = [zeros(M_2_min-1,1);symbolsIn2;zeros(N_fft_2-M_2_max,1)];
M_3_seq_symbol = [zeros(M_3_min-1,1);symbolsIn3;zeros(N_fft_3-M_3_max,1)];

2)接收端解调(以QPSK为例)

%QPSK解调
qamDemod1 = comm.RectangularQAMDemodulator('ModulationOrder', ...
    4, 'BitOutput', true, ...
    'NormalizationMethod', 'Average power');
data_rx_filter_1=upfirdn(data_sum_channel,rrcFilterNum_M_1,1); 
data_rx_filter_1_final = data_rx_filter_1((length(rrcFilterNum_M_1)-1)/2+1:end-((length(rrcFilterNum_M_1)-1)/2));
data_rx_filter_1_final_7 = reshape(data_rx_filter_1_final,length(data_rx_filter_1_final)*Time_1,1/Time_1);
data_rx_filter_1_final_7_1 = reshape(data_rx_filter_1_final_7(cpLen_1_1-cpLen_1_6+1:end,:),cpLen_1_6+N_fft_1,N_symbol_1/Time_1);
data_rx_filter_1_final_7_2 = data_rx_filter_1_final_7_1(cpLen_1_6+1:end,:);
data_rx_1_symbol_1_f = fft(data_rx_filter_1_final_7_2,N_fft_1)/sqrt(N_fft_1);

rxBits1 = qamDemod1(data_rx_1_symbol_1_f(M_1_min:M_1_max,1));
ber1 = BER(bitsIn1 , rxBits1);
ErrorSample_1(i)=ber1(1,1);
fprintf('Ber1 = %.6f\n',ErrorSample_1(i));%误码率

选取一列查看误码率

4. 加入削峰技术,降低信号峰均比,众所周知峰均比高是ofdm的一个缺点

在发送端使用简单的直接削峰法

    %设置你想要的限幅比
    CR=4;
    Signal_Power = abs(txSigOFDM_1_slot.^2);
    
    Peak_Power   = max(max(Signal_Power));
    Mean_Power   = mean(Signal_Power);
    PAPR= 10*log10(Peak_Power/Mean_Power);
   % PAPR_Orignal(nSymbol,1) = 10*log10(Peak_Power./Mean_Power);
   
    for nIter=1:2000

        % 迭代削峰
      [M,I] = max(txSigOFDM_1_slot(:));
      [I_row, I_col] = ind2sub(size(txSigOFDM_1_slot),I)

        if Signal_Power(I_row, I_col)>CR*Mean_Power
           x_tmp1=txSigOFDM_1_slot(I_row, I_col); 
           x_tmp = sqrt(CR*Mean_Power)*x_tmp1/abs(x_tmp1);
           txSigOFDM_1_slot(I_row, I_col) = x_tmp;
        end

         Signal_Power = abs(txSigOFDM_1_slot.^2);
     end
        
        % PAPR 计算
    
        Peak_Power1   = max(max(Signal_Power));
        Mean_Power1   = mean(Signal_Power);
        PAPR1= 10*log10(Peak_Power1/Mean_Power1);
    

备注:1.直接削峰在形成txSigOFDM_1_slot信号(源代码中表示的名字)后进行。

           2.经过结果仿真可以看出削峰后峰均比下降,但滤波后峰均比又会上升这一现象。

           3.使用直接法其实不合适吧,但为了简单方便、能快的观察到原理现象所以采用直接法。

5.结语

本文存在不足,期望大家的批评指正和进一步完善,共建良好开源社区环境。
    

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值