function [qam_out] = Qam4_mod(qam_in) %% 4QAM 调制函数%% 输入: 矩阵,列数必须是 4 的倍数, 01 序列%% 输出: 矩阵, 4qam 调制后的矩阵 global QamTable global bitPerSymbol; QamTable =[ -1-i, 1-i, -1+i, 1+i ]; [ m, n]= size(qam_in); qam_out = zeros(m,n/bitPerSymbol); for k= 1:m QamTmp = reshape(qam_in(k,:),bitPerSymbol,n/bitPerSymbol)'; QamTmpTmp = bi2de( QamTmp, 'left-msb'); qam_out(k, :)= QamTable( QamTmpTmp+1 ); end function [qam_out] = Qam4_demod(qam_in) %% 4QAM 解调函数%% 输入: 矩阵,列数必须是的的倍数%% 输出: 矩阵,解调后的 01 序列矩阵%% 之前必须调用过 global QamTable; global bitPerSymbol ; [m,n] = size(qam_in); qam_out = zeros(m,n*bitPerSymbol); % 判决 for k= 1:m delt = abs(reshape(qam_in(k,:), n, 1)*ones(1,4) - ones(n,1)*QamTable); % 求最近的点[tmp, index] = min(delt,[],2); % 得到索引值 qam_outTmp = de2bi(index-1,bitPerSymbol,'left-msb'); qam_out(k,:) = reshape(qam_outTmp',1,bitPerSymbol*n); end function [s_out] = ofdm_mod_neq( s_in ) %% ofdm 调制,无均衡%% 输入:二进制序列%% 输出: ofdm 调制后符号%global CP_len; global nSubC global ifft_len; global symbolPerCarrier; global bitPerSymbol; global CP_len; global carriers; len = length(s_in); SQam = reshape(s_in, nSubC,len/nSubC); % 串并转换 PQam = Qam4_mod(SQam); carriers = (1: nSubC) + (floor( ifft_len/4) - floor(nSubC/2)); conj_carriers = ifft_len - carriers + 2; P_IFFT = zeros(ifft_len, symbolPerCarrier );% 一个符号块,含 4 列训练序列, 1列0 P_IFFT(carriers,:) = PQam; P_IFFT(conj_carriers,:)=conj(PQam); %
OFDM仿真程序 来自淘豆网m.daumloan.com转载请标明出处.