www.gusucode.com > MIMO_OFDM系统的matlab仿真程序以及GUI界面的实现源码程序 > CH9/rx_diversity.m
function [data_syms_out] = rx_diversity(freq_data_syms, ... channel_est, SimulationParameters) % remove extra dimension from matrices, if rx diversity is not used freq_data_syms = squeeze(freq_data_syms); % tx diversity % Radon-Hurwitz transmit diversity if (SimulationParameters.TxDiv==2 & SimulationParameters.RxDiv==0) % 2x1 freq_data_syms = rx_radon_hurwitz(freq_data_syms, channel_est(:,:),SimulationParameters); elseif (SimulationParameters.TxDiv==4 & SimulationParameters.RxDiv==0)%4x1 [freq_data_syms] = txfour(freq_data_syms,channel_est,SimulationParameters,3); data_syms_out=freq_data_syms; elseif (SimulationParameters.TxDiv==2 & SimulationParameters.RxDiv==2)%2x2 % Rx R-H performed to both receiver antennas freq_data_syms(1,:,:) = rx_radon_hurwitz(squeeze(freq_data_syms(1,:,:)), ... channel_est(:,1:2),SimulationParameters); freq_data_syms(2,:,:) = rx_radon_hurwitz(squeeze(freq_data_syms(2,:,:)), ... channel_est(:,3:4),SimulationParameters); elseif (SimulationParameters.TxDiv==2 & SimulationParameters.RxDiv==4)%2x4 freq_data_syms(1,:,:) = rx_radon_hurwitz(squeeze(freq_data_syms(1,:,:)), ... channel_est(:,1:2),SimulationParameters); freq_data_syms(2,:,:) = rx_radon_hurwitz(squeeze(freq_data_syms(2,:,:)), ... channel_est(:,3:4),SimulationParameters); freq_data_syms(3,:,:) = rx_radon_hurwitz(squeeze(freq_data_syms(3,:,:)), ... channel_est(:,5:6),SimulationParameters); freq_data_syms(4,:,:) = rx_radon_hurwitz(squeeze(freq_data_syms(4,:,:)), ... channel_est(:,7:8),SimulationParameters); elseif (SimulationParameters.TxDiv==4 & SimulationParameters.RxDiv==2) %4x2 channel_est=channel_est(:,:); [freq_data_syms] = txfour(freq_data_syms(1:2,:,:),channel_est,SimulationParameters,1); data_syms_out=freq_data_syms; elseif (SimulationParameters.TxDiv==4 & SimulationParameters.RxDiv==4) %4x4 % Rx R-H performed to 4 receiver antennas [freq_data_syms1] = txfour(freq_data_syms(1:2,:,:),channel_est,SimulationParameters,1); [freq_data_syms2] = txfour(freq_data_syms(3:4,:,:),channel_est,SimulationParameters,2); data_syms_out=[freq_data_syms1 freq_data_syms2]; end % rx diversity if (SimulationParameters.TxDiv==0 & SimulationParameters.RxDiv==2)|(SimulationParameters.TxDiv==0 & SimulationParameters.RxDiv==4) %1x2,1x4 freq_data_syms = rx_mr_combiner(freq_data_syms, channel_est, SimulationParameters); elseif SimulationParameters.TxDiv==2 & SimulationParameters.RxDiv==2 %2x2 freq_data_syms = squeeze(freq_data_syms(1,:,:) + freq_data_syms(2,:,:)); elseif SimulationParameters.TxDiv==2 & SimulationParameters.RxDiv==4 %2x4 freq_data_syms = squeeze(freq_data_syms(1,:,:) + freq_data_syms(2,:,:)+freq_data_syms(3,:,:) + freq_data_syms(4,:,:)); end % no diversity if (SimulationParameters.TxDiv==0 & SimulationParameters.RxDiv==0) %1x1 % Data symbols channel correction chan_corr_mat = repmat(channel_est,1, size(freq_data_syms,2)); freq_data_syms = freq_data_syms.*conj(chan_corr_mat); end if (SimulationParameters.TxDiv==0 & SimulationParameters.RxDiv==0)|(SimulationParameters.TxDiv==0 & SimulationParameters.RxDiv==2)| ... (SimulationParameters.TxDiv==2 & SimulationParameters.RxDiv==0)|(SimulationParameters.TxDiv==2 & SimulationParameters.RxDiv==2)| ... (SimulationParameters.TxDiv==0 & SimulationParameters.RxDiv==4)|(SimulationParameters.TxDiv==2 & SimulationParameters.RxDiv==4) %1x1,1x2,2x1,2x2,1x4,2x4 % Amplitude normalization chan_sq_amplitude = sum(abs(channel_est(:,:)).^2, 2); chan_sq_amplitude_mtx = repmat(chan_sq_amplitude,1, size(freq_data_syms,2)); data_syms_out = freq_data_syms./chan_sq_amplitude_mtx; end