genlik

2014-12-17 8 views
9

Benim Python programlama problemi şudur FFT belirsizlik hesaplayın:genlik

ben ölçüm sonuçlarının bir dizi oluşturmak istiyorum. Her bir sonuç, ortalama değerin ölçüm sonucunun kendisi olduğu ve standart sapmanın belirsizlik olduğu normal dağılım olarak tanımlanabilir.

Sözde kod olabilir:

x1 = N(result1, unc1) 
x2 = N(result2, unc2) 
... 

x = array(x1, x2, ..., xN) 

ben x FFT hesaplamak istiyorum daha:

f = numpy.fft.fft(x) 

İstediğim x içerdiği ölçümlerin belirsizliği yoluyla yayılır olmasıdır FFT hesaplaması, böylece f, bu gibi belirsizlikleri ile birlikte bir genlik dizisi dizisidir:

Bunu yapmam için bana bir yol önerebilir misin?

+2

Ben size size verilen verilerle istediğini elde edebilirsiniz emin değilim. Elbette araçların bir FFT'sini yapabilirsin, ama sapmaların bir FFT'si bana mantıklı gelmiyor. Ve verileri mantıklı hale getirmek için nasıl dönüştürdüğünüzden emin değilim. –

+0

Eğer 'x' değerleriniz korelasyonlu değilse, fft'in daha yüksek frekans bölümlerinin belirsizliği anlamsız olacaktır (sonsuz belirsizlik). Aslında, değerler ve belirsizliklerin x'de ne olduğuna bağlı olarak, fft’in belirsizliği anlamsız olabilir. Fft, bitişik değerler arasındaki farklılıklara bağlıdır. Şu anda zayıflıklarınızı temsil etme şekliniz, her bir değer, bitişik değerden tamamen bağımsızdır. Ne yapmak istediğin için analitik bir çözüm olduğunu düşünmüyorum. Önyükleyebilirsin, ama sonuç çok fazla anlam ifade edeceğinden emin değilim. –

cevap

11

dizi x arasında ayrık Fourier hesaplanan her bir Fourier katsayısının x elemanlarının doğrusal bir kombinasyonudur; I

X_k = sum_(n=0)^(n=N-1) [ x_n * exp(-i*2*pi*k*n/N) ] 

olarak yazacaksýn wikipedia page on the discrete Fourier transform, ile X_k formülü (bkz Yani, X Ayrık Fourier x dönüşümü içindir.) X_n normal ortalama mu_n ve varyans sigma_n birlikte verildiyse ** 2, sonra cebir biraz X_k varyans toplamı X_n diğer bir deyişle

Var(X_k) = sum_(n=0)^(n=N-1) sigma_n**2 

arasında varyans olduğunu göstermektedir, varyans da her Fouri için aynıdır er katsayısı; , x'daki ölçümlerin varyanslarının toplamıdır. unc(z)z standart sapması olduğu için gösterim, kullanma

unc(X_0) = unc(X_1) = ... = unc(X_(N-1)) = sqrt(unc(x1)**2 + unc(x2)**2 + ...) 

( büyüklük dağılımı X_k ait Rice distribution olduğunu unutmayın.) Burada

gösteren bir senaryo bu sonuç. Bu örnekte, x değerlerinin standart sapması doğrusal olarak 0,01 ila 0,5 arasında artar.

import numpy as np 
from numpy.fft import fft 
import matplotlib.pyplot as plt 


np.random.seed(12345) 

n = 16 
# Create 'x', the vector of measured values. 
t = np.linspace(0, 1, n) 
x = 0.25*t - 0.2*t**2 + 1.25*np.cos(3*np.pi*t) + 0.8*np.cos(7*np.pi*t) 
x[:n//3] += 3.0 
x[::4] -= 0.25 
x[::3] += 0.2 

# Compute the Fourier transform of x. 
f = fft(x) 

num_samples = 5000000 

# Suppose the std. dev. of the 'x' measurements increases linearly 
# from 0.01 to 0.5: 
sigma = np.linspace(0.01, 0.5, n) 

# Generate 'num_samples' arrays of the form 'x + noise', where the standard 
# deviation of the noise for each coefficient in 'x' is given by 'sigma'. 
xn = x + sigma*np.random.randn(num_samples, n) 

fn = fft(xn, axis=-1) 

print "Sum of input variances: %8.5f" % (sigma**2).sum() 
print 
print "Variances of Fourier coefficients:" 
np.set_printoptions(precision=5) 
print fn.var(axis=0) 

# Plot the Fourier coefficient of the first 800 arrays. 
num_plot = min(num_samples, 800) 
fnf = fn[:num_plot].ravel() 
clr = "#4080FF" 
plt.plot(fnf.real, fnf.imag, 'o', color=clr, mec=clr, ms=1, alpha=0.3) 
plt.plot(f.real, f.imag, 'kD', ms=4) 
plt.grid(True) 
plt.axis('equal') 
plt.title("Fourier Coefficients") 
plt.xlabel("$\Re(X_k)$") 
plt.ylabel("$\Im(X_k)$") 
plt.show() 

baskılı çıkış beklendiği gibi, Fourier katsayısının örnek varyans ölçümü varyansları toplamı olarak Tüm (yaklaşık olarak) aynı olan

Sum of input variances: 1.40322 

Variances of Fourier coefficients: 
[ 1.40357 1.40288 1.40331 1.40206 1.40231 1.40302 1.40282 1.40358 
    1.40376 1.40358 1.40282 1.40302 1.40231 1.40206 1.40331 1.40288] 

olup.

Komut dosyası tarafından oluşturulan çizim. Siyah elmaslar, tek bir x vektörünün Fourier katsayılarıdır.Mavi noktalar, x + noise'un 800 gerçekleştirmesi olan Fourier katsayılarıdır. 'un, her Fourier katsayısının etrafındaki nokta bulutlarının yaklaşık simetrik ve hepsi aynı "boyut" olduğunu görebilirsiniz (tabii ki gerçek katsayılar için, bu arsa içinde gerçek eksen üzerinde yatay çizgiler olarak görünen hariç).

Plot of Fourier coefficients

+0

Şey, sezgim orada tamamen yanlıştı. Bu, beni düşünmeden konuşmamı öğretecek! Mükemmel cevap! –