基于BP/RBF神经网络的在线信道估计均衡算法matlab仿真

目录

一、理论基础

二、案例背景

1.问题描述

2.思路流程

三、部分MATLAB仿真

四、仿真结论分析

五、参考文献


一、理论基础

          RBF网络是一种三层前向网络,由输入到输出的映射是非线性的,而隐含层空间到输出空间的映射是线性的,从而大大加快了学习速度并避免局部极小问题。RBF网络结构如下图1所示。

 

 

二、案例背景

1.问题描述

         通过对导频序列和已知的导频序列进行神经网络训练,得到一个神经网络,对输入的新号进行实时的预测和估计。最后得到所要的接受信号。我们再介绍使用改进后的遗传算法对RBF神经网络进行优化,并进行信道估计的方法。

2.思路流程

 整个仿真系统的结构如上所示。

       这里,我们主要是通过对导频序列和已知的导频序列进行神经网络训练,得到一个神经网络,对输入的新号进行实时的预测和估计。最后得到所要的接受信号。

      整个流程基本如下所示:

检测导频位置;

提取导频

使用神经网络,将检测到的导频和已知的导频序列进行训练;

最后进行实时的预测和估计。

三、部分MATLAB仿真

clc;
clear all;
close all;
warning off;

addpath 'func\'


sel                 = 4;%选择1为RBF,选择2为BP,选择3为最理想情况,选择4为最垃圾情况
%%
%参数初始化
%是否加入多径
IF_multi            = 1;
%导频
mod_type            = 'QPSK';
IFFT_len            = 64;
Carriers            = 50;
bits_symbol         = 2;
symbols_per_carrier = 12;
%导频间隔
interval            = 5 ; 
Np                  = ceil(Carriers/interval)+1;
N_number            = Carriers*symbols_per_carrier*bits_symbol;
carriers            = 1:Carriers+Np;
%保护间隔长度
Cps                 = 8;             
SNR                 = [0:2.5:25];      
Stimes              = 10;%蒙特卡洛的仿真思路,每次SNR循环多次计算平均
X  = zeros(1,N_number);
X1 = [];
X2 = [];
X3 = [];
X4 = [];
X5 = [];
X6 = [];
X7 = [];
Y1 = [];
Y2 = [];
Y3 = [];
Y4 = [];
Y5 = [];
Y6 = [];
Y7 = [];
XX       = zeros(1,N_number);
dif_bit  = zeros(1,N_number);
dif_bit1 = zeros(1,N_number);
dif_bit2 = zeros(1,N_number);
dif_bit3 = zeros(1,N_number);


for tt = 1:Stimes
    tt
    %产生二进制随即序列
    X                           = func_signal_gen(N_number,Carriers);
    %QPSK调制
    [X1,X_initial]              = func_QPSK(X,N_number);
    %导频
    [pilot,training_symbols]    = func_pilot(symbols_per_carrier,Np,interval,Carriers);
    %串并
    X2                          = reshape(X1,symbols_per_carrier,Carriers);
    %插入导频
    [X3,signal]                 = func_pilot_insert(X2,pilot,Carriers,Np,training_symbols);
    %IFFT
    IFFT_modulation             = zeros(symbols_per_carrier,IFFT_len);
    IFFT_modulation(:,carriers) = X3;
    X4                          = ifft(IFFT_modulation,IFFT_len,2);
    %加循环前缀
    X6                          = func_cp(X4,symbols_per_carrier,IFFT_len,Cps);
    %并串
    X7                          = reshape(X6.',1,symbols_per_carrier*(IFFT_len+Cps));
    %信道
    if sel == 3
       Tx_data                  = X7; 
    else
       Tx_data                  = func_multipath_channel(X7,Carriers,IF_multi);
    end
    %高斯白噪声
    Error_ber  = [];
    Error_mse  = [];
    
    for snr_db = SNR
        RandStream.setDefaultStream(RandStream('mt19937ar','seed',tt));
        code_power  = 0;
        code_power  = [norm(Tx_data)]^2/(length(Tx_data));
        bit_power   = code_power/bits_symbol; 
        noise_power = 10*log10((bit_power/(10^(snr_db/10))));
        noise       = wgn(1,length(Tx_data),noise_power,'complex');
        %最后接收到的信号
        Y7          = Tx_data + noise;
        %串并变换
        Y6          = reshape(Y7,IFFT_len+Cps,symbols_per_carrier).';
        %去保护间隔
        Y5          = func_cp_del(Y6,symbols_per_carrier,IFFT_len,Cps);
        %FFT,傅立叶变换
        Y4          = fft(Y5,IFFT_len,2);
        Y3          = Y4(:,carriers);
        
        
        %进行信道估计
        if sel == 1 | sel == 3  | sel == 4 
            %实部
            [HLs_real,Y2_real] = func_RBF_channel_est(real(Y3),signal,pilot,symbols_per_carrier,Np,real(training_symbols),Carriers,interval);
            %虚部
            [HLs_imag,Y2_imag] = func_RBF_channel_est(imag(Y3),signal,pilot,symbols_per_carrier,Np,imag(training_symbols),Carriers,interval);
        end        
        if sel == 2
            %实部
            [HLs_real,Y2_real] = func_BP_channel_est(real(Y3),signal,pilot,symbols_per_carrier,Np,real(training_symbols),Carriers,interval);
            %虚部
            [HLs_imag,Y2_imag] = func_BP_channel_est(imag(Y3),signal,pilot,symbols_per_carrier,Np,imag(training_symbols),Carriers,interval);
        end
        Y2          = Y2_real +sqrt(-1)*Y2_imag;
        HLs         = HLs_real+sqrt(-1)*HLs_imag;
        if sel == 4
        Y1          = Y3(:,signal);  
        else
        Y1          = Y2;    
        end
        YY1         = reshape(Y1,N_number/bits_symbol,1);
        %QPSK解调
        [y_real1,y_image1,y_re1,y_im1] = func_deqpsk(YY1);
        r01 = [];
        r11 = [];
        for k=1:length(y_re1);
            r11 = [r11,[y_re1(k),y_im1(k)]];
        end
        
        dif_bit1        = round(X_initial - r11); 

        ber_snr1=0;
        for k=1:N_number;
            if dif_bit1(k)~=0;
               ber_snr1=ber_snr1+1;
           end
        end
        
        mse_snr1=0;
        for k=1:N_number;
            mse_snr1 = mse_snr1 + (dif_bit1(k))^2;
        end
        
     Error_ber = [Error_ber,ber_snr1];
     Error_mse = [Error_mse,mse_snr1]; 
    end
    BERs(:,tt) = Error_ber./N_number;
    MSEs(:,tt) = Error_mse./N_number;
end

Ber_avg = mean(BERs,2);
MSE_avg = mean(MSEs,2);

figure;
subplot(121);
semilogy(SNR,Ber_avg,'b-o');
grid on;
title('信噪比和误码率曲线');
xlabel('信噪比');
ylabel('误码率');
axis square;
axis([0,25,1e-4,1e0]);
subplot(122);
semilogy(SNR,MSE_avg,'b-o');
grid on;
title('信噪比和误码率曲线');
xlabel('信噪比');
ylabel('MSE');
axis square;
axis([0,25,1e-4,1e0]);

if sel == 1
   save rbf.mat SNR Ber_avg MSE_avg
end
if sel == 2
   save bp.mat SNR Ber_avg MSE_avg 
end
if sel == 3
   save best.mat SNR Ber_avg MSE_avg 
end
if sel == 4
   save worst.mat SNR Ber_avg MSE_avg 
end

四、仿真结论分析

       这里,我们增加了一组仿真对比,就是加入了最理想的情况和最恶劣的情况,最理想的情况是多径被完全抵消,即信道估计0误差的误码率,最恶劣的情况,是信道估计不工作的时候的误码率。从仿真结果可知,BP神经网络的估计性能略优于RBF神经网络的性能。

五、参考文献

[1]佚名. 基于免疫机制的RBF网络在OFDM信道估计中的应用[J]. 信息技术, 2007, 31(12):4.A05-13

猜你喜欢

转载自blog.csdn.net/ccsss22/article/details/126257521