自制合成孔径雷达(5) SAR代码解读

tech2026-01-21  2

在lecture 4的ppt里,有SAR的处理框图。SAR的matlab代码跟这个基本相符。

matlab代码分为两个文件,SBAND_RMA_opendata是读取数据,读取完了调用SBAND_RMA_IFP处理数据。

有一点要注意,默认do_all_plots是0,很多绘制中间数据的代码没有真的用上。

下面是SBAND_RMA_opendata.m

%-------------------------------------------% %Process raw data here clear all; close all; %read the raw data .wave file here [Y,FS,NBITS] = wavread('towardswarehouse.wav'); %constants c = 3E8; %(m/s) speed of light %radar parameters Tp = 20E-3; %(s) pulse time Trp = 0.25; %(s) min range profile time duration N = Tp*FS; %# of samples per pulse fstart = 2260E6; %(Hz) LFM start frequency fstop = 2590E6; %(Hz) LFM stop frequency %fstart = 2402E6; %(Hz) LFM start frequency for ISM band %fstop = 2495E6; %(Hz) LFM stop frequency for ISM band BW = fstop-fstart; %(Hz) transmti bandwidth f = linspace(fstart, fstop, N/2); %instantaneous transmit frequency %the input appears to be inverted trig = -1*Y(:,1); s = -1*Y(:,2); clear Y; %parse data here by position (silence between recorded data) rpstart = abs(trig)>mean(abs(trig)); count = 0; Nrp = Trp*FS; %min # samples between range profiles for ii = Nrp+1:size(rpstart,1)-Nrp if rpstart(ii) == 1 & sum(rpstart(ii-Nrp:ii-1)) == 0 count = count + 1; RP(count,:) = s(ii:ii+Nrp-1); RPtrig(count,:) = trig(ii:ii+Nrp-1); end end %parse data by pulse count = 0; thresh = 0.08; clear ii; for jj = 1:size(RP,1) %clear SIF; SIF = zeros(N,1); start = (RPtrig(jj,:)> thresh); count = 0; jj for ii = 12:(size(start,2)-2*N) [Y I] = max(RPtrig(jj,ii:ii+2*N)); if mean(start(ii-10:ii-2)) == 0 & I == 1 count = count + 1; SIF = RP(jj,ii:ii+N-1)' + SIF; end end %hilbert transform q = ifft(SIF/count); sif(jj,:) = fft(q(size(q,1)/2+1:size(q,1))); end sif(find(isnan(sif))) = 1E-30; %set all Nan values to 0 %SAR data should be ready here clear s; s = sif; save routsidewarehouse2 s; %for image data %-------------------------------------------% %load additional varaibles and setup constants for radar here clear all; c = 3E8; %(m/s) speed of light %load IQ converted data here load routsidewarehouse2 s; %load variable sif %for image data for ii = 1:size(s,1) s(ii,:) = s(ii,:) - mean(s,1); end %sif = s-sif_sub; %perform coherent background subtraction %sif = sif_sub; %image just the background sif = s; %image without background subtraction clear s; clear sif_sub; %*********************************************************************** %radar parameters fc = (2590E6 - 2260E6)/2 + 2260E6; %(Hz) center radar frequency B = (2590E6 - 2260E6); %(hz) bandwidth cr = B/20E-3; %(Hz/sec) chirp rate Tp = 20E-3; %(sec) pulse width %VERY IMPORTANT, change Rs to distance to cal target %Rs = (12+9/12)*.3048; %(m) y coordinate to scene center (down range), make this value equal to distance to cal target Rs = 0; Xa = 0; %(m) beginning of new aperture length delta_x = 2*(1/12)*0.3048; %(m) 2 inch antenna spacing L = delta_x*(size(sif,1)); %(m) aperture length Xa = linspace(-L/2, L/2, (L/delta_x)); %(m) cross range position of radar on aperture L Za = 0; Ya = Rs; %THIS IS VERY IMPORTANT, SEE GEOMETRY FIGURE 10.6 t = linspace(0, Tp, size(sif,2)); %(s) fast time, CHECK SAMPLE RATE Kr = linspace(((4*pi/c)*(fc - B/2)), ((4*pi/c)*(fc + B/2)), (size(t,2))); %Save background subtracted and callibrated data save sif sif delta_x Rs Kr Xa; %clear all; %run IFP SBAND_RMA_IFP;

 

它所做的与上一个测距类似,读取每一段方波打开时的数据(脉冲)。

for ii = Nrp+1:size(rpstart,1)-Nrp if rpstart(ii) == 1 & sum(rpstart(ii-Nrp:ii-1)) == 0 count = count + 1; RP(count,:) = s(ii:ii+Nrp-1); RPtrig(count,:) = trig(ii:ii+Nrp-1); end end

读完以后还把这些脉冲数据加在一起

for ii = 12:(size(start,2)-2*N) [Y I] = max(RPtrig(jj,ii:ii+2*N)); if mean(start(ii-10:ii-2)) == 0 & I == 1 count = count + 1; SIF = RP(jj,ii:ii+N-1)' + SIF; end end

然后做希尔伯特变换

%hilbert transform q = ifft(SIF/count); sif(jj,:) = fft(q(size(q,1)/2+1:size(q,1)));

后续算法都在SBAND_RMA_IFP.m中完成。

%*********************************************************************** %a note on formatting, our convention is sif(Xa,t) clear all; load sif; %apply hanning window to data first N = size(sif,2); for ii = 1:N H(ii) = 0.5 + 0.5*cos(2*pi*(ii-N/2)/N); end for ii = 1:size(sif,1) sif_h(ii,:) = sif(ii,:).*H; end sif = sif_h; figcount = 1; close_as_you_go = 0; do_all_plots = 0; set(0,'defaultaxesfontsize',13); %set font size on plots so we can see it in the dissertation % NOTE: the function 'dbv.m' is just dataout = 20*log10(abs(datain)); %*********************************************************************** if do_all_plots == 1, figure(figcount); S_image = angle(sif); imagesc(Kr, Xa, S_image); colormap(gray); title('Phase Before Along Track FFT'); xlabel('K_r (rad/m)'); ylabel('Synthetic Aperture Position, Xa (m)'); cbar = colorbar; set(get(cbar, 'Title'), 'String', 'radians','fontsize',13); print(gcf, '-djpeg100', 'phase_before_along_track_fft.jpg'); if close_as_you_go == 1, close(figcount); end figcount = figcount + 1; end %along track FFT (in the slow time domain) %first, symetrically cross range zero pad so that the radar can squint zpad = 2048; %cross range symetrical zero pad szeros = zeros(zpad, size(sif,2)); for ii = 1:size(sif,2) index = round((zpad - size(sif,1))/2); szeros(index+1:(index + size(sif,1)),ii) = sif(:,ii); %symetrical zero pad end sif = szeros; clear ii index szeros; S = fftshift(fft(sif, [], 1), 1); clear sif; Kx = linspace((-pi/delta_x), (pi/delta_x), (size(S,1))); if do_all_plots == 1, figure(figcount); S_image = dbv(S); imagesc(Kr, Kx, S_image, [max(max(S_image))-40, max(max(S_image))]); colormap(gray); title('Magnitude After Along Track FFT'); xlabel('K_r (rad/m)'); ylabel('K_x (rad/m)'); cbar = colorbar; set(get(cbar, 'Title'), 'String', 'dB','fontsize',13); print(gcf, '-djpeg100', 'mag_after_along_track_fft.jpg'); if close_as_you_go == 1, close(figcount); end figcount = figcount + 1; end if do_all_plots == 1, figure(figcount); S_image = angle(S); imagesc(Kr, Kx, S_image); colormap(gray); title('Phase After Along Track FFT'); xlabel('K_r (rad/m)'); ylabel('K_x (rad/m)'); cbar = colorbar; set(get(cbar, 'Title'), 'String', 'radians','fontsize',13); print(gcf, '-djpeg100', 'phase_after_along_track_fft.jpg'); if close_as_you_go == 1, close(figcount); end figcount = figcount + 1; end if do_all_plots == 1, figure(figcount); S_image = dbv(fftshift(fft(S, [], 2), 2)); imagesc(linspace(-0.5, 0.5, size(S, 2)), Kx, S_image, [max(max(S_image))-40, max(max(S_image))]); colormap(gray); title('Magnitude of 2-D FFT of Input Data'); xlabel('R_{relative} (dimensionless)'); ylabel('K_x (rad/m)'); cbar = colorbar; set(get(cbar, 'Title'), 'String', 'dB','fontsize',13); print(gcf, '-djpeg100', 'mag_after_2D_fft.jpg'); if close_as_you_go == 1, close(figcount); end figcount = figcount + 1; end %********************************************************************** %matched filter %create the matched filter eq 10.8 for ii = 1:size(S,2) %step thru each time step row to find phi_if for jj = 1:size(S,1) %step through each cross range in the current time step row %phi_mf(jj,ii) = -Rs*Kr(ii) + Rs*sqrt((Kr(ii))^2 - (Kx(jj))^2); phi_mf(jj,ii) = Rs*sqrt((Kr(ii))^2 - (Kx(jj))^2); Krr(jj,ii) = Kr(ii); %generate 2d Kr for plotting purposes Kxx(jj,ii) = Kx(jj); %generate 2d Kx for plotting purposes end end smf = exp(j*phi_mf); %%%%%%%%%%%% %note, we are in the Kx and Kr domain, thus our convention is S_mf(Kx,Kr) %appsly matched filter to S S_mf = S.*smf; clear smf phi_mf; if do_all_plots == 1, figure(figcount); S_image = angle(S); imagesc(Kr, Kx, S_image); colormap(gray); title('Phase After Matched Filter'); xlabel('K_r (rad/m)'); ylabel('K_x (rad/m)'); cbar = colorbar; set(get(cbar, 'Title'), 'String', 'radians','fontsize',13); print(gcf, '-djpeg100', 'phase_after_matched_filter.jpg'); if close_as_you_go == 1, close(figcount); end figcount = figcount + 1; end clear S; if do_all_plots == 1, figure(figcount); S_image = dbv(fftshift(fft(S_mf, [], 2), 2)); imagesc(linspace(-0.5, 0.5, size(S_mf, 2)), Kx, S_image, [max(max(S_image))-40, max(max(S_image))]); colormap(gray); title('Magnitude of 2-D FFT of Matched Filtered Data'); xlabel('R_{relative} (dimensionless)'); ylabel('K_x (rad/m)'); cbar = colorbar; set(get(cbar, 'Title'), 'String', 'dB','fontsize',13); print(gcf, '-djpeg100', 'mag_after_downrange_fft_of_matched_filtered_data.jpg'); if close_as_you_go == 1, close(figcount); end figcount = figcount + 1; end %********************************************************************** %perform the Stolt interpolation %FOR DATA ANALYSIS kstart =73; kstop = 108.5; %kstart = 95; %kstop = 102; Ky_even = linspace(kstart, kstop, 1024); %create evenly spaced Ky for interp for real data clear Ky S_St; %for ii = 1:size(Kx,2) count = 0; for ii = 1:zpad; %for ii = round(.2*zpad):round((1-.2)*zpad) count = count + 1; Ky(count,:) = sqrt(Kr.^2 - Kx(ii)^2); %S_st(ii,:) = (interp1(Ky(ii,:), S_mf(ii,:), Ky_even)).*H; S_st(count,:) = (interp1(Ky(count,:), S_mf(ii,:), Ky_even)); end S_st(find(isnan(S_st))) = 1E-30; %set all Nan values to 0 clear S_mf ii Ky; if do_all_plots == 1, figure(figcount); S_image = angle(S_st); imagesc(Ky_even, Kx, S_image); %imagesc(S_image); colormap(gray); title('Phase After Stolt Interpolation'); xlabel('K_y (rad/m)'); ylabel('K_x (rad/m)'); cbar = colorbar; set(get(cbar, 'Title'), 'String', 'radians','fontsize',13); print(gcf, '-djpeg100', 'phase_after_stolt_interpolation.jpg'); if close_as_you_go == 1, close(figcount); end figcount = figcount + 1; end %apply hanning window to data, cleans up data ALOT N = size(Ky_even,2); for ii = 1:N H(ii) = 0.5 + 0.5*cos(2*pi*(ii-N/2)/N); end for ii = 1:size(S_st,1) S_sth(ii,:) = S_st(ii,:).*H; end %S_st = S_sth; %********************************************************************* %perform the inverse FFT's %new notation: v(x,y), where x is crossrange %first in the range dimmension clear v Kr Krr Kxx Ky_even; v = ifft2(S_st,(size(S_st,1)*4),(size(S_st,2)*4)); %bw = (3E8/(4*pi))*(max(xx)-min(xx)); bw = 3E8*(kstop-kstart)/(4*pi); max_range = (3E8*size(S_st,2)/(2*bw))*1/.3048; figure(figcount); S_image = v; %edited to scale range to d^3/2 S_image = fliplr(rot90(S_image)); cr1 = -80; %(ft) cr2 = 80; %(ft) dr1 = 1 + Rs/.3048; %(ft) dr2 = 350 + Rs/.3048; %(ft) %data truncation dr_index1 = round((dr1/max_range)*size(S_image,1)); dr_index2 = round((dr2/max_range)*size(S_image,1)); cr_index1 = round(( (cr1+zpad*delta_x/(2*.3048)) /(zpad*delta_x/.3048))*size(S_image,2)); cr_index2 = round(( (cr2+zpad*delta_x/(2*.3048))/(zpad*delta_x/.3048))*size(S_image,2)); trunc_image = S_image(dr_index1:dr_index2,cr_index1:cr_index2); downrange = linspace(-1*dr1,-1*dr2, size(trunc_image,1)) + Rs/.3048; crossrange = linspace(cr1, cr2, size(trunc_image, 2)); %scale down range columns by range^(3/2), delete to make like %dissertation again clear ii; for ii = 1:size(trunc_image,2) trunc_image(:,ii) = (trunc_image(:,ii)').*(abs(downrange*.3048)).^(3/2); end trunc_image = dbv(trunc_image); %added to scale to d^3/2 imagesc(crossrange, downrange, trunc_image, [max(max(trunc_image))-40, max(max(trunc_image))-0]); colormap('default'); title('Final Image'); ylabel('Downrange (ft)'); xlabel('Crossrange (ft)'); axis equal; cbar = colorbar; set(get(cbar, 'Title'), 'String', 'dB','fontsize',13); print(gcf, '-djpeg100', 'final_image.jpg'); if close_as_you_go == 1, close(figcount); end figcount = figcount + 1;

