2012-12-23 6 views
11

में पार्सल का प्रमेय मैं पाइथन की एफएफटी कार्यक्षमता पर कुछ पकड़ पाने की कोशिश कर रहा हूं, और मैंने जो अजीब चीज़ों पर ठोकर खाई है, वह यह है कि Parseval's theorem लागू नहीं होता है, क्योंकि यह लगभग 50 का अंतर देता है अब, जबकि यह होना चाहिए 0.पाइथन

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() 

मैं बहुत यकीन है कि यह एक सामान्य कारक है, लेकिन मैं यह पता लगाने के लिए, सभी जानकारी प्राप्त कर सकते हैं मैं के रूप में सक्षम होने के लिए नहीं लग रहे इस समारोह के बारे में scipy.fftpack.rfft documentation

उत्तर

15

आपका सामान्यीकरण कारक निरंतर सिग्नल के निरंतर सिग्नल के फूरियर ट्रांसफॉर्म के लिए पारसीवल प्रमेय को लागू करने की कोशिश करने से आ रहा है। the wikipedia article on the Discrete Fourier transform के साइड पैनल पर फूरियर ट्रांसफॉर्म, फूरियर श्रृंखला, असतत फूरियर ट्रांसफॉर्म और Dirac combs के साथ नमूनाकरण के संबंध में कुछ चर्चा है।

एक लम्बी कहानी कम करने के लिए, Parseval's theorem, when applied to DFTs, एकीकरण की आवश्यकता नहीं है, लेकिन योग: एक 2*pi आप dt और df अपने summations द्वारा multipliying से बना रहे हैं।

यह भी ध्यान दें कि, क्योंकि आप scipy.fftpack.rfft का उपयोग कर रहे हैं, जो आप प्राप्त कर रहे हैं वह ठीक से आपके डेटा का डीएफटी नहीं है, बल्कि इसका सकारात्मक आधा है, क्योंकि ऋणात्मक इसके लिए सममित होगा। इसलिए जब आप डीसी टर्म में केवल आधा डेटा जोड़ रहे हैं, साथ ही 0 डीसी शब्द में 2 गुम है 4*pi जो @unutbu मिला है।

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 

scipy.fftpack.fft या numpy.fft.fft का उपयोग करते हुए दूसरा योग इस तरह के एक अजीब फार्म पर ले जाने की जरूरत नहीं है:

किसी भी मामले में, अगर datay अपने अनुक्रम रखती है, आप इस प्रकार Parseval प्रमेय सत्यापित कर सकते हैं

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

सुधार के लिए धन्यवाद! – unutbu

+0

ध्यान दें: भाग में यह सामान्य मुद्दे का एक पहलू है कि फ़्लोटिंग-पॉइंट नंबर वास्तविक संख्याओं के समान नहीं हैं। – Marcin

+0

@ मार्सिन यप ने चेक में '==' को '''' में बदल दिया ... – Jaime