www.gusucode.com > MIMO_OFDM系统的matlab仿真程序以及GUI界面的实现源码程序 > CH9/channel.m
function rx_signal = channel(tx_signal, cir, SimulationParameters,SNR); global SimulationConstants; [n_tx_antennas, n_rx_antennas] = get_n_antennas(SimulationParameters); if SimulationParameters.VBLAST~=1 % Channel effect rx_signal = zeros(n_rx_antennas, size(tx_signal,2)+size(cir,2)-1); for rx_ant = 1:n_rx_antennas for tx_ant = 1:n_tx_antennas rx_signal(rx_ant,:) = rx_signal(rx_ant,:) + ... conv(tx_signal(tx_ant,:), cir((rx_ant-1)*n_tx_antennas+tx_ant,:)); end end else % go vblast temp=size(tx_signal,1); if temp==1 & SimulationParameters.N==2 cir11=get_channel_ir(SimulationParameters); cir12=get_channel_ir(SimulationParameters); cir11=cir11(1); cir12=cir12(1); save cir11 cir11; save cir12 cir12; cir_mimo=[cir11;cir12]; % Channel effect rx_signal = zeros(n_rx_antennas, size(tx_signal,2)+size(cir_mimo,2)-1); for tx_ant = 1:n_tx_antennas for rx_ant = 1:n_rx_antennas rx_signal(rx_ant,:) = rx_signal(rx_ant,:) + ... conv(tx_signal(tx_ant,:), cir_mimo(rx_ant,tx_ant)); end end elseif temp==2 & SimulationParameters.N==2 cir11=get_channel_ir(SimulationParameters); cir12=get_channel_ir(SimulationParameters); cir21=get_channel_ir(SimulationParameters); cir22=get_channel_ir(SimulationParameters); cir11=cir11(1); cir12=cir12(1); cir21=cir21(1); cir22=cir22(1); save cir_22 cir11 cir12 cir21 cir22 ; cir_mimo1=[cir11;cir12]; cir_mimo2=[cir21;cir22]; cir_mimo=[cir_mimo1 cir_mimo2]; % Channel effect rx_signal = zeros(n_rx_antennas, size(tx_signal,2)+size(cir_mimo,2)-2); for tx_ant = 1:n_tx_antennas for rx_ant = 1:n_rx_antennas rx_signal(rx_ant,:) = rx_signal(rx_ant,:) + ... conv(tx_signal(tx_ant,:), cir_mimo(rx_ant,tx_ant)); end end elseif temp==2 & SimulationParameters.N==3 cir11=get_channel_ir(SimulationParameters); cir12=get_channel_ir(SimulationParameters); cir13=get_channel_ir(SimulationParameters); cir21=get_channel_ir(SimulationParameters); cir22=get_channel_ir(SimulationParameters); cir23=get_channel_ir(SimulationParameters); cir11=cir11(1); cir12=cir12(1); cir13=cir13(1); cir21=cir21(1); cir22=cir22(1); cir23=cir23(1); save cir_23 cir11 cir12 cir13 cir21 cir22 cir23 ; cir_mimo1=[cir11;cir12;cir13]; cir_mimo2=[cir21;cir22;cir23]; cir_mimo=[cir_mimo1 cir_mimo2]; % Channel effect rx_signal = zeros(n_rx_antennas, size(tx_signal,2)+size(cir_mimo,2)-2); for tx_ant = 1:n_tx_antennas for rx_ant = 1:n_rx_antennas rx_signal(rx_ant,:) = rx_signal(rx_ant,:) + ... conv(tx_signal(tx_ant,:), cir_mimo(rx_ant,tx_ant)); end end elseif temp==2 & SimulationParameters.N==4 cir11=get_channel_ir(SimulationParameters); cir12=get_channel_ir(SimulationParameters); cir13=get_channel_ir(SimulationParameters); cir14=get_channel_ir(SimulationParameters); cir21=get_channel_ir(SimulationParameters); cir22=get_channel_ir(SimulationParameters); cir23=get_channel_ir(SimulationParameters); cir24=get_channel_ir(SimulationParameters); cir11=cir11(1); cir12=cir12(1); cir13=cir13(1); cir14=cir14(1); cir21=cir21(1); cir22=cir22(1); cir23=cir23(1); cir24=cir24(1); save cir_24 cir11 cir12 cir13 cir14 cir21 cir22 cir23 cir24; cir_mimo1=[cir11;cir12;cir13;cir14]; cir_mimo2=[cir21;cir22;cir23;cir24]; cir_mimo=[cir_mimo1 cir_mimo2]; % Channel effect rx_signal = zeros(n_rx_antennas, size(tx_signal,2)+size(cir_mimo,2)-2); for tx_ant = 1:n_tx_antennas for rx_ant = 1:n_rx_antennas rx_signal(rx_ant,:) = rx_signal(rx_ant,:) + ... conv(tx_signal(tx_ant,:), cir_mimo(rx_ant,tx_ant)); end end end end len = size(rx_signal,2); % Add noise % calculate noise variance % Number of FFT points normalizes the noise with the used subcarrier number if SimulationParameters.ZeroPad~=1 numdatasubc=1; else numdatasubc=SimulationConstants.NumDataSubc; end noise_var = 1/((SimulationParameters.FFTPoints/numdatasubc)*(10^(SNR/10))); noise = sqrt(noise_var) * (randn(n_rx_antennas, len) + j*randn(n_rx_antennas, len)); % add noise rx_signal = rx_signal+noise;