interpol函数介绍

一维数组插值

result=interpol(v,x,xout,/lsquadratic,/quadratic,/spline,/NAN)

v为输入的数组,x为v中各个元素对应的横坐标值,xout为插值结果数组中各个元素对应的横坐标值的v值(可参考下面代码中的注释帮助理解)。

/lsquadratic,/quadratic,/spline为插值方法关键字,未设置时默认线性插值。

/NAN于设置插值的时忽略NAN值。

以下是官方对关键字的解释:

idl中的refresh idl中的插值函数_idl

interpol函数举例
y=[1,3,5,7,9]
x=[0,1,2,3,4]
x_interpol=[1.5,2.5,3.5]
print,interpol(y,x,x_interpol)
      4.00000      6.00000      8.00000
y=[1,3,5,7,0.0/0]
x=[0,1,2,3,4]
x_interpol=[1.5,2.5,3.5]
print,y
print,interpol(y,x,x_interpol,/nan)
      1.00000      3.00000      5.00000      7.00000         -NaN
      4.00000      6.00000      8.00000
遥感中实际应用举例

波段响应函数,英文名为spectral response function(SRF)或者叫Relative Spectral Response (RSR) ,与宽波段传感器出现。我们知道每一个波段都有一个波段范围,比如HJ-b1(475nm)波段为520-430纳米,实际上传感器的感光元件在这个波段范围内的每一点所感应的强度都是不一样。在成像中,原则上讲应该根据波段响应函数来进行加权平均,但由于处理起来比较麻烦,而且一般的精度要求不太高,所以大多数图像都是直接取了波段范围内的中点值来运算。波段响应函数是描述一定波长范围内(超出波段范围)的量子效应,当需要精确计算像元响应时候,比如大气校正反演真实地表反射率,就需要使用波谱响应函数。参考:ENVI-IDL技术殿堂:ENVI下波谱响应函数(波段响应函数)制作 以下为FY3C-MERSI band5波谱响应函数,波长单位为nm,波长间隔为10nm
波谱响应函数第一列为波长,后面列为各波段对应的波谱响应值

9500.000  0.000
9700.000  0.000
9750.014  0.000
9759.999  0.00102
9770.013  0.00201
9779.995  0.00397
9790.006  0.00722
9799.984  0.01213
9809.993  0.01895
·······
12520.00  0.01050
12529.98  0.01039
12539.99  0.01133
12550.00  0.010
12560.01  0.009
12569.98  0.00
12579.98  0.00
12589.99  0.00
12599.98  0.00
12610.01  0.00
12620.00  0.00
12629.99  0.00
12640.01  0.00
12650.00  0.00
13000.00  0.00

而有时候辐射传输模型需要波长间隔为1nm或者25nm的波谱响应函数文件,所以需要插值得到符合要求的波谱响应函数。
以下代码为将原始10nm间隔波谱响应插值到1nm间隔。

pro interpol_function
  fn=dialog_pickfile(title='请选择文件')
  openr,lun,fn,/get_lun
  ;查询文件的行数
  nl=file_lines(fn)
  ;定义储存数据的数组
  data=fltarr(2,nl-1)
  readf,lun,data
  free_lun,lun
  ;获取起始波长
  start_wl=data[0,0]
  ;获取终点波长
  end_wl=data[0,-1]
  ;定义要得到的波长序列,即波长间隔为1nm
  interpol_wl=indgen(1,end_wl-start_wl+1)+start_wl
  wl=data[0,*]
  re=data[1,*]
  ;re为原始函数中的y值,wl为原始函数的x值,interpol_wl为要插值的x值
  ;得到插值到的interpol_re y值
  interpol_re=interpol(re,wl,interpol_wl)
  ;循环写出新波谱响应函数
  nl=n_elements(interpol_wl)
  final_data=fltarr(2,nl)
  for i=0,nl-1 do begin
    final_data[1,i]=interpol_re[i]
  endfor
  for j=0,nl-1 do begin
     final_data[0,j]=interpol_wl[j] 
  endfor
  ;写出文件
  ofn=dialog_pickfile(title='文件保存为')
  openw,lun,ofn,/get_lun
  printf,lun,final_data
  free_lun,lun
end
运行结果:
······
      9960.00     0.288981
      9961.00     0.291402
      9962.00     0.293823
      9963.00     0.296243
      9964.00     0.298664
      9965.00     0.301085
      9966.00     0.303505
      9967.00     0.305926
      9968.00     0.308347
      9969.00     0.310767
      9970.00     0.313188
      ·······
      10154.0     0.785261
      10155.0     0.787254
      10156.0     0.789248
      10157.0     0.791241
      10158.0     0.793234
      10159.0     0.795227
      10160.0     0.797220
      10161.0     0.799155
      10162.0     0.801090
      10163.0     0.803025
      10164.0     0.804960
      10165.0     0.806896
      ······
      12474.0    0.0312388
      12475.0    0.0304180
      12476.0    0.0295972
      12477.0    0.0287764
      12478.0    0.0279556
      12479.0    0.0271348
      12480.0    0.0263173
      12481.0    0.0256645
      12482.0    0.0250118
      ······

绘制波谱响应曲线:

idl中的refresh idl中的插值函数_数组_02