2015-06-19 56 views
4

在Python中處理fft時,我遇到了函數歸一化和計算係數平方和的問題。scipy和Parseval身份的傅立葉變換

我的代碼如下:

import pandas as pd 
import numpy as np 
import scipy.fftpack 

# sample points 
N = 1024 

# sample spacing 
T = 1.0/512.0 

# example function 
x = np.linspace(0.0, N*T, N) 
y = 1.5 * np.sin(5*2*np.pi*x) + 3 * np.sin(6*2*np.pi*x) 

df = pd.DataFrame({'X': x, 'Y': y}) 

sumy = sum(abs(df['Y'])**2) 

df['FFT (Y)'] = scipy.fftpack.fft(df['Y'])/(N/2) 
df['FFT (freq)'] = scipy.fftpack.fftfreq(N, T) 

sumffty = sum(abs(df['FFT (Y)'])**2) 

print sumy, sumffty 

根據帕斯瓦爾的身份,總和應該是平等的;然而,它們的因數是256(總和是較小的一個)。我錯過了什麼?

回答

5

Parseval定理說明兩個域(空間/時間和頻率)的總功率是相等的。其對DFT的聲明是this。注意,儘管1/N在右邊,這不是的意思是的功率,但是的總功率爲。 1/N的原因是DFT的規範化慣例。

在Python說,這意味着,對於一個時間/空間信號sig,帕斯瓦爾等價可以表述爲:

np.sum(np.abs(sig)**2) == np.sum(np.abs(np.fft.fft(sig))**2)/sig.size

下面是一個完整的例子,從一些玩具例(一和二二維陣列填充1個1)。請注意,我使用了numpy.ndarray的.size屬性,它返回數組中元素的總數。希望這可以幫助!

import numpy as np 

# 1-d, 4 elements: 
ones_1d = np.array([1.,1.,1.,1.]) 
ones_1d_f = np.fft.fft(ones_1d) 

# compute total power in space and frequency domains: 
space_power_1d = np.sum(np.abs(ones_1d)**2) 
freq_power_1d = np.sum(np.abs(ones_1d_f)**2)/ones_1d.size 
print 'space_power_1d = %f'%space_power_1d 
print 'freq_power_1d = %f'%freq_power_1d 

對不起,我無法直接使用您的示例 - 我不是熊貓的用戶,無法完全理解它。

+0

你是對的,當我使用numpy.fft實現時,返回的和是相等的,但scipy.fft實現返回另一個答案。我怎樣才能讓scipy實現給我'正確'的答案? –