?? interpolate_func.m
字號(hào):
function [x_inter] = interpolate_func(x,Rx_cond_Index)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% interpolate_func.m
% This program is designed to interpolate a periodic function, like FFT.
%
% x : Estimated function
% Rx_cond_Index : good point index
% x_inter : Interpolated function
%
%
% Especially designed to interpolate the (inverse) square root of cross power
% spectrum matrix.
%
% Designed by Binning Chen on October 31, 2000
% Communications and Signal Processing Laboratory
% ECE Department, Drexel University
% Philadelphia, PA 19104, USA
% http://www.ece.drexel.edu/CSPL
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
NF=length(x);
x=x(:).';
x_ext=repmat(x,1,3); %%% Extended x
Minimum_Good_Length=3;
Maximum_Good_Length=5;
POLY_ORDER=3;
x_inter_ext=x_ext;
good_ones=zeros(1,NF);
good_ones(Rx_cond_Index)=1;
good_ones_ext=repmat(good_ones,1,3);
good_starting_points_ext=find(good_ones_ext-[0 good_ones_ext(1:3*NF-1)] == 1);
good_ending_points_ext=find(good_ones_ext-[0 good_ones_ext(1:3*NF-1)] == -1)-1;
bad_ones_ext=~good_ones_ext;
bad_starting_points_ext=find(bad_ones_ext-[0 bad_ones_ext(1:3*NF-1)] == 1);
bad_ending_points_ext=find(bad_ones_ext-[0 bad_ones_ext(1:3*NF-1)] == -1)-1;
if bad_starting_points_ext(1)==1
bad_segment_number=length(bad_ending_points_ext)/3;
for ii=1:bad_segment_number + 1
bad_starting_points=bad_starting_points_ext(bad_segment_number+ii);
bad_ending_points=bad_ending_points_ext(bad_segment_number+ii);
left_good_start=good_starting_points_ext(bad_segment_number+ii-1);
left_good_end=good_ending_points_ext(bad_segment_number+ii-1);
right_good_start=good_starting_points_ext(bad_segment_number+ii);
right_good_end=good_ending_points_ext(bad_segment_number+ii);
if left_good_end-left_good_start < Minimum_Good_Length |...
right_good_end-right_good_start < Minimum_Good_Length
break; %%% good points Too short, cannot interpolate.
end
left_good_start=max(left_good_start,left_good_end-Maximum_Good_Length+1);
right_good_end=min(right_good_end,right_good_start+Maximum_Good_Length-1);
good_index=[left_good_start:left_good_end, right_good_start:right_good_end];
good_values=[x_ext(good_index)];
coeff=polyfit(good_index,good_values,POLY_ORDER);
bad_index=[bad_starting_points:bad_ending_points];
inter_x=polyval(coeff,bad_index);
x_inter_ext(bad_index)=inter_x;
end
else
bad_segment_number=length(bad_starting_points_ext)/3;
for ii=1:bad_segment_number
bad_starting_points=bad_starting_points_ext(bad_segment_number+ii);
bad_ending_points=bad_ending_points_ext(bad_segment_number+ii);
left_good_start=good_starting_points_ext(bad_segment_number+ii);
left_good_end=good_ending_points_ext(bad_segment_number+ii);
right_good_start=good_starting_points_ext(bad_segment_number+ii+1);
right_good_end=good_ending_points_ext(bad_segment_number+ii+1);
if left_good_end-left_good_start < Minimum_Good_Length |...
right_good_end-right_good_start < Minimum_Good_Length
break; %%% good points Too short, cannot interpolate.
end
left_good_start=max(left_good_start,left_good_end-Maximum_Good_Length+1);
right_good_end=min(right_good_end,right_good_start+Maximum_Good_Length-1);
good_index=[left_good_start:left_good_end, right_good_start:right_good_end];
good_values=[x_ext(good_index)];
coeff=polyfit(good_index,good_values,POLY_ORDER);
bad_index=[bad_starting_points:bad_ending_points];
inter_x=polyval(coeff,bad_index);
x_inter_ext(bad_index)=inter_x;
end
end
x_inter=x_inter_ext(NF+1:2*NF);
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -