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

📄 interpolate_func.m

📁 基于二阶和高阶统计量的MIMO系统盲信道估计
💻 M
字号:
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);

⌨️ 快捷键说明

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