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

📄 runradarsim_v2.m

📁 this code invert number of a vector
💻 M
📖 第 1 页 / 共 2 页
字号:
function runRadarSim_v2(handles)
% function runRadarSim(handles,isAnalyzeBufferMode);

    warning off all
    handleRadarControlls(handles,'off');
    
    displayTargets(handles,'in radar display')

    isAnalyzeBufferMode = get(handles.bufferAnalyze,'value');    
    
    temp = get(handles.bufferSize,'string');
    ind = get(handles.bufferSize,'value');
    nPRI = str2double( temp{ind} ) ;
    
    freqRes = nPRI * 2;
    freqInd = fftshift( 1:freqRes );
    handles.antenaGain = buildAntenaGain(handles);
    
    figure(handles.figure1);
    currentTime = handles.currentTime;
    miniDisplayUpdateTime = 0;
    pulseNum = handles.pulseNum;
    
    temp = get(handles.PRI,'string');
    ind = get(handles.PRI,'value');
    PRI = str2double( temp{ind} )/1e3 ; %PRI was entered in msec
    
    temp = get(handles.ZSA,'string');
    ind = get(handles.ZSA,'value');
    antenaTurnVelocity = str2num( temp{ind} ) ;
    
    temp = get(handles.updateRate,'string');
    ind = get(handles.updateRate,'value');
    updateRate = str2double( temp{ind} );
    
    temp = get(handles.samplingRate,'string');
    ind = get(handles.samplingRate,'value');
    Fs = str2double( temp{ind} )*1e3 ; %Fs was entered in Khz
    
    lastUpdate = currentTime;
    antenaGain = handles.antenaGain;
    temp = get(handles.RadarBW,'string');
    radarBWOptions = zeros( length(temp),1 );
    for n=1 :length(temp)
        radarBWOptions(n) = str2double( temp(n) );
    end
    
    PRISize = PRI*Fs;   %number of samples in PRI
    bufferSize = round(PRISize*nPRI);  %number of samples in buffer
    
    if bufferSize > 1e5
        set(handles.run,'string','Pause');
        radarSimulation('run_Callback',handles.run,[],guidata(handles.run));
        ERRORDLG('requested PRI, buffer size & sampling rate require too large a vector for simulation !!!');
    end
    
    returnPulses = zeros( bufferSize,1);
    numRadarTurn = handles.numRadarTurn;   
    
    randVecLength = 1e6;
    randVec = randn(randVecLength,1);
    
    if Fs > 44e3
        soundFs = 11e3;
        sound2SampleRatio = round(Fs/soundFs);
    else
        soundFs = 11e3;
        sound2SampleRatio = 1;
    end
    player = audioplayer(0, soundFs);
        
    % Digitizer Noise
    n = get(handles.digitizerNoiseLevel,'value');
    temp = get(handles.digitizerNoiseLevel,'string');
    if strcmp(temp{n},'off')
        digitizerNoiseLevel = 0;
    else 
        n=str2double(temp{n});
        digitizerNoiseLevel = 10^n;
    end

    % RF noise
    n = get(handles.RFnoise,'value');
    temp = get(handles.RFnoise,'string');
    if strcmp(temp{n},'off')
        RFnoiseLevel = 0;
    else 
        n=str2double(temp{n});
        RFnoiseLevel = 10^n;
    end
    
    hold on;
    PW = get(handles.PW,'value')  * PRI;
    PWn = round( PW*Fs );   PWn = max(1,PWn);
    transmisionInd = zeros(PWn*nPRI,1);
    pulseTransmitionPoints = ones( nPRI,1 );

% -------------- stagger ------------------------
    transmisionInd( 1:PWn ) = (1:PWn);
    temp = get(handles.stagger,'value');
    options = get(handles.stagger,'string');
    stagger = str2double( options{temp} );
    ratio = 2*PW / PRI;
    ratio = max(ratio, 0.05);
    intervals = (1+( (0:stagger-1)-(stagger-1)/2)*ratio)*PRI;
    numSamplesInInterval = round( intervals*Fs );
    numSamplesInInterval(end) = round( numSamplesInInterval(end)- mod(sum(numSamplesInInterval),PRISize));
    numIntervals = length(intervals);
    numSamplesInPRI = round( sum( intervals )*Fs );
    maxDist = numSamplesInPRI*150/Fs*1e6;
    for n=2:nPRI
        interval = numSamplesInInterval(mod(n-1,numIntervals)+1);
        transmisionInd( (n-1)*PWn+1:n*PWn ) = transmisionInd( (n-2)*PWn+1:(n-1)*PWn ) + interval;
        pulseTransmitionPoints( n ) = transmisionInd( (n-1)*PWn+1 );
    end
   
    rangeCellInd = zeros(nPRI,numSamplesInPRI);
    for n = 1 : nPRI
        rangeCellInd(n,:) = transmisionInd( (n-1)*PWn+1 );
    end
    temp = repmat( 0:numSamplesInPRI-1,nPRI, 1 );
    rangeCellInd = rangeCellInd + temp;
    rangeCellInd = mod( rangeCellInd-1,bufferSize ) + 1;
    rangeCellInd = rangeCellInd';
%     bufferSize = size(rangeCellInd);
    
% -----------------------------------------------    
    
    targetsTime = 0;
    
    rangeRes = PWn; rangeRes = rangeRes + ~mod(rangeRes,2);
    dilateKer = zeros(max(numSamplesInInterval)+rangeRes-1,1);
    dilateKer(1:rangeRes) = 1;
    dilateKer(1:3) = 1; %In case PWn == 1
    stagger = length(numSamplesInInterval);
    for n=1:stagger-1
        for m = 1:stagger
            ind = mod( m:m+n-1, stagger )+1;
            offset = numSamplesInPRI - sum(numSamplesInInterval(ind));
            dilateKer(offset:offset+PWn) = 1;
        end
    end
    dilateKer = [dilateKer(end:-1:rangeRes+1) ; dilateKer];

%   An option to link the angle resolution to the antena gain (should be
%   used only in low SNRs 
%     [M n] = max(antenaGain);
%     f = find( antenaGain/M < 0.001 );
%     m = min( abs(f-n) );
%     angleRes = m/length(antenaGain)*4*pi; 

    angleRes = 1.1*2*pi*(nPRI*PRI)*(antenaTurnVelocity/2/pi);    % 2 * [2*pi*bufferTime/(antena turn time)]
    rangeRes = PW*3e8/2;
    velocityRes = 3e8/(handles.IF_Freq)/ nPRI*1000/2;
    
    foundTargetInBuffer = 0;
    
    radarSector = antenaTurnVelocity*updateRate;  % a buffer sector
    updatedDisplay = false;
    
    tic;
    lastUpdateRealTime = toc;
    
    
    % ----------------------------- Start the RADAR scan ---------------------------------
    while get(handles.run,'value')
             
        if get(handles.CFAR,'value')
            useCFAR = true;
            CFAR = get(handles.Th,'value');
        else
            useCFAR = false;
            Th = 10^(get(handles.Th,'value'));
        end
        
        Amp = 10^ get(handles.Amp,'value') ;
        
        currentTime = currentTime+PRI;
        radarAngle = mod(antenaTurnVelocity*currentTime,2*pi); %radar angle in the middle of the buffer
        
        
        % -------------------------------- Finding the return pulses --------------------------------------------
        targets = [handles.Targets ; handles.mountains];
        curentReturnPulses = zeros( bufferSize,1 );
        if ~isempty(targets)
            [t a phi] = targetsReturn(targets,antenaGain,Amp, currentTime,antenaTurnVelocity, targetsTime,handles.IF_Freq);
            tIn = round( t*Fs );
            tIn = max(tIn,1);   tIn = min(tIn,bufferSize);
            for n=1:length(t)
                curentReturnPulses(tIn(n):tIn(n)+PWn-1) = curentReturnPulses(tIn(n):tIn(n)+PWn-1) + a(n)*exp(i*phi(n));
%                 targetReturns = mod( transmisionInd + tIn(n)-1, bufferSize )+1;
%                 curentReturnPulses( targetReturns ) = curentReturnPulses( targetReturns ) + a(n)*exp(i*phi(n));
            end
        end
        
        % -------------------------------- Adding new reception --------------------------------
        transmitInd = pulseTransmitionPoints( mod(pulseNum-1,nPRI)+1 );    % !!!! needs to fix this in case of stagger with small PRI
        index = transmitInd : transmitInd + bufferSize-1;
        index( bufferSize-transmitInd + 2 : bufferSize ) = 1:transmitInd-1; %!!! bug in case of sampling 20Khz and PRI 0.53 
        returnPulses(index) = returnPulses(index)+curentReturnPulses;  
        
        
        % --------------------------------- Processing Buffer ------------------------------------------
        if ~mod(pulseNum,nPRI)  %Only processing every N number of pulses
            
            recievedSignal = returnPulses;

            n = get(handles.RadarBW,'value');
            radarBW=radarBWOptions(n) * 1e6;
            %  -------------------------- Creating RF noise ----------------------------------------------------
            if RFnoiseLevel
%                  RFnoise = randn( length(returnPulses),2 )* RFnoiseLevel *[1 ; i];
                 RFnoise = fastSemiRandn( length(returnPulses))* RFnoiseLevel *[1 ; i]*radarBW;                 
                 recievedSignal = recievedSignal+RFnoise;
            end
            
            % --------------------------------- Passing reception through the radars reciver BW------------------
            a = -pi^2*radarBW^2/log(0.5)*log(exp(1));
            responseStart = sqrt(-log(0.1)/log(exp(1))/a);
            t = -responseStart : 1/Fs : responseStart;
            response = exp(-t'.^2*a);
            response = response/sum(response);
            recievedSignal = conv2(recievedSignal,response,'same');
            % Gausian sigma freq and time: Gf = 1/(2Gt)
            % Gf = BW/sqrt(2ln2)    => Gt = ln2/(sqrt(2)BW)

            %  -------------------------- Creating Digitizer noise --------------------------------------------------
            if digitizerNoiseLevel
%                  DigiNoise = randn( bufferSize,2)* digitizerNoiseLevel * [1 ; i];
                DigiNoise = fastSemiRandn( bufferSize )* digitizerNoiseLevel * [1 ; i];
                recievedSignal = recievedSignal+DigiNoise;
            end

            recievedSignal(transmisionInd) = 0;  % Deleting the time which the radar transmited (couldn't recieve)
            returnPulses = zeros( bufferSize,1);    % Cleaning the pulses buffer

            %  ------------------------- Performing Match Filter ----------------------------------------------------
            if get(handles.useMatchFilter,'value');
                if length(response) > PWn
                    matchFilter = response;
                else
                    matchFilter = ones(PWn,1)/PWn;
                end
                
                processedRecivedSignal = conv2(recievedSignal,matchFilter,'same');
            else

⌨️ 快捷键说明

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