Skip to content

FFT of a Real Periodic Signal: Naive versus Windowed

FFT demo of a real, periodic signal

a) naive way b) windowing with DC treatment

FFT of a Real Periodic Signal: Naive versus Windowed

from matplotlib.pyplot import annotate, figure, grid, legend, plot, show, title, xlabel, xlim, ylabel
from numpy import arange, ceil, cos, fix, loadtxt, log2, mean, pi, sin, sqrt, zeros
from numpy.fft import fft

# redefine default figure size and fonts
import matplotlib as mpl
# mpl.rc('text', usetex = True)
mpl.rc('font', family = 'sans serif',size=16)
mpl.rc('figure',figsize=(12,8))
mpl.rc('lines', linewidth=1, color='lightblue',linestyle=':',marker='o')

Given periodic signal, sampling frequency and total time

f_s = 100.0 # sampling frequency (Hz)
T = 3.0 # total actual sample time (s)
g = loadtxt('data/FFT_Example_data_with_window.txt')
# first few values
g[:5]
array([-1.7527, -0.565 ,  0.8801,  3.1924,  1.2804])
# first, visualize the signal
del_t = 1/f_s   # time resolution [s]
t = arange(0.0,T+del_t,del_t)  # time, t (s)

# plotSignal(t,g,f_s)
plot(t,g,marker='o',markerfacecolor='b',linestyle=':',color='lightgrey')
xlabel('$t$ (s)')
ylabel('$g_i$ (V)')
title('Periodic time signal sample')
show()
# does it have a non-zero mean, DC value
DC = g.mean()
print ('DC = %f [V]' % DC)
DC = 0.452950 [V]

Calculate the necessary parameters: \(N, \Delta t, \Delta f, f_{fold},N_{freq}\)

N = f_s * T  # number of data points
del_t_1 = 1.0 / f_s  # time resolution (s)
del_f = 1.0 / T  # frequency resolution(Hz)
f_fold = f_s / 2.0  # folding frequency = Nyquist frequency of FFT (Hz)
N_freq = int(N / 2.0)  # number of useful frequency points

Frequency analysis using naive FFT

frequency = arange(0,f_fold,del_f)  #frequency (Hz)
G = fft(g) # FFT 
print( G[:10])
print( G.shape)
[136.3379    +0.j           0.85689194+0.01756347j
   0.7956033 +0.03999151j   0.83065943+0.02317239j
   0.81648114+0.01029308j   0.86012694-0.03048062j
   0.88366205-0.03279026j   0.91944369-0.03388283j
   0.82537342-0.0616697j    0.78619988+0.03823325j]
(301,)
Magnitude = abs(G)/(N_freq)  # complex -> amplitude:  |F|/(N/2)

figure()
plot(frequency,Magnitude[:N_freq])
grid('on')
xlim([-.5,f_fold])
xlabel('$f$ [Hz]')
ylabel('$|F|$ [V]')
annotate('DC', xy=(0,.9), xycoords='data',
                xytext=(60, 60), textcoords='offset points',
                size=20,
                arrowprops=dict(arrowstyle="fancy",
                                fc="0.6", ec="none",
                                connectionstyle="angle3,angleA=0,angleB=90"),
                )
show()

Notes

  1. Note the value at 0 Hz, what can we learn from it (we saw it's about 0.45 Volt?
  2. What do we learn from about the frequencies? about 2.1V at 16 Hz and 0.7 Volt at 47 Hz?
  3. Let's remove DC first and see the result
figure()
plot(t,g,t,g-DC,'ms')
xlabel('$t$ [sec]')
ylabel('$g$ [V]')
legend(('original','DC removed'))
# repeat the frequency analysis
G_1 = fft(g - DC)  # FFT of the signal without DC
Magnitude1 = abs(G_1) / N_freq  # complex -> amplitude:  |F|/(N/2)
figure()
plot(frequency, Magnitude[:N_freq], frequency, Magnitude1[:N_freq], '--ms')
annotate('DC', xy=(0, 0), xycoords='data', xytext=(60, 60), textcoords='offset points', size=20, arrowprops=dict(arrowstyle='fancy', fc='0.6', ec='none', connectionstyle='angle3,angleA=0,angleB=45'))
grid('on')
xlim([-0.5, f_fold])
xlabel('$f$ [Hz]')
ylabel('$|F|$ [V]')
legend(('original', 'DC removed'))
show()

Let's use do it the right way:

  1. use 2^k number of points for faster FFT
  2. multiply the signal by a low-pass filter:
    • assure there is no aliasing
    • get read of the edges and make it less leaking
# let's check how much we gain if we do it right size:
fft(g)
fft(g[:256])  # 256 points instead of 301, not waisting much data
_g1 = zeros((512,))
_g1[:301] = g.copy()
# even if it's longer, but the right size with zeros at the end
fft(_g1)
array([ 1.36337900e+02+0.00000000e+00j, -2.15037892e+01-6.70899063e+01j,
        1.63920150e+01-1.16122483e+01j, -1.30017620e+01-9.62075975e+00j,
        5.67850309e+00-1.61176004e+01j, -2.06970867e+00+9.59591827e-02j,
       -3.49126610e+00-1.22162369e+01j,  4.01745426e+00-2.43348077e+00j,
       -5.85735822e+00-4.64637366e+00j,  2.96478277e+00-7.05799808e+00j,
       -2.30327105e+00+3.04246134e-02j, -1.67679332e+00-7.60978954e+00j,
        1.97554791e+00-8.06605801e-01j, -4.38903862e+00-4.01587044e+00j,
        2.38009866e+00-4.40250032e+00j, -2.85848950e+00-1.74292733e-01j,
       -6.57005861e-01-6.00635672e+00j,  7.52902960e-01+5.60339915e-02j,
       -3.55640413e+00-4.03809831e+00j,  2.19920603e+00-2.80840454e+00j,
       -3.20042591e+00-6.39491828e-01j,  2.39279019e-01-5.22248102e+00j,
       -2.56589774e-01+4.54357759e-01j, -2.86795982e+00-4.41337553e+00j,
        2.02011198e+00-1.59281317e+00j, -3.56940867e+00-1.45847279e+00j,
        1.03011577e+00-4.44600184e+00j, -1.25206751e+00+5.41723402e-01j,
       -1.94002203e+00-4.86621659e+00j,  1.54237055e+00-6.41241933e-01j,
       -3.66294520e+00-2.47589602e+00j,  1.65226600e+00-3.67658252e+00j,
       -2.31545893e+00+2.06649456e-01j, -9.38434863e-01-5.13498171e+00j,
        7.64386930e-01+1.20717724e-01j, -3.47766888e+00-3.51924824e+00j,
        2.14250316e+00-2.69936502e+00j, -3.17905518e+00-5.61387309e-01j,
        1.97934888e-01-5.21989197e+00j, -2.18103177e-01+5.79113378e-01j,
       -2.88101595e+00-4.75835821e+00j,  2.20971728e+00-1.67428472e+00j,
       -3.86523185e+00-1.74974394e+00j,  1.37575755e+00-5.00416055e+00j,
       -1.48132263e+00+5.67836936e-01j, -1.90327353e+00-5.90984008e+00j,
        1.91206035e+00-6.63170248e-01j, -4.29500338e+00-3.48545073e+00j,
        2.44158600e+00-4.35998521e+00j, -2.99785324e+00-1.05128032e-01j,
       -4.72579145e-01-6.79380572e+00j,  9.13293546e-01+1.06461654e-01j,
       -4.13602608e+00-5.41420201e+00j,  3.21673287e+00-3.44200216e+00j,
       -4.42681081e+00-1.48748786e+00j,  1.22554005e+00-7.47395531e+00j,
       -5.90648324e-01+5.68122783e-01j, -3.35457959e+00-7.88831793e+00j,
        3.45908687e+00-2.17818975e+00j, -5.75133993e+00-3.88995289e+00j,
        3.31117389e+00-7.68660419e+00j, -2.81565667e+00+1.20955925e-01j,
       -1.71688526e+00-1.07295069e+01j,  2.91310254e+00-8.99274030e-01j,
       -6.79881000e+00-7.68049366e+00j,  5.66477237e+00-7.47670447e+00j,
       -5.95754594e+00-1.66428465e+00j,  1.26155191e+00-1.43196310e+01j,
        1.28174642e+00+2.17558717e-01j, -7.17587986e+00-1.43906208e+01j,
        8.52826682e+00-7.02966990e+00j, -1.09080010e+01-6.74336599e+00j,
        6.98497354e+00-2.05343130e+01j, -3.14523221e+00+2.86933127e-01j,
       -6.55701211e+00-2.99846844e+01j,  1.41855087e+01-6.89294188e+00j,
       -2.43592829e+01-2.59542302e+01j,  2.81960122e+01-4.42758447e+01j,
       -2.85446185e+01-8.23079097e+00j,  6.30694874e+00-2.05878097e+02j,
       -3.18508678e+02+7.67448870e+01j,  6.61526789e+01+1.21334480e+02j,
       -4.24512573e+01+4.12694543e+01j,  2.37165300e+01+1.45873356e+01j,
       -1.12312653e+01+4.01964956e+01j, -1.20125274e+00+3.67185184e-01j,
        6.74902084e+00+2.64939868e+01j, -1.16615185e+01+7.04291201e+00j,
        9.69809273e+00+1.02726789e+01j, -8.39705099e+00+1.51153241e+01j,
        2.55270763e+00+1.07881752e+00j,  9.07522985e-02+1.56142864e+01j,
       -5.03929759e+00+1.78111885e+00j,  5.08334556e+00+9.17124859e+00j,
       -6.56548640e+00+7.24190530e+00j,  3.34136092e+00+2.30419347e+00j,
       -2.43810547e+00+1.03878676e+01j, -1.80556343e+00+4.30000899e-01j,
        2.26489680e+00+8.24598640e+00j, -4.89317296e+00+3.40163700e+00j,
        3.12103213e+00+3.40630267e+00j, -3.51146132e+00+6.90523767e+00j,
        1.25099560e-01+4.88239891e-01j,  2.73218807e-01+7.08234119e+00j,
       -3.30357928e+00+1.35174450e+00j,  2.30350022e+00+4.16320885e+00j,
       -3.67394482e+00+4.35090873e+00j,  1.06765079e+00+9.92731653e-01j,
       -1.25087520e+00+5.89678669e+00j, -1.80885493e+00+5.21090984e-01j,
        1.34283253e+00+4.48983112e+00j, -3.34315589e+00+2.48412528e+00j,
        1.47974553e+00+1.74243220e+00j, -2.16685484e+00+4.53746132e+00j,
       -5.85160488e-01+2.50539347e-01j,  1.52676290e-01+4.44343261e+00j,
       -2.60601968e+00+1.25455573e+00j,  1.31546188e+00+2.44134032e+00j,
       -2.52750985e+00+3.24387534e+00j,  2.25082520e-01+4.67061074e-01j,
       -7.58242795e-01+4.09176090e+00j, -1.76960220e+00+4.29375346e-01j,
        8.45906089e-01+2.96153433e+00j, -2.55981658e+00+2.04046494e+00j,
        7.12219724e-01+9.79704041e-01j, -1.54277529e+00+3.45505210e+00j,
       -8.49860860e-01+1.61507423e-01j,  1.89175606e-01+3.15062569e+00j,
       -2.21080000e+00+1.10190000e+00j,  8.89499761e-01+1.49634420e+00j,
       -2.04681749e+00+2.58154516e+00j, -1.28464273e-01+1.93330835e-01j,
       -5.73083071e-01+3.08799305e+00j, -1.65317068e+00+3.61273238e-01j,
        5.99202329e-01+2.05505300e+00j, -2.17524998e+00+1.69219521e+00j,
        3.70979341e-01+5.57821043e-01j, -1.26803285e+00+2.65633536e+00j,
       -1.00681640e+00+7.13925212e-02j,  6.11106432e-02+2.35338137e+00j,
       -1.97166109e+00+9.66881074e-01j,  4.72188634e-01+1.00940491e+00j,
       -1.68000963e+00+2.17331131e+00j, -4.25817703e-01+8.43387940e-02j,
       -4.11144006e-01+2.42726060e+00j, -1.65098202e+00+3.75639614e-01j,
        4.59349733e-01+1.49110213e+00j, -1.91846628e+00+1.49835776e+00j,
        4.86799207e-02+3.26203595e-01j, -9.35271762e-01+2.27167302e+00j,
       -1.14482476e+00-2.11128758e-02j,  1.25907553e-01+1.86914199e+00j,
       -1.87998223e+00+8.97068078e-01j,  3.68841194e-01+6.91384806e-01j,
       -1.42372964e+00+1.92468847e+00j, -5.11827934e-01-1.00286505e-01j,
       -3.04681666e-01+2.03260226e+00j, -1.54412463e+00+2.82737671e-01j,
        3.46666515e-01+1.07019582e+00j, -1.68226285e+00+1.39799601e+00j,
       -5.74214196e-02-1.23321692e-02j, -8.61845987e-01+1.97640023e+00j,
       -1.15227717e+00-4.97814925e-02j,  1.93455627e-01+1.45417630e+00j,
       -1.80884216e+00+7.72261631e-01j,  2.00060184e-01+4.45332527e-01j,
       -1.17993254e+00+1.77928776e+00j, -6.39013582e-01-2.69086067e-01j,
       -1.78743214e-01+1.75472272e+00j, -1.54809969e+00+2.90873201e-01j,
        4.38404748e-01+7.49819722e-01j, -1.58579304e+00+1.29675325e+00j,
       -8.76036952e-02-1.78151785e-01j, -6.28681050e-01+1.72528257e+00j,
       -1.23712427e+00-1.85507014e-01j,  2.67683496e-01+1.19289921e+00j,
       -1.68991730e+00+7.63713547e-01j,  1.93955454e-01+8.96694844e-02j,
       -1.06386336e+00+1.70577791e+00j, -6.83275720e-01-4.13903311e-01j,
        9.15307938e-03+1.50448878e+00j, -1.61212274e+00+2.47426805e-01j,
        5.08676665e-01+5.23023178e-01j, -1.38272886e+00+1.29269278e+00j,
       -1.85092650e-01-4.69247827e-01j, -3.65907590e-01+1.70900025e+00j,
       -1.27436658e+00-3.17816355e-01j,  5.14989321e-01+9.42756306e-01j,
       -1.65082051e+00+7.59540965e-01j,  2.76235638e-01-2.65146163e-01j,
       -8.98031992e-01+1.74406977e+00j, -6.97549398e-01-6.47336367e-01j,
        2.85409999e-01+1.35570634e+00j, -1.64268471e+00+2.20626785e-01j,
        7.47058251e-01+1.72653471e-01j, -1.31670689e+00+1.37370353e+00j,
       -9.54310062e-02-7.87580023e-01j, -1.20890125e-01+1.64557712e+00j,
       -1.35598806e+00-3.66734477e-01j,  9.23955452e-01+6.83587784e-01j,
       -1.64976971e+00+8.35693733e-01j,  4.99427484e-01-6.00646274e-01j,
       -5.46742118e-01+1.76166256e+00j, -8.49071354e-01-9.23802423e-01j,
        8.16798142e-01+1.28954572e+00j, -1.68374515e+00+2.24050718e-01j,
        1.12778233e+00-3.06483635e-01j, -1.19423094e+00+1.62517821e+00j,
       -6.51958602e-02-1.14354101e+00j,  5.96555297e-01+1.83439905e+00j,
       -1.47161352e+00-6.17750758e-01j,  1.55925108e+00+4.41476813e-01j,
       -1.50780600e+00+1.15015740e+00j,  8.92529377e-01-1.20698358e+00j,
        1.15010577e-01+2.12163518e+00j, -9.11588410e-01-1.31042352e+00j,
        1.92658449e+00+1.18847762e+00j, -1.78751446e+00+4.41961910e-01j,
        2.07074628e+00-9.74881693e-01j, -5.63039293e-01+2.26339262e+00j,
        1.67170630e-01-1.95785767e+00j,  2.08600784e+00+2.16004501e+00j,
       -1.65927115e+00-5.32758685e-01j,  3.54642675e+00-2.80627639e-01j,
       -1.06621418e+00+2.14164968e+00j,  2.01150264e+00-2.72537584e+00j,
        2.22558607e+00+3.36284398e+00j, -9.19252863e-01-2.23749419e+00j,
        5.56568110e+00+9.94362786e-01j, -1.68356097e+00+1.56228102e+00j,
        5.51737380e+00-3.33280579e+00j,  2.52060412e+00+5.23045788e+00j,
        1.46726570e+00-5.06510860e+00j,  1.03774684e+01+3.91519493e+00j,
       -1.95130129e+00-9.88498998e-02j,  1.66466009e+01-4.78394424e+00j,
        4.95418246e+00+1.17362072e+01j,  1.61626829e+01-1.92344183e+01j,
        5.63953757e+01+3.00181916e+01j,  2.66322165e+01-1.47066437e+02j,
       -9.24053907e+01+8.20008932e+00j, -7.75059057e+00-1.44535477e+01j,
       -1.98666908e+01+1.38163451e+01j, -1.59207381e+01-1.00458167e+01j,
       -4.04432967e+00+5.56477789e+00j, -1.62821544e+01-7.91194788e-01j,
       -2.73555087e+00-2.66630889e+00j, -1.04309328e+01+4.77332873e+00j,
       -7.24117540e+00-4.90981877e+00j, -4.05285195e+00+3.76437108e+00j,
       -1.03182682e+01-1.56253215e+00j, -2.27382909e+00-7.92269677e-01j,
       -8.66519550e+00+2.69476111e+00j, -5.20433145e+00-3.55051174e+00j,
       -4.36046241e+00+3.33953601e+00j, -8.63280870e+00-1.97293503e+00j,
       -2.22310000e+00+0.00000000e+00j, -8.63280870e+00+1.97293503e+00j,
       -4.36046241e+00-3.33953601e+00j, -5.20433145e+00+3.55051174e+00j,
       -8.66519550e+00-2.69476111e+00j, -2.27382909e+00+7.92269677e-01j,
       -1.03182682e+01+1.56253215e+00j, -4.05285195e+00-3.76437108e+00j,
       -7.24117540e+00+4.90981877e+00j, -1.04309328e+01-4.77332873e+00j,
       -2.73555087e+00+2.66630889e+00j, -1.62821544e+01+7.91194788e-01j,
       -4.04432967e+00-5.56477789e+00j, -1.59207381e+01+1.00458167e+01j,
       -1.98666908e+01-1.38163451e+01j, -7.75059057e+00+1.44535477e+01j,
       -9.24053907e+01-8.20008932e+00j,  2.66322165e+01+1.47066437e+02j,
        5.63953757e+01-3.00181916e+01j,  1.61626829e+01+1.92344183e+01j,
        4.95418246e+00-1.17362072e+01j,  1.66466009e+01+4.78394424e+00j,
       -1.95130129e+00+9.88498998e-02j,  1.03774684e+01-3.91519493e+00j,
        1.46726570e+00+5.06510860e+00j,  2.52060412e+00-5.23045788e+00j,
        5.51737380e+00+3.33280579e+00j, -1.68356097e+00-1.56228102e+00j,
        5.56568110e+00-9.94362786e-01j, -9.19252863e-01+2.23749419e+00j,
        2.22558607e+00-3.36284398e+00j,  2.01150264e+00+2.72537584e+00j,
       -1.06621418e+00-2.14164968e+00j,  3.54642675e+00+2.80627639e-01j,
       -1.65927115e+00+5.32758685e-01j,  2.08600784e+00-2.16004501e+00j,
        1.67170630e-01+1.95785767e+00j, -5.63039293e-01-2.26339262e+00j,
        2.07074628e+00+9.74881693e-01j, -1.78751446e+00-4.41961910e-01j,
        1.92658449e+00-1.18847762e+00j, -9.11588410e-01+1.31042352e+00j,
        1.15010577e-01-2.12163518e+00j,  8.92529377e-01+1.20698358e+00j,
       -1.50780600e+00-1.15015740e+00j,  1.55925108e+00-4.41476813e-01j,
       -1.47161352e+00+6.17750758e-01j,  5.96555297e-01-1.83439905e+00j,
       -6.51958602e-02+1.14354101e+00j, -1.19423094e+00-1.62517821e+00j,
        1.12778233e+00+3.06483635e-01j, -1.68374515e+00-2.24050718e-01j,
        8.16798142e-01-1.28954572e+00j, -8.49071354e-01+9.23802423e-01j,
       -5.46742118e-01-1.76166256e+00j,  4.99427484e-01+6.00646274e-01j,
       -1.64976971e+00-8.35693733e-01j,  9.23955452e-01-6.83587784e-01j,
       -1.35598806e+00+3.66734477e-01j, -1.20890125e-01-1.64557712e+00j,
       -9.54310062e-02+7.87580023e-01j, -1.31670689e+00-1.37370353e+00j,
        7.47058251e-01-1.72653471e-01j, -1.64268471e+00-2.20626785e-01j,
        2.85409999e-01-1.35570634e+00j, -6.97549398e-01+6.47336367e-01j,
       -8.98031992e-01-1.74406977e+00j,  2.76235638e-01+2.65146163e-01j,
       -1.65082051e+00-7.59540965e-01j,  5.14989321e-01-9.42756306e-01j,
       -1.27436658e+00+3.17816355e-01j, -3.65907590e-01-1.70900025e+00j,
       -1.85092650e-01+4.69247827e-01j, -1.38272886e+00-1.29269278e+00j,
        5.08676665e-01-5.23023178e-01j, -1.61212274e+00-2.47426805e-01j,
        9.15307938e-03-1.50448878e+00j, -6.83275720e-01+4.13903311e-01j,
       -1.06386336e+00-1.70577791e+00j,  1.93955454e-01-8.96694844e-02j,
       -1.68991730e+00-7.63713547e-01j,  2.67683496e-01-1.19289921e+00j,
       -1.23712427e+00+1.85507014e-01j, -6.28681050e-01-1.72528257e+00j,
       -8.76036952e-02+1.78151785e-01j, -1.58579304e+00-1.29675325e+00j,
        4.38404748e-01-7.49819722e-01j, -1.54809969e+00-2.90873201e-01j,
       -1.78743214e-01-1.75472272e+00j, -6.39013582e-01+2.69086067e-01j,
       -1.17993254e+00-1.77928776e+00j,  2.00060184e-01-4.45332527e-01j,
       -1.80884216e+00-7.72261631e-01j,  1.93455627e-01-1.45417630e+00j,
       -1.15227717e+00+4.97814925e-02j, -8.61845987e-01-1.97640023e+00j,
       -5.74214196e-02+1.23321692e-02j, -1.68226285e+00-1.39799601e+00j,
        3.46666515e-01-1.07019582e+00j, -1.54412463e+00-2.82737671e-01j,
       -3.04681666e-01-2.03260226e+00j, -5.11827934e-01+1.00286505e-01j,
       -1.42372964e+00-1.92468847e+00j,  3.68841194e-01-6.91384806e-01j,
       -1.87998223e+00-8.97068078e-01j,  1.25907553e-01-1.86914199e+00j,
       -1.14482476e+00+2.11128758e-02j, -9.35271762e-01-2.27167302e+00j,
        4.86799207e-02-3.26203595e-01j, -1.91846628e+00-1.49835776e+00j,
        4.59349733e-01-1.49110213e+00j, -1.65098202e+00-3.75639614e-01j,
       -4.11144006e-01-2.42726060e+00j, -4.25817703e-01-8.43387940e-02j,
       -1.68000963e+00-2.17331131e+00j,  4.72188634e-01-1.00940491e+00j,
       -1.97166109e+00-9.66881074e-01j,  6.11106432e-02-2.35338137e+00j,
       -1.00681640e+00-7.13925212e-02j, -1.26803285e+00-2.65633536e+00j,
        3.70979341e-01-5.57821043e-01j, -2.17524998e+00-1.69219521e+00j,
        5.99202329e-01-2.05505300e+00j, -1.65317068e+00-3.61273238e-01j,
       -5.73083071e-01-3.08799305e+00j, -1.28464273e-01-1.93330835e-01j,
       -2.04681749e+00-2.58154516e+00j,  8.89499761e-01-1.49634420e+00j,
       -2.21080000e+00-1.10190000e+00j,  1.89175606e-01-3.15062569e+00j,
       -8.49860860e-01-1.61507423e-01j, -1.54277529e+00-3.45505210e+00j,
        7.12219724e-01-9.79704041e-01j, -2.55981658e+00-2.04046494e+00j,
        8.45906089e-01-2.96153433e+00j, -1.76960220e+00-4.29375346e-01j,
       -7.58242795e-01-4.09176090e+00j,  2.25082520e-01-4.67061074e-01j,
       -2.52750985e+00-3.24387534e+00j,  1.31546188e+00-2.44134032e+00j,
       -2.60601968e+00-1.25455573e+00j,  1.52676290e-01-4.44343261e+00j,
       -5.85160488e-01-2.50539347e-01j, -2.16685484e+00-4.53746132e+00j,
        1.47974553e+00-1.74243220e+00j, -3.34315589e+00-2.48412528e+00j,
        1.34283253e+00-4.48983112e+00j, -1.80885493e+00-5.21090984e-01j,
       -1.25087520e+00-5.89678669e+00j,  1.06765079e+00-9.92731653e-01j,
       -3.67394482e+00-4.35090873e+00j,  2.30350022e+00-4.16320885e+00j,
       -3.30357928e+00-1.35174450e+00j,  2.73218807e-01-7.08234119e+00j,
        1.25099560e-01-4.88239891e-01j, -3.51146132e+00-6.90523767e+00j,
        3.12103213e+00-3.40630267e+00j, -4.89317296e+00-3.40163700e+00j,
        2.26489680e+00-8.24598640e+00j, -1.80556343e+00-4.30000899e-01j,
       -2.43810547e+00-1.03878676e+01j,  3.34136092e+00-2.30419347e+00j,
       -6.56548640e+00-7.24190530e+00j,  5.08334556e+00-9.17124859e+00j,
       -5.03929759e+00-1.78111885e+00j,  9.07522985e-02-1.56142864e+01j,
        2.55270763e+00-1.07881752e+00j, -8.39705099e+00-1.51153241e+01j,
        9.69809273e+00-1.02726789e+01j, -1.16615185e+01-7.04291201e+00j,
        6.74902084e+00-2.64939868e+01j, -1.20125274e+00-3.67185184e-01j,
       -1.12312653e+01-4.01964956e+01j,  2.37165300e+01-1.45873356e+01j,
       -4.24512573e+01-4.12694543e+01j,  6.61526789e+01-1.21334480e+02j,
       -3.18508678e+02-7.67448870e+01j,  6.30694874e+00+2.05878097e+02j,
       -2.85446185e+01+8.23079097e+00j,  2.81960122e+01+4.42758447e+01j,
       -2.43592829e+01+2.59542302e+01j,  1.41855087e+01+6.89294188e+00j,
       -6.55701211e+00+2.99846844e+01j, -3.14523221e+00-2.86933127e-01j,
        6.98497354e+00+2.05343130e+01j, -1.09080010e+01+6.74336599e+00j,
        8.52826682e+00+7.02966990e+00j, -7.17587986e+00+1.43906208e+01j,
        1.28174642e+00-2.17558717e-01j,  1.26155191e+00+1.43196310e+01j,
       -5.95754594e+00+1.66428465e+00j,  5.66477237e+00+7.47670447e+00j,
       -6.79881000e+00+7.68049366e+00j,  2.91310254e+00+8.99274030e-01j,
       -1.71688526e+00+1.07295069e+01j, -2.81565667e+00-1.20955925e-01j,
        3.31117389e+00+7.68660419e+00j, -5.75133993e+00+3.88995289e+00j,
        3.45908687e+00+2.17818975e+00j, -3.35457959e+00+7.88831793e+00j,
       -5.90648324e-01-5.68122783e-01j,  1.22554005e+00+7.47395531e+00j,
       -4.42681081e+00+1.48748786e+00j,  3.21673287e+00+3.44200216e+00j,
       -4.13602608e+00+5.41420201e+00j,  9.13293546e-01-1.06461654e-01j,
       -4.72579145e-01+6.79380572e+00j, -2.99785324e+00+1.05128032e-01j,
        2.44158600e+00+4.35998521e+00j, -4.29500338e+00+3.48545073e+00j,
        1.91206035e+00+6.63170248e-01j, -1.90327353e+00+5.90984008e+00j,
       -1.48132263e+00-5.67836936e-01j,  1.37575755e+00+5.00416055e+00j,
       -3.86523185e+00+1.74974394e+00j,  2.20971728e+00+1.67428472e+00j,
       -2.88101595e+00+4.75835821e+00j, -2.18103177e-01-5.79113378e-01j,
        1.97934888e-01+5.21989197e+00j, -3.17905518e+00+5.61387309e-01j,
        2.14250316e+00+2.69936502e+00j, -3.47766888e+00+3.51924824e+00j,
        7.64386930e-01-1.20717724e-01j, -9.38434863e-01+5.13498171e+00j,
       -2.31545893e+00-2.06649456e-01j,  1.65226600e+00+3.67658252e+00j,
       -3.66294520e+00+2.47589602e+00j,  1.54237055e+00+6.41241933e-01j,
       -1.94002203e+00+4.86621659e+00j, -1.25206751e+00-5.41723402e-01j,
        1.03011577e+00+4.44600184e+00j, -3.56940867e+00+1.45847279e+00j,
        2.02011198e+00+1.59281317e+00j, -2.86795982e+00+4.41337553e+00j,
       -2.56589774e-01-4.54357759e-01j,  2.39279019e-01+5.22248102e+00j,
       -3.20042591e+00+6.39491828e-01j,  2.19920603e+00+2.80840454e+00j,
       -3.55640413e+00+4.03809831e+00j,  7.52902960e-01-5.60339915e-02j,
       -6.57005861e-01+6.00635672e+00j, -2.85848950e+00+1.74292733e-01j,
        2.38009866e+00+4.40250032e+00j, -4.38903862e+00+4.01587044e+00j,
        1.97554791e+00+8.06605801e-01j, -1.67679332e+00+7.60978954e+00j,
       -2.30327105e+00-3.04246134e-02j,  2.96478277e+00+7.05799808e+00j,
       -5.85735822e+00+4.64637366e+00j,  4.01745426e+00+2.43348077e+00j,
       -3.49126610e+00+1.22162369e+01j, -2.06970867e+00-9.59591827e-02j,
        5.67850309e+00+1.61176004e+01j, -1.30017620e+01+9.62075975e+00j,
        1.63920150e+01+1.16122483e+01j, -2.15037892e+01+6.70899063e+01j])
N_2 = 2 ** fix(log2(N)).astype(int)
T_2 = N_2 / f_s
del_f_2 = 1 / T_2
N_freq_2 = N_2 / 2
t_2 = arange(0.0, T_2 + del_t_1, del_t_1)
frequency_2 = arange(0, f_fold, del_f_2)
len2, = t_2.shape
_g_uncoupled_2 = g - DC
N_2
np.int64(256)
# create the low pass filter, called Hanning
_u_Hann_2 = 0.5 * (1 - cos(2 * pi * t_2[:-1] / T_2))  #u_Hanning(t)
_DC_2 = mean(g[:len2 - 1])  #DC = mean value of input signal (V) (average of all the useful data)
_g_uncoupled_2 = g[:len2 - 1] - _DC_2  # uncoupled
g_Hann_2 = _g_uncoupled_2 * _u_Hann_2
figure()
plot(_u_Hann_2, 'r--')
plot(g_Hann_2, 'b-')
plot(g, 'c:')
# take the FFT of the filtered, shorter signal
G_Hann_2 = fft(g_Hann_2,N_2)  #G(omega) with Hanning window

Magnitude_Hann_2 = abs(G_Hann_2)*sqrt(8./3.)/(N_2/2)  #|F|*sqrt(8/3)/(N/2)
# Magnitude_Hann_2[0] = Magnitude_Hann_2[0]/2 + DC_2  #(also divide the first one by 2, and add back the DC value)

# len_loc, = Magnitude_Hann_2.shape
# A_2 = Magnitude_Hann_2[0:round(len_loc/2)]
# Freq_2 = frequency_2[0:round(len_loc/2)]
figure()
plot(frequency,Magnitude[:frequency.shape[0]],'b:x')
plot(frequency_2,Magnitude_Hann_2[:frequency_2.shape[0]], 'r-s')
xlabel('frequency, (Hz)')
ylabel('abs(F)')
title('FFT Frequency Spectrum')
legend(('Simple','Window + DC'))
# the frequency resolution is worse, but the result is better
del_f, del_f_2
  • 0: 0.3333333333333333
  • 1: 0.390625
N_3 = 2 ** ceil(log2(N)).astype(int)
T_3 = N_3 / f_s
del_f_3 = 1 / T_3
N_freq_3 = int(N_3 / 2)
t_3 = arange(0.0, T_3 + del_t_1, del_t_1)
frequency_3 = arange(0, f_fold, del_f_3)
len3, = t_3.shape
_g_uncoupled_2 = g - DC
_u_Hann_2 = 0.5 * (1 - cos(2 * pi * t_2[:-1] / T_2))
_DC_2 = mean(g[:int(len2 - 1)])
_g_uncoupled_2 = g[:int(len2 - 1)] - _DC_2
g_Hann_2_1 = _g_uncoupled_2 * _u_Hann_2
g_Hann_3 = zeros((N_3,))
g_Hann_3[:g_Hann_2_1.shape[0]] = g_Hann_2_1.copy()
figure()
plot(g_Hann_3, 'b-')
G_Hann_3 = fft(g_Hann_3, N_3)
Magnitude_Hann_3 = abs(G_Hann_3) * sqrt(8.0 / 3.0) / (N_2 / 2)
len_loc, = Magnitude_Hann_3.shape
A_3 = Magnitude_Hann_3[0:int(len_loc / 2)]
Freq_3 = frequency_3[0:int(len_loc / 2)]
N_3
np.int64(512)
figure()
plot(frequency,Magnitude[:frequency.shape[0]],'b:x')
plot(frequency_2,Magnitude_Hann_2[:frequency_2.shape[0]], 'g--o')
xlabel('frequency, (Hz)')
plot(frequency_3,Magnitude_Hann_3[:frequency_3.shape[0]], 'r-s')
xlabel('frequency, (Hz)')
ylabel('abs(F)')
title('FFT Frequency Spectrum')
legend(('Simple','256', 'Window + DC'))
f = frequency_2
a = Magnitude_Hann_2[:f.shape[0]]
plot(f,a)
a1,f1 = a.max(),f[a.argmax()]
print (a1,f1)
1.7914015486916908 15.625
b = a.copy()
b[:a.argmax()+10] = 0 # remove the first peak
a2,f2 = b.max(),f[b.argmax()]
print( a2,f2)
0.7161739235195177 46.875
t_1 = arange(0.0, T + del_t_1, del_t_1)
_g1 = DC + a1 * sin(2 * pi * f1 * t_1) + a2 * sin(2 * pi * f2 * t_1)
plot(t_1, g, 'b--', t_1, _g1, 'r-')