⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scfdma.m

📁 ber performance of sc-fdma, we can consider awgn channel or multipath channel.
💻 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 + -