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


    目录

    一、理论基础

    二、案例背景

    1.问题描述

    2.思路流程

    三、部分MATLAB仿真

    四、仿真结论分析

    五、参考文献


    一、理论基础

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

     

     

    二、案例背景

    1.问题描述

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

    2.思路流程

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

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

          整个流程基本如下所示:

    检测导频位置;

    提取导频

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

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

    三、部分MATLAB仿真

    1. clc;
    2. clear all;
    3. close all;
    4. warning off;
    5. addpath 'func\'
    6. sel = 4;%选择1为RBF,选择2为BP,选择3为最理想情况,选择4为最垃圾情况
    7. %%
    8. %参数初始化
    9. %是否加入多径
    10. IF_multi = 1;
    11. %导频
    12. mod_type = 'QPSK';
    13. IFFT_len = 64;
    14. Carriers = 50;
    15. bits_symbol = 2;
    16. symbols_per_carrier = 12;
    17. %导频间隔
    18. interval = 5 ;
    19. Np = ceil(Carriers/interval)+1;
    20. N_number = Carriers*symbols_per_carrier*bits_symbol;
    21. carriers = 1:Carriers+Np;
    22. %保护间隔长度
    23. Cps = 8;
    24. SNR = [0:2.5:25];
    25. Stimes = 10;%蒙特卡洛的仿真思路,每次SNR循环多次计算平均
    26. X = zeros(1,N_number);
    27. X1 = [];
    28. X2 = [];
    29. X3 = [];
    30. X4 = [];
    31. X5 = [];
    32. X6 = [];
    33. X7 = [];
    34. Y1 = [];
    35. Y2 = [];
    36. Y3 = [];
    37. Y4 = [];
    38. Y5 = [];
    39. Y6 = [];
    40. Y7 = [];
    41. XX = zeros(1,N_number);
    42. dif_bit = zeros(1,N_number);
    43. dif_bit1 = zeros(1,N_number);
    44. dif_bit2 = zeros(1,N_number);
    45. dif_bit3 = zeros(1,N_number);
    46. for tt = 1:Stimes
    47. tt
    48. %产生二进制随即序列
    49. X = func_signal_gen(N_number,Carriers);
    50. %QPSK调制
    51. [X1,X_initial] = func_QPSK(X,N_number);
    52. %导频
    53. [pilot,training_symbols] = func_pilot(symbols_per_carrier,Np,interval,Carriers);
    54. %串并
    55. X2 = reshape(X1,symbols_per_carrier,Carriers);
    56. %插入导频
    57. [X3,signal] = func_pilot_insert(X2,pilot,Carriers,Np,training_symbols);
    58. %IFFT
    59. IFFT_modulation = zeros(symbols_per_carrier,IFFT_len);
    60. IFFT_modulation(:,carriers) = X3;
    61. X4 = ifft(IFFT_modulation,IFFT_len,2);
    62. %加循环前缀
    63. X6 = func_cp(X4,symbols_per_carrier,IFFT_len,Cps);
    64. %并串
    65. X7 = reshape(X6.',1,symbols_per_carrier*(IFFT_len+Cps));
    66. %信道
    67. if sel == 3
    68. Tx_data = X7;
    69. else
    70. Tx_data = func_multipath_channel(X7,Carriers,IF_multi);
    71. end
    72. %高斯白噪声
    73. Error_ber = [];
    74. Error_mse = [];
    75. for snr_db = SNR
    76. RandStream.setDefaultStream(RandStream('mt19937ar','seed',tt));
    77. code_power = 0;
    78. code_power = [norm(Tx_data)]^2/(length(Tx_data));
    79. bit_power = code_power/bits_symbol;
    80. noise_power = 10*log10((bit_power/(10^(snr_db/10))));
    81. noise = wgn(1,length(Tx_data),noise_power,'complex');
    82. %最后接收到的信号
    83. Y7 = Tx_data + noise;
    84. %串并变换
    85. Y6 = reshape(Y7,IFFT_len+Cps,symbols_per_carrier).';
    86. %去保护间隔
    87. Y5 = func_cp_del(Y6,symbols_per_carrier,IFFT_len,Cps);
    88. %FFT,傅立叶变换
    89. Y4 = fft(Y5,IFFT_len,2);
    90. Y3 = Y4(:,carriers);
    91. %进行信道估计
    92. if sel == 1 | sel == 3 | sel == 4
    93. %实部
    94. [HLs_real,Y2_real] = func_RBF_channel_est(real(Y3),signal,pilot,symbols_per_carrier,Np,real(training_symbols),Carriers,interval);
    95. %虚部
    96. [HLs_imag,Y2_imag] = func_RBF_channel_est(imag(Y3),signal,pilot,symbols_per_carrier,Np,imag(training_symbols),Carriers,interval);
    97. end
    98. if sel == 2
    99. %实部
    100. [HLs_real,Y2_real] = func_BP_channel_est(real(Y3),signal,pilot,symbols_per_carrier,Np,real(training_symbols),Carriers,interval);
    101. %虚部
    102. [HLs_imag,Y2_imag] = func_BP_channel_est(imag(Y3),signal,pilot,symbols_per_carrier,Np,imag(training_symbols),Carriers,interval);
    103. end
    104. Y2 = Y2_real +sqrt(-1)*Y2_imag;
    105. HLs = HLs_real+sqrt(-1)*HLs_imag;
    106. if sel == 4
    107. Y1 = Y3(:,signal);
    108. else
    109. Y1 = Y2;
    110. end
    111. YY1 = reshape(Y1,N_number/bits_symbol,1);
    112. %QPSK解调
    113. [y_real1,y_image1,y_re1,y_im1] = func_deqpsk(YY1);
    114. r01 = [];
    115. r11 = [];
    116. for k=1:length(y_re1);
    117. r11 = [r11,[y_re1(k),y_im1(k)]];
    118. end
    119. dif_bit1 = round(X_initial - r11);
    120. ber_snr1=0;
    121. for k=1:N_number;
    122. if dif_bit1(k)~=0;
    123. ber_snr1=ber_snr1+1;
    124. end
    125. end
    126. mse_snr1=0;
    127. for k=1:N_number;
    128. mse_snr1 = mse_snr1 + (dif_bit1(k))^2;
    129. end
    130. Error_ber = [Error_ber,ber_snr1];
    131. Error_mse = [Error_mse,mse_snr1];
    132. end
    133. BERs(:,tt) = Error_ber./N_number;
    134. MSEs(:,tt) = Error_mse./N_number;
    135. end
    136. Ber_avg = mean(BERs,2);
    137. MSE_avg = mean(MSEs,2);
    138. figure;
    139. subplot(121);
    140. semilogy(SNR,Ber_avg,'b-o');
    141. grid on;
    142. title('信噪比和误码率曲线');
    143. xlabel('信噪比');
    144. ylabel('误码率');
    145. axis square;
    146. axis([0,25,1e-4,1e0]);
    147. subplot(122);
    148. semilogy(SNR,MSE_avg,'b-o');
    149. grid on;
    150. title('信噪比和误码率曲线');
    151. xlabel('信噪比');
    152. ylabel('MSE');
    153. axis square;
    154. axis([0,25,1e-4,1e0]);
    155. if sel == 1
    156. save rbf.mat SNR Ber_avg MSE_avg
    157. end
    158. if sel == 2
    159. save bp.mat SNR Ber_avg MSE_avg
    160. end
    161. if sel == 3
    162. save best.mat SNR Ber_avg MSE_avg
    163. end
    164. if sel == 4
    165. save worst.mat SNR Ber_avg MSE_avg
    166. end

    四、仿真结论分析

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

    五、参考文献

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

  • 相关阅读:
    js实现鼠标拖拽改变div大小的同时另一个div宽度也变化
    成功解决:_vm.Login is not a function
    6-8 舞伴问题 分数 15
    Linux应用调试之使用strace命令跟踪系统调用
    一文吃透接口调用神器RestTemplate
    刷题笔记之六(扑克牌大小+最近公共祖先+求最大连续bit数+二进制插入)
    【开源教程6】疯壳·开源编队无人机-遥控器固件烧写
    Python学习笔记之进程池pool
    【cmake】find_package设置查找路径
    CUDA环境配置问题
  • 原文地址:https://blog.csdn.net/ccsss22/article/details/126257521