- Visual C++源码
- Visual Basic源码
- C++ Builder源码
- Java源码
- Delphi源码
- C/C++源码
- PHP源码
- Perl源码
- Python源码
- Asm源码
- Pascal源码
- Borland C++源码
- Others源码
- SQL源码
- VBScript源码
- JavaScript源码
- ASP/ASPX源码
- C#源码
- Flash/ActionScript源码
- matlab源码
- PowerBuilder源码
- LabView源码
- Flex源码
- MathCAD源码
- VBA源码
- IDL源码
- Lisp/Scheme源码
- VHDL源码
- Objective-C源码
- Fortran源码
- tcl/tk源码
- QT源码
channel_estimator.m
资源名称:444.zip [点击查看]
上传用户:gzcxg999
上传日期:2021-07-15
资源大小:190k
文件大小:7k
源码类别:
matlab例程
开发平台:
CHM
- function [channel_est , mse] = channel_estimator( training_sym ,CE_Method ,CE_Method2 ,...
- CE_SubcRemain ,H_freq ,known_training, N_Tx_ant, N_Rx_ant,...
- N_subc,N_used, Idx_used,Modulation,var_noise,TurnOn )
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % 实现信道估计算法
- % 单天线的信道估计算法:
- % 1 - 基本LS算法; 2 - LS的DFT改进算法; 3 - 加判决反馈的LS-DFT
- % 4 - 基本MMSE算法; 5 - MMSE的DFT改进算法; 6 - 加判决反馈的MMSE-DFT
- % 7 - 使用SVD分解算法; 8 - Robust算法
- % 多天线信道估计方法
- % 1 - 多天线基本LS算法
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- if TurnOn
- if N_Tx_ant == 1
- % 单天线信道估计
- channel_est = zeros(N_subc,1,N_Rx_ant);
- Idx_tmp1 = reshape(Idx_used(1:N_used/2),2,N_used/4);
- Idx_tmp2 = reshape(Idx_used(N_used/2+1:N_used),2,N_used/4);
- Idx_even = [Idx_tmp1(1,:) Idx_tmp2(2,:)]; % 举例: 113,为-400位置的子载波,为偶数位置
- Idx_odd = [Idx_tmp1(2,:) Idx_tmp2(1,:)]; % 举例: 114,为-399位置的子载波,为奇数位置
- for n_r = 1:N_Rx_ant
- % 先对导频位置的信道响应进行LS估计
- ch_ls = zeros(N_subc,1);
- ch_ls_even = training_sym(Idx_even,1,n_r).*conj(known_training(Idx_even,2))./...
- abs(known_training(Idx_even,2)).^2 ;
- % 然后再进行插值,得到所有使用的子载波上的信道响应
- ch_ls_odd = interp1( Idx_even, ch_ls_even, Idx_odd, 'linear' ); % 线性插值
- % 得到整个频率区域上的频域信道响应
- ch_ls(Idx_even) = ch_ls_even;
- ch_ls(Idx_odd) = ch_ls_odd;
- % 理想的信道响应
- ideal_ch = H_freq(:,2,n_r);
- switch CE_Method
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % 基本LS算法
- case 1
- channel_est(:,1,n_r) = ch_ls;
- diff = (ideal_ch - ch_ls);
- mse(n_r) = sum( diff(Idx_used).'*conj(diff(Idx_used)) )/N_used;
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % LS的DFT改进算法
- case 2
- % 变换到时域
- time_domain = ifft(fftshift(ch_ls)) * sqrt(N_subc) ;
- time_cut = zeros(N_subc,1);
- leakage = 20; % 能量泄漏的子载波数
- % 取时域能量集中的样点
- time_cut( 1: CE_SubcRemain ) = time_domain( 1: CE_SubcRemain );
- time_cut( N_subc - leakage : N_subc ) = time_domain( N_subc - leakage : N_subc );
- % 变换到频域
- ch_ls_dft = fftshift(fft(time_cut) * 1/sqrt(N_subc));
- channel_est(:,1,n_r) = ch_ls_dft;
- diff = (ideal_ch - ch_ls_dft);
- mse(n_r) = sum( diff(Idx_used).'*conj(diff(Idx_used)) )/N_used;
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % 加判决反馈的LS-DFT
- case 3
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % 基本MMSE算法
- case 4
- R_freq_H = ideal_ch * ideal_ch'; % 乘上共轭转置,得到频域信道协方差矩阵
- switch Modulation
- case 1
- constel_para = 1;
- case 2
- constel_para = 0.5;
- case 3
- constel_para = 1/3;
- case 4
- constel_para = 17/90;
- case 6
- constel_para = 0.0639;
- otherwise
- constel_para = 1;
- end
- % 根据信道频域响应的自相关矩阵,高斯白噪的功率,产生MMSE估计的矩阵W
- W = R_freq_H * inv( R_freq_H + var_noise*constel_para*eye(N_subc));
- ch_mmse = W*ch_ls;
- channel_est(:,1,n_r) = ch_mmse;
- diff = (ideal_ch - ch_mmse);
- mse(n_r) = sum( diff(Idx_used).'*conj(diff(Idx_used)) )/N_used;
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % MMSE的DFT改进算法
- case 5
- R_freq_H = ideal_ch * ideal_ch'; % 乘上共轭转置,得到频域信道协方差矩阵
- switch Modulation
- case 1
- constel_para = 1;
- case 2
- constel_para = 0.5;
- case 3
- constel_para = 1/3;
- case 4
- constel_para = 17/90;
- case 6
- constel_para = 0.0639;
- otherwise
- constel_para = 1;
- end
- % 根据信道频域响应的自相关矩阵,高斯白噪的功率,产生MMSE估计的矩阵W
- W = R_freq_H * inv( R_freq_H + var_noise*constel_para*eye(N_subc));
- % 载入FFT和IFFT矩阵
- fft_matrix = zeros(N_subc,N_subc);
- for j = 1:N_subc
- for k =1:N_subc
- fft_matrix(j,k) = exp( complex(0,(-2*pi/N_subc)) * (j-1) *(k-1) )/sqrt(N_subc);
- end
- end
- ifft_matrix = fft_matrix';
- Q_tmp = ifft_matrix * W *fft_matrix;
- Q = zeros(N_subc,N_subc);
- % 保留能量最为集中的前CE_SubcRemain个
- Q(1:CE_SubcRemain,1:CE_SubcRemain) = Q_tmp(1:CE_SubcRemain,1:CE_SubcRemain);
- % 把LS估计值变换到时域,乘上Q矩阵,再变换到频域
- time_domain = ifft(fftshift(ch_ls)) * sqrt(N_subc) ;
- time_tmp = Q * time_domain;
- ch_mmse_dft = fftshift(fft(time_tmp) * 1/sqrt(N_subc));
- channel_est(:,1,n_r) = ch_mmse_dft;
- diff = (ideal_ch - ch_mmse_dft);
- mse(n_r) = sum( diff(Idx_used).'*conj(diff(Idx_used)) )/N_used;
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % 加判决反馈的MMSE-DFT
- case 6
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % 使用SVD分解算法
- case 7
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % Robust算法
- case 8
- otherwise
- end
- end
- mse = abs(sum(mse))/N_Rx_ant;
- else
- % 多天线信道估计
- end
- else
- channel_est = H_freq(:,2,:); % 假设已知第二个OFDM符号的信道响应
- mse = 0;
- end