先做了fft,不知道是不是就是ppt里说的calibration matrix。

%along track FFT (in the slow time domain) %first, symetrically cross range zero pad so that the radar can squint zpad = 2048; %cross range symetrical zero pad szeros = zeros(zpad, size(sif,2)); for ii = 1:size(sif,2) index = round((zpad - size(sif,1))/2); szeros(index+1:(index + size(sif,1)),ii) = sif(:,ii); %symetrical zero pad end sif = szeros; clear ii index szeros; S = fftshift(fft(sif, [], 1), 1); clear sif; Kx = linspace((-pi/delta_x), (pi/delta_x), (size(S,1)));

然后就是matched filter

%matched filter %create the matched filter eq 10.8 for ii = 1:size(S,2) %step thru each time step row to find phi_if for jj = 1:size(S,1) %step through each cross range in the current time step row %phi_mf(jj,ii) = -Rs*Kr(ii) + Rs*sqrt((Kr(ii))^2 - (Kx(jj))^2); phi_mf(jj,ii) = Rs*sqrt((Kr(ii))^2 - (Kx(jj))^2); Krr(jj,ii) = Kr(ii); %generate 2d Kr for plotting purposes Kxx(jj,ii) = Kx(jj); %generate 2d Kx for plotting purposes end end smf = exp(j*phi_mf); %%%%%%%%%%%% %note, we are in the Kx and Kr domain, thus our convention is S_mf(Kx,Kr) %appsly matched filter to S S_mf = S.*smf; clear smf phi_mf;

