2012-12-23 16 views
11

Python'un fft işlevselliği konusunda biraz tutuş alıyorum ve tökezlediğim garip şeylerden biri, Parseval's theorem'un, 50 Şimdi, ben bir normalleştirme faktörü olduğunu eminim, ama bu fonksiyon ile ilgili ben bulabilirsiniz tüm bilgileri gibi, bunu bulmak mümkün görünmüyor 0.Python'da Parseval teoremi

import numpy as np 
import matplotlib.pyplot as plt 
import scipy.fftpack as fftpack 

pi = np.pi 

tdata = np.arange(5999.)/300 
dt = tdata[1]-tdata[0] 

datay = np.sin(pi*tdata)+2*np.sin(pi*2*tdata) 
N = len(datay) 

fouriery = abs(fftpack.rfft(datay))/N 

freqs = fftpack.rfftfreq(len(datay), d=(tdata[1]-tdata[0])) 

df = freqs[1] - freqs[0] 

parceval = sum(datay**2)*dt - sum(fouriery**2)*df 
print parceval 

plt.plot(freqs, fouriery, 'b-') 
plt.xlim(0,3) 
plt.show() 

olması gerekirken scipy.fftpack.rfft documentation.

cevap

15

normalizasyon faktörünüz, Parseval'in sürekli sinyalinin Fourier dönüşümü için ayrı bir diziye uygulanmasını denemekten geliyor. the wikipedia article on the Discrete Fourier transform'un yan panelinde Fourier dönüşümü, Fourier serileri, Ayrık Fourier Dönüşümü ve Dirac combs ile örnekleme arasındaki ilişki hakkında bazı tartışmalar vardır.

, Parseval's theorem, when applied to DFTs, uzun lafın kısası entegrasyon gerektirmez, ancak toplamı: Bir 2*pi Eğer dt ve df senin toplanmaları çarpıldı yaratıyor.

Ayrıca, scipy.fftpack.rfft kullandığınız için, aldığınız şey, verilerinizin DFT'sini doğru olarak değil, ancak bunun yalnızca pozitif yarısıdır, çünkü negatif bunun için simetrik olur. Bu nedenle, yalnızca verilerin yarısını eklediğinizden ve DC terimindeki 0'dan beri, 2'un @unutbu'nun bulduğu 4*pi'a ulaşması için eksik var.

fouriery = fftpack.rfft(datay) 
N = len(datay) 
parseval_1 = np.sum(datay**2) 
parseval_2 = (fouriery[0]**2 + 2 * np.sum(fouriery[1:]**2))/N 
print parseval_1 - parseval_2 

ikinci toplamıdır Böyle garip hal almasına gerek yoktur scipy.fftpack.fft veya numpy.fft.fft Kullanılması:

datay sizin diziyi tutarsa ​​şöyle Her durumda

, sen Parseval'ın teoremini doğrulayabilir
fouriery_1 = fftpack.fft(datay) 
fouriery_2 = np.fft.fft(datay) 
N = len(datay) 
parseval_1 = np.sum(datay**2) 
parseval_2_1 = np.sum(np.abs(fouriery_1)**2)/N 
parseval_2_2 = np.sum(np.abs(fouriery_2)**2)/N 
print parseval_1 - parseval_2_1 
print parseval_1 - parseval_2_2 
+0

Düzeltme için teşekkürler! – unutbu

+0

Dikkat Edilmesi Gerekenler: Kısmen bu, genel sayının, kayan nokta sayılarının gerçek sayılar ile aynı şey olmadığı bir yönüdür. – Marcin

+0

@Marcin Yep, kontrolde '==' 'a '-' olarak değiştirdi ... – Jaime