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

📄 toi automation.m

📁 Agilent 仪器与MATLAB互联
💻 M
字号:
function example8
% MATLAB/MXA example 8
% TOI automated measurement and surface plot

% Version: 1.0
% Date: Sep 11, 2006  
% 2006 Agilent Technologies, Inc.

% Clean up any unclosed instrument object

oldobjs=instrfind;
if ~isempty(oldobjs)
disp('Cleaning up ...')
delete(oldobjs);
clear oldobjs;
end 

% TOI measurement parameters
f_cent = 1e9; % center frequency
pow = -30:1:-15; % input power range
sep = logspace(5,7,7); % tone separation range
pk_threshold = -80; % peak_threshold criterium
pk_excursion = 6; % peak_excursion criterium
num_ave = 4; % number of trace averages for each measurement


n_pow = length(pow);
n_sep = length(sep);
TOI = zeros(n_sep,n_pow,2);

% Initial setup
localhost=
mxa_ip = '141.121.92.157';
mxa_port = 5025;
esg_ip = '141.121.92.157';
esg_port = 5025;

% MXA Interface creation and connection opening
fprintf('\nConnecting to MXA ...\n');
mxa = tcpip(mxa_ip,mxa_port);

% ESG Interface creation and connection opening
fprintf('\nConnecting to ESG ...\n');
ESG = tcpip(esg_ip,esg_port);


disp(' ')
disp('Connecting to MXA/ESG ...');
set(mxa,'InputBufferSize',2000);
set(mxa,'Timeout',10);
fopen(mxa)
fopen(esg)

% MXA initial setup

fprintf(mxa,[':FREQ:CENT ' num2str(f_cent)]);
fprintf(mxa,[':FREQ:SPAN ' num2str(5*sep(1))]);
fprintf(mxa,'DISP:WIND:TRAC:Y:RLEV 10');
fprintf(mxa,'INIT:IMM;*OPC?');
fscanf(mxa);
fprintf(mxa,'FORM:DATA REAL,32');
fprintf(mxa,['CALC:MARK:PEAK:THR ' num2str(pk_threshold)]);
fprintf(mxa,['CALC:MARK:PEAK:EXC ' num2str(pk_excursion)]);
fprintf(mxa,'CALC:MARK:PEAK:TABLE:STAT ON');
fprintf(mxa,['AVER:COUNT ' num2str(num_ave)]);
fprintf(mxa,'TRAC:TYPE AVER');
fprintf(mxa,'INIT:IMM;*OPC?');
fscanf(mxa);

% ESG/MXG initial setup
fprintf(esg,[':FREQ ' num2str(f_cent)]);
fprintf(esg,':POW -20');
fprintf(esg,':RADIO:MTONE:ARB:SETUP:TABLE:NTONES 2');
fprintf(esg,':RADIO:MTONE:ARB:SETUP:TABLE:FSPACING 1e5');
fprintf(esg,':RADIO:MTONE:ARB on');
fprintf(esg,':OUTPUT on');
fprintf(esg,':OUTPUT:MOD on');

fprintf('\nStarting toi measurement:');
fprintf('\nPower sweep range: %d dBm to %d dBm in %d dB steps', min(pow), max(pow), pow(2)-pow(1));

fprintf(mxa,':INIT:CONT OFF');


for x = 1:n_sep
   
    fprintf(esg,[':RADIO:MTONE:ARB:SETUP:TABLE:FSPACING ' num2str(sep(x))]);
    
    fprintf(esg,'*OPC?');
    fscanf(esg);
    
    fprintf(mxa,[':FREQ:SPAN ' num2str(5*sep(x))]);
    fprintf(mxa,'*OPC?');
    fscanf(mxa);
    fprintf(['\nFrequency separation: ' num2str(round(sep(x)/1e3)) ' kHz '])
    for y = 1:n_pow
        fprintf(esg,[':POW ' num2str(pow(y))]');
        fprintf(esg,'*OPC?');
        fscanf(esg);
        toi = toi_meas(mxa,pk_threshold,pk_excursion);
        TOI(x,y,1) = toi(1);
        TOI(x,y,2) = toi(2);
        fprintf('.')        
    end
    %pause(4)
end

fprintf(mxa,'CALC:MARK:PEAK:TABLE:STAT OFF');
fprintf(mxa,':INIT:CONT ON');


% Surface plot
fprintf('\nPlotting results ...\n')


surf(log10(sep),pow,((TOI(:,:,1)+TOI(:,:,2))/2)',...
    'FaceColor','interp',...
    'EdgeColor','k',...
    'Linewidth',.2) % plot the average of toi lower and right

colormap(jet(256))

xlabel('Tone Separation (log_{10}(f) Hz)')
ylabel('Input Power Leval (dBm)')
zlabel('TOI (dBm)')
title(['TOI vs Input Level and Tone Separation (Center = ' num2str(f_cent/1e6) ' MHz)'])
colorbar

%Disconnect an clean up
disp(' ')
disp('Disconnecting from MXA/ESG ...')
fclose(mxa)
fclose(esg)
delete([mxa esg]);
clear mxa esg


    function toi = toi_meas(mxa,pk_thr,pk_exc)

        fprintf(mxa,':INIT:IMM;*OPC?');
        fscanf(mxa);
        fprintf(mxa,[':CALC:DATA1:PEAK? ' num2str(pk_thr) ',' num2str(pk_exc) ',AMPL,ALL']);

        peak_data = binblockread(mxa,'float32');


        peak_num = peak_data(1);
        peak_amp = peak_data(2:2:end);
        peak_freq = peak_data(3:2:end);

        toi = [-999.0 -999.0];

        if peak_num <= 2 % no 3rd order products found
            return
        end

        if peak_freq(1) < peak_freq(2)
            f1 = peak_freq(1); y1 = peak_amp(1);
            f2 = peak_freq(2); y2 = peak_amp(2);
        else
            f1 = peak_freq(2); y1 = peak_amp(2);
            f2 = peak_freq(1); y2 = peak_amp(1);
        end

        peak_sep = f2-f1;

        f3_idx = find(abs(peak_freq - (f1 - peak_sep)) < peak_sep/25);
        if ~isempty(f3_idx)
            f3 = peak_freq(f3_idx(1)); y3 = peak_amp(f3_idx(1));
            toi(1) = (min(y1,y2)-y3)/2+y1;
        end

        f4_idx = find(abs(peak_freq - (f2 + peak_sep)) < peak_sep/25);
        if ~isempty(f4_idx)
            f4 = peak_freq(f4_idx(1)); y4 = peak_amp(f4_idx(1));
            toi(2) = (min(y1,y2)-y4)/2+y2;
        end
    end

end

⌨️ 快捷键说明

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