然后是stolt interpolation也就是ppt里的stolt transform 

%perform the Stolt interpolation %FOR DATA ANALYSIS kstart =73; kstop = 108.5; %kstart = 95; %kstop = 102; Ky_even = linspace(kstart, kstop, 1024); %create evenly spaced Ky for interp for real data clear Ky S_St; %for ii = 1:size(Kx,2) count = 0; for ii = 1:zpad; %for ii = round(.2*zpad):round((1-.2)*zpad) count = count + 1; Ky(count,:) = sqrt(Kr.^2 - Kx(ii)^2); %S_st(ii,:) = (interp1(Ky(ii,:), S_mf(ii,:), Ky_even)).*H; S_st(count,:) = (interp1(Ky(count,:), S_mf(ii,:), Ky_even)); end S_st(find(isnan(S_st))) = 1E-30; %set all Nan values to 0 clear S_mf ii Ky;

最后是IFFT,也就是ppt上的2D IDFT

%perform the inverse FFT's %new notation: v(x,y), where x is crossrange %first in the range dimmension clear v Kr Krr Kxx Ky_even; v = ifft2(S_st,(size(S_st,1)*4),(size(S_st,2)*4));

然后就可以绘图了 

bw = 3E8*(kstop-kstart)/(4*pi); max_range = (3E8*size(S_st,2)/(2*bw))*1/.3048; figure(figcount); S_image = v; %edited to scale range to d^3/2 S_image = fliplr(rot90(S_image)); cr1 = -80; %(ft) cr2 = 80; %(ft) dr1 = 1 + Rs/.3048; %(ft) dr2 = 350 + Rs/.3048; %(ft) %data truncation dr_index1 = round((dr1/max_range)*size(S_image,1)); dr_index2 = round((dr2/max_range)*size(S_image,1)); cr_index1 = round(( (cr1+zpad*delta_x/(2*.3048)) /(zpad*delta_x/.3048))*size(S_image,2)); cr_index2 = round(( (cr2+zpad*delta_x/(2*.3048))/(zpad*delta_x/.3048))*size(S_image,2)); trunc_image = S_image(dr_index1:dr_index2,cr_index1:cr_index2); downrange = linspace(-1*dr1,-1*dr2, size(trunc_image,1)) + Rs/.3048; crossrange = linspace(cr1, cr2, size(trunc_image, 2)); %scale down range columns by range^(3/2), delete to make like %dissertation again clear ii; for ii = 1:size(trunc_image,2) trunc_image(:,ii) = (trunc_image(:,ii)').*(abs(downrange*.3048)).^(3/2); end trunc_image = dbv(trunc_image); %added to scale to d^3/2 imagesc(crossrange, downrange, trunc_image, [max(max(trunc_image))-40, max(max(trunc_image))-0]); colormap('default'); title('Final Image'); ylabel('Downrange (ft)'); xlabel('Crossrange (ft)'); axis equal; cbar = colorbar; set(get(cbar, 'Title'), 'String', 'dB','fontsize',13); print(gcf, '-djpeg100', 'final_image.jpg'); if close_as_you_go == 1, close(figcount); end figcount = figcount + 1;

除了calibration matrix外,基本上ppt和matlab代码都能对上。

至于为啥按照ppt上的模块就能得到sar图像,以及具体matlab代码如何实现了那些模块的算法,还要后续仔细看论文才能知道。

 

这有个文章是对应ppt的中文翻译

http://www.360doc.com/content/14/1125/00/12979957_427822702.shtml

 

最新回复(0)