Search code examples
pythonnumpyfftspectrum

Choosing a precise frequency interval for power spectrum


I want to compare the power spectra of the time traces of two random processes but the frequency range returned is different.

How is that frequency range chosen and how can I modify it ?

More specifically, what I do is the following:

from scipy import signal as sgn

spectrum1=sgn.periodogram(signal1,fs=fs1)
spectrum2=sgn.periodogram(signal2,fs=fs2)

and my problem is that spectrum1[0] has a significantly different range with respect to spectrum2[0].


Solution

  • The periodogram is computed using FFT (Fast Fourier Transform), which implements the DFT (Discrete Fourier Transform). The DFT of a periodic signal features discrete frequencies, all multiple of a fundamental frequency consistent with the duration of the frame T : f_0=1/T.

    As a consequence, to get the same frequencies, the durations of the frame must be similar, of at least a multiple of one another:

    len(signal1)/fs1 = k*len(signal2)/fs2
    

    It may require to truncate one of the arrays. The argument nfft of scipy.signal.periodgram() may also be tried, the requirement becomes:

    nfft1/fs1 = k*nfft2/fs2
    

    If the duration of the frame is not consistent with the actual period of the signal, or if the signal is not periodic, windowing may limit the effects of spectral leakage. It is so useful that it is integrated to scipy.signal.periodgram() as an argument. You may try values 'hann' or 'parzen' as listed here.

    If the sampling rates are not similar, resampling the signal may be required. To this end scipy.signal.resample() can be applied. It also features the argument window and makes use of FFT for resampling, thus avoiding some errors that linear interpolation would trigger.