引言
相位差的概念
相位差,顧名思義,就是兩個波之間相位差的值。
為簡化概念,特指正弦波,假設有兩個電壓信號
則這者的相位差為
如果u1和u2的頻率相同,則兩者的相位差為初始相位之差。
相位差和延時的關系
在u1和u2的頻率相同的情況下,其周期也是一致的,設為T,則有
變換得到
由上式看到,在恆定延時情況下,相位差Δφ正比於信號頻率f。
同軸電纜中電壓信號分析
假設電壓信號在同軸電纜中傳播速度為v,u1信號線長度為l1,u2信號線長度為l2,則兩者傳播的時間差為
為了對這個式子進行驗證,特搭建測試環境如下
信號起始頻率10Mhz,終止頻率800MHz,步進2MHz
在l1 = l2 = 0.5m,測試結果如下
相位差約等於0°。
在l1 = 0.5m,l2 = 1.0m,測試結果如下
由圖中可以看到,相位與頻率成線性關系,斜率為2πΔt。
在192MHz和582MHz之間產生了一個360°,也就是2π的相移,算得
與實際上的電纜長度差值Δl 0.5m有一定誤差。實際上可以對采集到的數據進行線性回歸操作,以得到更准確的斜率。
相位圖示來源:https://baike.baidu.com/item/%E7%9B%B8%E4%BD%8D%E5%B7%AE/4671188?fr=aladdin
GPIB控制代碼
% TDS784D 和 CMU200 組合VNA % 使用之前請在TDS784D示波器上設置好如下測量關系 % Measurement1 : CH1-CH2 相位 % Measurement2 : CH1 幅度 % Measurement3 : CH2 幅度 % CH1 10mV/Div % CH2 10mV/Div clc;clear all;close all; %% inslist = instrfind(); delete(inslist); vTDS784D = visa('agilent','GPIB0::1::INSTR'); vTDS784D.InputBufferSize = 4196*200; fopen(vTDS784D); fprintf(vTDS784D,'*IDN?'); idn = fscanf(vTDS784D) vCMU200 = visa('agilent','GPIB0::20::1::INSTR'); fopen(vCMU200); fprintf(vCMU200,'*IDN?'); idn = fscanf(vCMU200) %% % SET CMU200 % 1.選擇信號發生器模式 string = sprintf('INITiate:RFGenerator'); fprintf(vCMU200,string); % 2.設置輸出端口 string = sprintf('OUTPUT RF2'); fprintf(vCMU200,string); % 3.設置信號發生器電平 level = -20; %dBm string = sprintf('SOURce:RFGenerator:LEVEL %ddBm',level); fprintf(vCMU200,string); %% % SET TDS784D % 設置阻抗 50 Ohm string = sprintf('CH1:IMPedance FIFty'); fprintf(vTDS784D,string); %CH1 string = sprintf('CH2:IMPedance FIFty'); fprintf(vTDS784D,string); %CH2 %% % 起始頻率 FREQ_START = 10; %MHz % 終止頻率 FREQ_STOP = 800; %MHz % 步進頻率 FREQ_STEP = 2; %MHz % 分配空間 freq_list = FREQ_START : FREQ_STEP : FREQ_STOP; N = length(freq_list); amp_list = zeros(1,N); pha_list = zeros(1,N); % 平均次數 MEAN_NUM = 9; % 測量穩定時間 MEAS_DELAY = 0.25; %Second % 掃頻 for index = 1 : 1 : N % 設置輸出頻率 string = sprintf('SOURce:RFGenerator:FREQuency %dMHz',freq_list(1,index)); fprintf(vCMU200,string); % 設置時基 tBase = 2*1/freq_list(1,index)*1E-6; %Seconds string = sprintf('HORizontal:SECdiv %d',tBase) fprintf(vTDS784D,string); pause(0.8); % 測量CH1 幅度,單位V,調用Measurement1 結果 string = sprintf('MEASU:MEAS2:VAL?'); sum = zeros(1,MEAN_NUM); for ii = 1 : 1 : MEAN_NUM fprintf(vTDS784D,string); sum(1,ii) = fscanf(vTDS784D,'%f'); pause(MEAS_DELAY); end amp_list(1,index) = median(sum); % 測量CH1-CH2 相位,單位 °,調用Measurement1 結果 string = sprintf('MEASU:MEAS1:VAL?'); sum = zeros(1,MEAN_NUM); for ii = 1 : 1 : MEAN_NUM fprintf(vTDS784D,string); sum(1,ii) = fscanf(vTDS784D,'%f'); pause(MEAS_DELAY); end pha_list(1,index) = median(sum); end %% % 制圖 subplot(211); plot(freq_list,amp_list); subplot(212); plot(freq_list,pha_list); ylim([-200 200]); %% fclose(vTDS784D); fclose(vCMU200);