Signal spectrum using NumPy
I have a signal with dt=0.0005 seconds. One period of the signal looks like:
SIGNAL = [2014, 2025, 2033, 2046, 2049, ...]
import numpy as np
from matplotlib import pyplot as plt
if __name__ == '__main__':
dt = 0.0005
t = np.arange(0, len(SIGNAL) * dt, dt)
plt.plot(t, SIGNAL)
plt.xlabel('time(seconds)')
plt.ylabel('signal')
plt.show()

It is necessary to remove constant component (upper area of the function equal to bottom area):
min_val = max_val = SIGNAL[0]
for i in SIGNAL:
if i < min_val:
min_val = i
if i > max_val:
max_val = i
mid_val = 1. * (max_val + min_val) / 2
for i in range(10):
s = 0
for i in SIGNAL:
s += i - mid_val
if s > 0:
min_val = mid_val
mid_val = (max_val + mid_val) / 2
elif s < 0:
max_val = mid_val
mid_val = (min_val + mid_val) / 2
else:
break
SIGNAL = [i - mid_val for i in SIGNAL]
dt = 0.0005
t = np.arange(0, len(SIGNAL) * dt, dt)
plt.plot(t, SIGNAL)
plt.xlabel('time(seconds)')
plt.ylabel('signal')
plt.show()

FFT:
n = len(SIGNAL)
y = np.fft.fft(SIGNAL) / n # normalize
frq = np.fft.fftfreq(n=n, d=dt)
# only positive frequencies
y = y[:n/2]
frq = frq[:n/2]
plt.bar(frq, abs(y))
plt.xlabel('Freq (Hz)')
plt.ylabel('|Y(freq)|')
plt.show()

frq_resolution = samples_per_second / n_samples = 2.67 Hz
Links:
Licensed under CC BY-SA 3.0