📄 scfdma.m
字号:
function [SER_ifdma SER_lfdma] = scfdma(SP)
numSymbols = SP.FFTsize; % total number of sysbols
Q = numSymbols/SP.inputBlockSize; % Q can be the number of users
H_channel = fft(SP.channel,SP.FFTsize); % convert the channel to frequency domain
for n = 1:length(SP.SNR), % for each SNR value, loop once
tic;
errCount_ifdma = 0; % wait to see the meaning of these values
errCount_lfdma = 0;
for k = 1:SP.numRun, % set the number of loops
%% generate baseband QPSK signal
tmp = round(rand(2,SP.inputBlockSize)); % randomly generate binary values of size 2 X inputBlockSize.
tmp = tmp*2 - 1; % binary modulation
inputSymbols = (tmp(1,:) + i*tmp(2,:)); % This is a QPSK modulation
%% first DFT to transform into frequency domain
inputSymbols_freq = fft(inputSymbols);
%% subcarrier mapping % IFDMA and LFDMA
inputSamples_ifdma = zeros(1,numSymbols); % all set to be zeros
inputSamples_lfdma = zeros(1,numSymbols);
inputSamples_ifdma(1+SP.subband:Q:numSymbols) = inputSymbols_freq; % IFDMA
inputSamples_lfdma([1:SP.inputBlockSize]+SP.inputBlockSize*SP.subband) = inputSymbols_freq; % LFDMA
%% IFFT of size M
inputSamples_ifdma = ifft(inputSamples_ifdma);
inputSamples_lfdma = ifft(inputSamples_lfdma);
%% CP insertion
TxSamples_ifdma = [inputSamples_ifdma(numSymbols-SP.CPsize+1:numSymbols) inputSamples_ifdma];
TxSamples_lfdma = [inputSamples_lfdma(numSymbols-SP.CPsize+1:numSymbols) inputSamples_lfdma];
%% channel filtered transmitted signal
RxSamples_ifdma = filter(SP.channel, 1, TxSamples_ifdma); % Multipath Channel
RxSamples_lfdma = filter(SP.channel, 1, TxSamples_lfdma); % Multipath Channel
%% AWGN noise
tmp = randn(2, numSymbols+SP.CPsize); % notice 2 dimensional since the transmitted data is QPSK
complexNoise = (tmp(1,:) + i*tmp(2,:))/sqrt(2); % the variance of the complex noise is 1
noisePower = 10^(-SP.SNR(n)/10); % noise power per bit
%% the received signal with noise
RxSamples_ifdma = RxSamples_ifdma + sqrt(noisePower/Q)*complexNoise; % Es / No = 2 * Eb / No
RxSamples_lfdma = RxSamples_lfdma + sqrt(noisePower/Q)*complexNoise;
%% CP removal
RxSamples_ifdma = RxSamples_ifdma(SP.CPsize+1:numSymbols+SP.CPsize);
RxSamples_lfdma = RxSamples_lfdma(SP.CPsize+1:numSymbols+SP.CPsize);
%% M-IDFT
Y_ifdma = fft(RxSamples_ifdma, SP.FFTsize);
Y_lfdma = fft(RxSamples_lfdma, SP.FFTsize);
%% subcarrier demapping
Y_ifdma = Y_ifdma(1+SP.subband:Q:numSymbols);
Y_lfdma = Y_lfdma([1:SP.inputBlockSize]+SP.inputBlockSize*SP.subband);
%% equalizaition for IFDMA
H_eff = H_channel(1+SP.subband:Q:numSymbols); % frequency response for a single user
if SP.equalizerType == 'ZERO'
Y_ifdma = Y_ifdma./H_eff;
elseif SP.equalizerType == 'MMSE'
% C = conj(H_eff)./(conj(H_eff).*H_eff + 10^(-SP.SNR(n)/10));
C = conj(H_eff)./(conj(H_eff).*H_eff + noisePower);
Y_ifdma = Y_ifdma.*C;
end
%% equalizaition for LFDMA
H_eff = H_channel([1:SP.inputBlockSize]+SP.inputBlockSize*SP.subband);
if SP.equalizerType == 'ZERO'
Y_lfdma = Y_lfdma./H_eff;
elseif SP.equalizerType == 'MMSE'
C = conj(H_eff)./(conj(H_eff).*H_eff + 10^(-SP.SNR(n)/10));
Y_lfdma = Y_lfdma.*C;
end
%% N-IDFT
EstSymbols_ifdma = ifft(Y_ifdma);
EstSymbols_lfdma = ifft(Y_lfdma);
%% detection
EstSymbols_ifdma = sign(real(EstSymbols_ifdma)) + i*sign(imag(EstSymbols_ifdma)); % as QPSK signal
% EstSymbols_ifdma = EstSymbols_ifdma/sqrt(2);
EstSymbols_lfdma = sign(real(EstSymbols_lfdma)) + i*sign(imag(EstSymbols_lfdma));
% EstSymbols_lfdma = EstSymbols_lfdma/sqrt(2);
%% count errors
I_ifdma = find((inputSymbols-EstSymbols_ifdma) == 0);
errCount_ifdma = errCount_ifdma + (SP.inputBlockSize-length(I_ifdma)); % count errors for each loop
I_lfdma = find((inputSymbols-EstSymbols_lfdma) == 0);
errCount_lfdma = errCount_lfdma + (SP.inputBlockSize-length(I_lfdma));
end % end for each SNR, a total of SP.numRun loops
SER_ifdma(n,:) = errCount_ifdma / (2 * SP.inputBlockSize*SP.numRun); % calculate the bit error rate
SER_lfdma(n,:) = errCount_lfdma / (2 * SP.inputBlockSize*SP.numRun);
[SP.SNR(n) SER_ifdma(n,:) SER_lfdma(n,:)];
toc
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -