I'm trying to study vibrations in a non-stationary shaft by upsampling the original signal.

The original sample rate is at 25.6kHz, and it is being upsampled to 36kHz. In the FFT of the upsampled signal I am getting freq. components above the Nyquist frequency of 12.8 kHz. I'm using linear interpolation when upsampling.

Is this imaging/aliasing? What are common techniques for dealing with such behaviour? I'm working in python/matlab.


Yes I would suggest to use resample_poly in scipy. When doing upsampling, you would get artefacts outside 12.8kHz, which you would remove via Low Pass Filtering. This is what is done by scipy.signal.resample_poly. You can enter the upsampling factor value as 36k/25.8k = 1.39534, and downsampling factor = 1.

In the above method while doing low pass filtering, the effect in time domain is to do sinc-interpolation. But in Linear Interpolation, you are not doing interpolation using sinc functions. You are just using neighboring points to compute the interpolated value. This is like moving average filtering, whose effect in frequency domain is sinc. It will not totally filter out all the artefacts outside 12.8kHz. But you still can improve it by taking more number of points for linear interpolation.

Here is the figure showing remains of original signals copy even after doing linear interpolation beyond 12.8kHz (not an exact mathematically correct shape).

enter image description here

  • $\begingroup$ Thanks. I have another problem maybe you could help with. My component is rotating, so I need to move from the time domain to the angular domain. I need to have equal amounts of samples within each "revolution", and therefore need to apply upsampling to accomplish this (there are about 10 revolutions in one signal). However, since the total signal will consist of different sample rates (for each revolution) in the angular domain- how do I perform a bandpass filter on this signal now? $\endgroup$ – meerkat Mar 24 '20 at 11:04
  • 1
    $\begingroup$ I think scipy.signal.resample_poly() is an integer up/down polyphase resampler so you can't just plug in 1.39534. In this case you are lucky since 36/25.6 is exactly 45/32. Otherwise you either need to tweak your upsampled (it that's possible) or find a asynchronous converter that allows for real (not just rational) conversion ratios $\endgroup$ – Hilmar Mar 24 '20 at 11:44
  • $\begingroup$ Thanks @Hilmar I will correct it. $\endgroup$ – jithin Mar 24 '20 at 14:07
  • 1
    $\begingroup$ @user10971344 , though I did not full understand your requirement, it is easy to get coefficients for BPF from MATLAB. You need to see the normalized frequencies you want to pass through. If you are stuck you can ask another question here for it. $\endgroup$ – jithin Mar 24 '20 at 14:07

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.