NCL Home > Documentation > Functions > General applied math


Calculates one-dimensional filter weights.

Available in version 4.3.1 and later.


	function filwgts_lanczos (
		nwt    [1] : integer,          
		ihp    [1] : integer,          
		fca    [1] : float or double,  
		fcb    [1] : float or double,  
		nsigma [1] : numeric           

	return_val [nwt] :  float or double



A scalar indicating the total number of weights (must be an odd number; nwt >= 3). The more weights, the better the filter, but there is a greater loss of data.


A scalar indicating the low-pass filter: ihp = 0; high-pass ihp = 1; band-pass ihp = 2.


A scalar indicating the cut-off frequency of the ideal high or low-pass filter: (0.0 < fca < 0.5).


A scalar used only when a band-pass filter is desired. It is the second cut-off frequency (fca < fcb < 0.5).


A scalar indicating the power of the sigma factor (nsigma >= 0). Note: nsigma=1. is common.

Return value

An array of length nwt is returned. The type will be double if fca is double, and float otherwise.


Given a user-specified number of weights (must be odd), filwgts_lanczos returns a symmetrical set of weights.

The user may have to iterate using different numbers of weights to get the desired response. The usual caveats apply: the narrower the filter, the more weights required and, thus, the more data at each end that is lost.

The derived weights can be input to the function wgt_runave to apply the filter to a series if data values. Usually, the kopt=0 is chosen for wgt_runave when applying the weights to, say, a time series.

The response function (frequency and amplitude) are returned as attributes of the returned weights (say, wt). Specifically: the attributes wt@freq and wt@resp are one-dimensional arrays of length (2*nwt+3) and the same type as wt. These may be plotted for a visual examination of the filter response.

Reference: C. Duchon
J. Applied Meteorology; August,1979; pp 1016-1022
Lanczos Filtering in One and Two Dimensions
                  i              low pass 
             1.0  i---------   
                  i        |  
                  i        |
                  i        |      
                  i        |        
             0.0  i________|______________________________
                 0.0      fca                          0.5

                  i              high pass
             1.0  i              ----------------------
                  i              |   
                  i              |
                  i              |
                  i              |
                  i              |  
             0.0  i______________|________________________
                 0.0            fca                    0.5

                  i              band pass
             1.0  i           |------------|      
                  i           |            | 
                  i           |            |   
                  i           |            |     
                  i           |            |           
             0.0  i___________|____________|_______________
                 0.0         fca          fcb          0.5

In response to a question posted to, Dave Allured (CU/CIRES), posted the following:

     NCL's filter functions operate over discrete time steps in a time series.
     Their time metric is time steps, *not* calendar time or real time.  This
     is a common point of confusion about digital filters.

     Therefore, the filters *do not care* about your time units or time
     coordinate variable.  To get correct filter parameters, you must
     manually (or with clever programming) express your time domain
     parameters in terms of *time steps*.

     For example, if the desired filter is 10 to 50 days, and the time
     series is on 3-day time steps, then:

            dt = 3 days per time step
            t1 = 50 days  (low frequency cutoff, expressed in time domain)
            t2 = 10 days  (high frequency cutoff, expressed in time domain)

            fca = dt/t1 = 3./50. = 0.06 time steps  (low frequency cutoff)
            fcb = dt/t2 = 3./10. = 0.30 time steps  (high frequency cutoff)
More filter examples are discussed here.

Note: this function is not a new one. It used to be named "filwgts_lancos", and we renamed it to reflect the correct spelling of Cornelius Lanczos' name.

See Also

bw_bandpass_filter, filwgts_normal, wgt_runave_n, wgt_runave, wgt_runave_n_Wrap, wgt_runave_Wrap, filter applications


Example 1

This example generates the weights for a low pass filter using nine weights:

    nwt = 9
    fca = 0.2
    ihp = 0          
    nsigma = 1.
    wgt = filwgts_lanczos (nwt, ihp, fca, -999., nsigma)  

wgt@freq and wgt@resp are returned as one-dimensional arrays containing a set of frequencies and the response at each frequency.

Example 2

This example generates the weights for a high pass filter using seven weights:

    nwt = 7  
    fca = 0.4
    ihp = 1          
    nsigma = 1.
    wts = filwgts_lanczos (nwt, ihp, fca, -999., nsigma)  

Example 3

This example generates the weights for a band pass filter using 21 weights:

    nwt = 21
    fca = 0.2
    fcb = 0.35
    ihp = 2          
    nsigma = 1.
    wts = filwgts_lanczos (nwt, ihp, fca, fcb, nsigma)  

Example 4

The above examples focus on 'time'. However, the function can be used for any equally spaced set of values. Consider a set of values (z) spaced 100m apart and information from (say) 500m scales and larger are desired,

    nwt = 17
    ihp = 0
    dz  = 100.0  ; m  ... grid spacing (separation)
    d1  = 500.0  ; m
    fca = dz/d1  ; = 0.2  

    wts = filwgts_lanczos (nwt, ihp, fca, -999, 1.0)