2013-06-07 3 views
1

J'essaie de lisser et interpoler certaines données périodiques en python en utilisant scipy.fftp. J'ai réussi à prendre le fft des données, enlever les fréquences d'ordre supérieur au-dessus de wn (en faisant myfft [wn: -wn] = 0) et ensuite reconstruire une version "lissée" des données avec ifft (myfft). Le tableau créé par le ifft a le même nombre de points que les données d'origine. Comment puis-je utiliser ce fft pour créer un tableau avec plus de points.Obtenir la sortie ifft à une résolution différente

x = [i*2*np.pi/360 for i in range(0,360,30)] 
data = np.sin(x) 
#get fft 
myfft = fftp.fft(data) 
#kill feqs above wn 
myfft[wn:-wn] = 0 
#make new series 
newdata = fftp.ifft(myfft) 

J'ai aussi été capable de recréer manuellement la série à la même résolution que démontré ici Recreating time series data using FFT results without using ifft

mais quand j'ai essayé upping la résolution du tableau x valeurs qu'il ne m'a pas donné la bonne réponse soit.

Merci à l'avance

Niall

Répondre

3

Qu'est-ce np.fft.fft rendement a la composante continue à la position 0, suivie par toutes les fréquences positives, alors la fréquence de Nyquist (uniquement si le nombre d'éléments est même), les fréquences négatives dans l'ordre inverse. Donc, pour ajouter plus de résolution, vous pouvez ajouter des zéros sur les deux côtés de la fréquence de Nyquist:

import numpy as np 
import matplotlib.pyplot as plt 

y = np.sin(np.linspace(0, 2*np.pi, 32, endpoint=False)) 

f = np.fft.fft(y) 
n = len(f) 
f_ = np.concatenate((f[0:(n+1)//2], 
        np.zeros(n//2), 
        [] if n%2 != 0 else f[(n+1)//2:(n+3)//2], 
        np.zeros(n//2), 
        f[(n+3)//2:])) 
y_ = np.fft.ifft(f_) 
plt.plot(y, 'ro') 
plt.plot(y_, 'bo') 
plt.show() 

enter image description here

+0

Merci pour la réponse Jaime, Le seul problème est que change l'amplitude, que je voudrais préserver. Est-ce aussi simple que, vous avez doublé la longueur de la fft de sorte que l'amplitude est réduite de moitié? – nrob

+1

Salut Jamie. Pour l'enregistrement (comme vous le savez probablement) pour obtenir l'amplitude correcte, vous avez juste besoin de trier la normalisation. Le ifft se normalise par la longueur du fft, que nous avons artificiellement long. Donc, pour corriger l'amplitude, vous devez multiplier par len (f _)/len (f) – nrob

Questions connexes