# Sample rate conversion of a complex bandpass signal

I have a complex bandpass signal. I need to upconvert it from 230.4 Msps to 245.75 Msps, i.e. by a factor of 16/15. What would be the best way to do it?

Clarifying terminology first, for a change in the sample rate this would be referred to as "resampling" and not "upconversion". Upconversion involves a frequency translation of the center bandwidth of the bandpass signal, but since the OP used sampling rates in Msps and not band centers in Hz, I assume the intention of the question is indeed resampling.

A very efficient way to achieve this is with polyphase resampling. The polyphase structure is developed by first considering the brute force approach of using a rational resampling with an upsample by 16 (insert 15 zeros between every sample) followed by a FIR filter to eliminate the resampling images as well as reject the image bands in the subsequent downsampling, and then finally downsampling by selecting every 15th sample, as depicted in the diagram below:

I recommend designing the filter as a multi-stopband using the least squares algorithm given by firls in MATLAB, Octave or Python scipy.signal as it can optimally implement the rejection only where it is needed (for this understand first the imaging and aliasing effects when upsampling and downsampling): as detailed further here, "perfect" interpolation is accomplished when the filter after the zero insert operation passes the passband with no distortion and completely rejects all the images, this is not feasible for actual implementations, but at the expense of delay and filter complexity we can minimize the noise to any level desired. (Similarly "perfect" decimation is done when the noise from the alias regions is completely rejected prior to downsampling).

The same FIR filter for above is used to create the polyphase structure by mapping the coefficients in row to column form to create the 16x polyphase interpolator as shown below. (See this post for more details on the "row to column" mapping for creating the polyphase structures.) This means the first 16 coefficients of the FIR filter become the first coefficients for each of the filters in the polyphase filterbank, starting from top to bottom, and then continuing for the next 16 coefficients to be the second coefficient in each filter, etc).

The decimation is done by skipping every 15 samples, which basically is running the commutator as shown above in the other direction. Note the significant advantage here is that nothing is actually running faster than the input rate R! Further efficiency improvements can potentially be realized by replacing the single interpolate by 16 with two interpolate by 4's in cascade.

See these other posts for further details on implementing polyphase filters:

Polyphase Filter Implementation for oversampled (undecimated) wavelet lifting scheme?

What is the difference of each frequency response of partial filters in a polyphase method

4-phase FIR LPF in MATLAB

Polyphase FIR filtering as describe by Dan is definitely the way to go in this case.

The "art" of sample rate conversion is the design of the interpolation filter. That's where you dial in all the requirements of your application. These typically are

1. Extension of pass-band
2. Allowable amplitude ripple in the passband
3. Max phase distortion in the pass band.
4. Minimum amount of aliasing rejection (this also depends on your signal spectrum), overall signal to noise ratio.
5. Max Latency
6. Memory and CPU constraints. Real time considerations
7. More application specific requirements (intermodulation, sine wave amplitude modulation, transition band behavior, etc)

All of these can be managed in the filter design process.