📄 transmitter.m
字号:
%OFDM transmitter
function [tx_signal, inf_bits, tx_bits] = transmitter(sys_parm)
global ofdm_data_parm_const;
global ofdm_data_parm_var;
%Initinal
tx_signal = [];
PackLenth = 0;
bit_index = 0;
ofdm_data_parm_var.Index = 0;
for n = 1 : sys_parm.NumOFDMSymbols
%Update the ofdm_data_parm_var
update_ofdm_data_parm_var;
PackLenth = PackLenth + ofdm_data_parm_var.NumBits;
end
%General the information bits
inf_bits = randint(1, PackLenth / 2);
%Define trellis.
trellis = poly2trellis(7, [155 171]);
%Encode a string of ones.
tx_bits = convenc(inf_bits, trellis);
ofdm_data_parm_var.Index = 0;
%For loop
for n = 1 : sys_parm.NumOFDMSymbols
%Update the ofdm_data_parm_var
update_ofdm_data_parm_var;
raw_bits = tx_bits(bit_index + 1 : bit_index + ofdm_data_parm_var.NumBits);
bit_index = bit_index + ofdm_data_parm_var.NumBits;
%Modulation
switch ofdm_data_parm_const.Modulation
case 0 %BSK
mod_in = bi2de(reshape(raw_bits, 1, ofdm_data_parm_var.NumDataSubc)', 'left-msb')';
mod_out = pskmod(mod_in, 2);
case 1 %4PSK
mod_in = bi2de(reshape(raw_bits, 2, ofdm_data_parm_var.NumDataSubc)', 'left-msb')';
mod_out = pskmod(mod_in, 4);
case 2 %16QAM
mod_in = bi2de(reshape(raw_bits, 4, ofdm_data_parm_var.NumDataSubc)', 'left-msb')';
mod_out = qammod(mod_in, 16) / sqrt(10);
case 3 %64QAM
mod_in = bi2de(reshape(raw_bits, 6, ofdm_data_parm_var.NumDataSubc)', 'left-msb')';
mod_out = qammod(mod_in, 64) / sqrt(42);
end
%Add pilot and modify the transmit power
ifft_in = zeros(1, sys_parm.TotNumSubc);
mod_out = mod_out .* ofdm_data_parm_var.TransmitPower;
ifft_in(ofdm_data_parm_var.DataSubcIdx) = mod_out;
if ofdm_data_parm_var.HavePilot
ifft_in(ofdm_data_parm_var.PilotSubcIdx) = ofdm_data_parm_var.PilotSymbol;
end
%OverSamp
if sys_parm.OverSamp > 1
insert_zeros = zeros(1, (sys_parm.OverSamp - 1) * sys_parm.TotNumSubc);
ifft_in_up = ifft_in(1: sys_parm.TotNumSubc / 2);
ifft_in_down = ifft_in(sys_parm.TotNumSubc / 2 + 1: sys_parm.TotNumSubc);
ifft_in = [ifft_in_up, insert_zeros, ifft_in_down];
end
%IFFT operation and add cp
ifft_out = ifft(ifft_in);
ifft_out = [ifft_out(sys_parm.OverSamp * sys_parm.TotNumSubc - ofdm_data_parm_const.CPLength + 1: sys_parm.OverSamp * sys_parm.TotNumSubc), ifft_out];
%Update the tx_signal
tx_signal = [tx_signal, ifft_out];
end
if sys_parm.NeedReceiver == 1
%Construction of the preamble
preamble = tx_gen_preamble(sys_parm);
%Concatenate preamble and data part and normalize the average signal power to 1
tx_signal = [preamble, tx_signal] * sys_parm.TotNumSubc * sys_parm.OverSamp / sqrt(ofdm_data_parm_const.UsedNumSubc);
% %Window the ofdm signal
% raisecosfir = rcosfir(0.5, 3, 5, 1);
% tx_signal = filter(raisecosfir, 1, interp(tx_signal, 5));
% tx_signal = decimate(tx_signal, 5);
% tx_signal = tx_signal / std(tx_signal);
else
%Concatenate preamble and data part and normalize the average signal power to 1
tx_signal = [tx_signal] * sys_parm.TotNumSubc * sys_parm.OverSamp / sqrt(ofdm_data_parm_const.UsedNumSubc);
figure(1);
%Plot the PSD of the tx signal
tx_signal_1 = tx_signal / max(abs(tx_signal));
PW=pwelch(tx_signal_1, [], [], length(tx_signal_1) * 4);
plot(10*log10(abs(fftshift(PW))), 'b');
hold on;
%Plot the PSD of the tx signal after windows
raisecosfir = rcosfir(0.8, 3, 5, 1);
tx_signal_2 = filter(raisecosfir, 1, interp(tx_signal, 5));
tx_signal_2 = decimate(tx_signal_2, 5);
tx_signal_2 = tx_signal_2 / max(abs(tx_signal_2));
PW=pwelch(tx_signal_2, [], [], length(tx_signal_2) * 4);
plot(10 * log10(abs(fftshift(PW))), 'r');
figure(2);
%Calculate the papr
tx_signal_3 = reshape(tx_signal, sys_parm.OverSamp * sys_parm.TotNumSubc + ofdm_data_parm_const.CPLength, sys_parm.NumOFDMSymbols).';
tx_signal_3(:, 1 : ofdm_data_parm_const.CPLength) = [];
papr = max(abs(tx_signal_3) .^ 2, [], 2);
papr = sort(floor(papr + 0.5));
papr_value = papr(1);
papr_value_num = 1;
for id = 2 : length(papr)
if papr(id) ~= papr_value(end)
papr_value = [papr_value, papr(id)];
papr_value_num = [papr_value_num, 1];
else
papr_value_num(end) = papr_value_num(end) + 1;
end
end
papr_value = 10 * log10(papr_value);
for id = 1 : length(papr_value_num)
papr_num(id) = sum(papr_value_num(id : end));
end
papr_num = papr_num / sum(papr_value_num);
semilogy(papr_value, papr_num, 'r');
grid on;
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -