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

📄 cdmasim.m

📁 这是一个cdma的仿真程序,其中有多个参数可以自行调节使用
💻 M
字号:
% File : c18_cemasim.m
function [BER,ErrorRun] = c18_cdmasim(N,SF,EbNo,NumInterferers,MPathDelay,KfactordB)

rand('state',sum(100*clock)); randn('state',sum(100*clock));
NIterate = 1e3;             % default block size
NumberOfIterations = ceil(N/NIterate);
ErrorState = 0; ErrorRun = []; RunCount = 1;    % itialize
Kfactor = 10.^(KfactordB/10);      % linear units
EbNolinear = 10.^(EbNo/10);         % linear units
MPathComponents = length(MPathDelay);
% Determine amplitude in multipath components and store as vector.
% Determine the total power in all the scattered components.
% Determine LOS component.
MPathAmp(2:MPathComponents) = rand(MPathComponents-1,1);
ScatPower = MPathAmp*MPathAmp.';
MPathAmp(1) = sqrt(ScatPower*Kfactor);      % LOS component.
% Determine which component has the largest energy (amplitude).
% Normalize vector so that strongest component has unit amplitude.
[fee MaxComponent] = max(MPathAmp); MPathAmp = MPathAmp/fee;
% Design IIR filter for fading signal.
FilterOrder = 4; Ripple = 0.5; BW = 0.01;       % filter parameters
[b,a] = cheby1(FilterOrder,Ripple,BW);          % 4th order filter
% Error checking.
if (NumInterferers>(SF-1))
    error(['NumInterferers must not exceed ',int2str(SF-1),'.'])
end
if (length(MPathDelay)~=length(MPathAmp))
    error('MPathDelay and MPathAmp must have the same length.')
end
if (min(MPathDelay)<0)
    error('MPathDelay must not have negative components.')
end
fee = diff(MPathDelay);
if (min(fee)<=0)
    error('MPathDelay must be monotonically increasing.')
end
clear fee
% End Error Checking.
% Generate spreading sequences. Teh spreading sequences for the interferers
% are shifted versions of the desired sequence with a shift offset.
DesiredSequence = MSequence(SF+1);      % desired signal
offset = fix(length(DesiredSequence)/(NumInterferers+1));
M = length(DesiredSequence);
for k = 1:NumInterferers
    InterfererSequence(k,:) = [DesiredSequence(M-(k-1)*offset:M) DesiredSequence(1:M-1-(k-1)*offset)];
end
% The simulation loop begins here.
zf = zeros(FilterOrder,MPathComponents);
for cnt = 1:NumberOfIterations
    % Generate and spread symbols for desired and interfering users.
    DesiredSymbols = sign(rand(1,NIterate)-0.5);
    InterferingSymbols = sign(rand(NumInterferers,NIterate)-0.5);
    DesiredChips = reshape(DesiredSequence.'*DesiredSymbols,1,M*NIterate);
    for k = 1:NumInterferers
        InterferingChips(k,:) = reshape(InterfererSequence(k,:).'*InterferingSymbols(k,:),1,M*NIterate);
    end
    % Generate noise
    NoiseAmplitude = sqrt(SF/(2*EbNolinear));
    MaxDelay = max(MPathDelay);
    DesiredNoise = NoiseAmplitude*randn(1,M*NIterate+MaxDelay);
    % Apply multipath.
    MPathLinAmp = MPathAmp;
    MPathComponents = length(MPathDelay);
    DesiredMPathSignal = zeros(1,M*NIterate+MaxDelay);
    if NumInterferers>0
        InterferingMPathSignal = zeros(NumInterferers,M*NIterate+MaxDelay);
        for k = 1:MPathComponents
            index = 1+MPathDelay(k):M*NIterate+MPathDelay(k);
            InterferingMPathSignal(:,index) = InterferingMPathSignal(:,index)+MPathLinAmp(k)*InterferingChips;
        end
    end
    for k = 1:MPathComponents
        if k==1
            fading = ones(1,M*NIterate);
        else
            fading = randn(size(DesiredSymbols))+j*randn(size(DesiredSymbols));
            [fading zf(:,k)] = filter(b,a,fading,zf(:,k));
            fading = interp(fading,SF);
            fading = abs(fading/sqrt(mean(fading.*conj(fading))));
        end
        if k==MaxComponent
            fadesign = sign(fading);
        end
        faa(k,:) = MPathLinAmp(k)*fading;
        index = 1+MPathDelay(k):M*NIterate+MPathDelay(k);
        DesiredMPathSignal(index) = DesiredMPathSignal(index)+(MPathLinAmp(k)*fading).*DesiredChips;
    end
    % Add intererence and noise.
    if NumInterferers>0
        IncomingSignal = DesiredMPathSignal+sum(InterferingMPathSignal,1)+DesiredNoise;
    else
        IncomingSignal = DesiredMPathSignal+DesiredNoise;
    end
    % Receive and detect incoming signal.
    index = 1+MPathDelay(MaxComponent):M*NIterate+MPathDelay(MaxComponent);
    IncomingChips = reshape(fadesign.*IncomingSignal(index),M,NIterate);
    DespreadSymbols = DesiredSequence*IncomingChips;
    DetectedSymbols = sign(DespreadSymbols);
    % Compute Bit Error Rate
    ErrorVector = 0.5*abs(DetectedSymbols-DesiredSymbols);
    ErrorsIterate(cnt) = sum(ErrorVector);
    BERIterate(cnt) = ErrorsIterate(cnt)/NIterate;
    for k = 1:NIterate
        if (ErrorVector(k)==0) & (ErrorState==0)
            RunCount = RunCount+1;
        elseif (ErrorVector(k)==0) & (ErrorState==1)
            ErrorRun = [ErrorRun RunCount];
            RunCount = 1; ErrorState = 0;
        elseif (ErrorVector(k)==1) & (ErrorState==0)
            ErrorRun = [ErrorRun RunCount];
            RunCount = 1; ErrorState = 1;
        elseif (ErrorVector(k)==1) & (ErrorState==1)
            RunCount = RunCount+1;
        else
            s1 = sprintf('ErrorVector(%d)=%d,ErrorState=%d! Unexpected Condition!');
            error(s1);
        end
    end
end
Errors = sum(ErrorsIterate); BER = mean(BERIterate);
ErrorRun = [ErrorRun RunCount];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -