How to design a FIR low pass filter and force a subset of filter coefficients to 0? I'm looking into interpolating a signal by 2x and came into this matlab function interp:


  interp
  
  Interpolation — increase sampling rate by integer factor
  
  Algorithms
  
  interp uses the lowpass interpolation algorithm 8.1 described in 1.
  
  1.It expands the input vector to the correct length by inserting 0s between the original data values.
  
  2.It designs a special symmetric FIR filter that allows the original data to pass through unchanged and interpolates to minimize the
  mean-square error between the interpolated points and their ideal
  values. The filter used by interp is the same as the filter returned
  by intfilt.
  
  3.It applies the filter to the expanded input vector to produce the output.


Then about intfilt:


  intfilt
  
  Interpolation FIR filter design
  
  Algorithms
  
  The bandlimited method uses firls to design an interpolation FIR
  filter. The polynomial method uses Lagrange's polynomial interpolation
  formula on equally spaced samples to construct the appropriate filter.


Finally the documentation of firls is here

In short, the algorithm of interp is to insert l-1 zeros between each pair of neighboring input samples (up-sampling) and FIR filter it, where l is the multiplier of interpolation. The FIR filter is designed by intfilt.

E.g. intfilt(2,4,0.5) returns a 15-tap FIR filter with 0.5*fs/2 cut-off for 2x interpolation, in this case:
    [-0.0068, 0.0000, 0.0395, -0.0000, -0.1427, 0.0000, 0.6098, 1.0000, 0.6098, 0.0000, -0.1427, -0.0000, 0.0395, 0.0000,-0.0068]

Observation:

In the above example: all the even coefficients are 0 and the middle coefficient is 1. Recall that this FIR filter is to be used with a 2x up-sampled signal, this means the "original" sample in the input will be unchanged (only multiplied with the center 1), while all the inserted 0s will the calculated by the FIR filter.

This offers two useful properties: 1) computational efficiency: "original" samples are unchanged; 2) lossless-ness: interpolation then down-sample leaves the original signal unchanged. 

Question: 

I found the source code for intfilt and it calls h=firls(n-1,F*2,M); with n=15, F = [0, 0.1250, 0.3750 , 0.5000] and M=[2, 2, 0, 0], then returned h is the same as h = intfilt(2,4,0.5);

Why this n/F/M combination would set all even coefficients of h to 0?
The filter you describe is called a halfband filter. It is symmetric with respect to half the Nyquist frequency ($f_s/4$). The function firls computes the least squares optimal filter. As long as the desired magnitude and the edge frequencies result in a symmetric specification, the optimal approximation will also be symmetric, and, consequently, will be a halfband filter with every other sample away from the center tap equal to zero (up to numerical accuracy).

So any specification for firls of the form


f = [0,0.5-x,0.5+x,1];
m = c*[1,1,0,0];


with $0&lt;x&lt;0.5$ and $c&gt;0$, and an odd filter length will result in a halfband filter.