How to increase the frequency resolution in FFT?

I'm still learning. I have checked many questions on here similar to mine, but have not found an answer.

I'm analyzing the oscillation of a train catenary system. Due to bad sampling frequency and short time periods of interest, I don't have that many samples. Additionally, four recorded frequencies are apparently around 0.92 Hz. I can't tell them apart in the frequency spectrum and thus want to increase frequency resolution. I think I will not be able to distinguish them all, they're too close, but maybe at least two or three.

This is my signal in time domain:

I know I need to increase the number of samples I feed into the FFT. I have read that zero-padding might be an option, but have also read that it leaves artifacts and is not suited to increase frequency resolution. I have also read that the signal can be mirrored along both axes and added in the end, which I don't think is a good idea for this signal. I thought increasing samples by adding interpolated samples would be an idea, since it also wouldn't be that time-consuming considering the low amount of samples.

Are there options I missed? Does my idea sound dumb?

• What is your sampling frequency? To me, that data looks like the output of a resonant filter driven by noise -- if so, then it would make sense that it's spectrum is spread out somewhat, matching the bandwidth of the filter. Nov 1, 2021 at 19:51
• My sampling frequency is 40 Hz. You mean there might be a hardware filter in the measurement? Nov 1, 2021 at 19:58
• In general, there is no way to increase the information in the samples you have just by manipulating them. You do need more samples to improve the resolution.
– MBaz
Nov 1, 2021 at 20:50
• Thank you, that's really all I need to know then. Nov 1, 2021 at 20:58
• A cable hanging in the air is a filter from the force of the air to the position of the cable. And it's hardware. And it's resonant, and damped. And if there's air flowing by then it'll be excited by random noise. So, yes, there's a hardware filter in there. Nov 2, 2021 at 0:13

The FFT itself is an exact transformation from the sample-time domain to the frequency domain -- but only for a signal that is either bounded in time or periodic, and is in discrete time.

When you take a continuous signal of infinite extent and sample it into a finite-length vector, then you are approximating that continuous, infinite extent signal. If you take such a sample and perform an FFT on it, then the FFT acts as if you're doing the transform of a periodic signal -- in particular, any mismatch between the beginning and the end of the signal will behave just like a step.

To squeeze the most information out of your sampled signal, you need to massage the signal first, before applying it to the FFT.

Usually you do this by detrending the data (removing its mean, and often any slope), then windowing it with one of the popular windowing functions (Hann, Blackwood, etc.)

Choosing a window is an inexact science, so you may want to just try several (after detrending). My preference when I have a signal that has a strong sinusoidal component with a lot of repetitions is a Tukey window -- I'm not sure if it's the best, but I believe that presenting the FFT with as much of the sine wave as you can tends to enhance it.

None of this will necessarily enhance the frequency resolution -- but if you detrend and window, then FFT, and if you're still seeing a frequency spread around what seems to be the "real" signal, then that probably means that you're seeing something close to the truth.

• I detrend and window the data. I used a Blackman-Harris-Window mostly, because any other windows did not really yield any other results. The peaks move a little bit when I window the data, but that's really it. There's no more peaks to observe, or better resolution than when I don't window even. (The detrending has a huge impact though.) I'll try the Tukey window, haven't tried it yet. Nov 2, 2021 at 10:57