2017-02-28 146 views
2

假設你有以下系列值:如何根據功率譜密度確定我的數據是否爲1/f噪聲?

import numpy as np 
data1=np.array([1, 0.28571429, 0.20408163, 0.16326531, 0.14285714, 
     0.10204082, 0.08163265, 0.06122449, 0.04081633, 0.02040816]) 

現在你想使用numpy.fft繪製的data1Spectral Density

ps1 = np.abs(np.fft.fft(data1))**2 
time_step = 1/30 
freqs1 = np.fft.fftfreq(data1.size, time_step) 
idx1 = np.argsort(freqs1) 
fig,ax=plt.subplots() 
ax.plot(freqs1[idx1], ps1[idx1],color='red',label='data1') 
plt.grid(True, which="both") 
ax.set_yscale('log') 
ax.set_xscale('log') 
plt.xlabel("Frequency") 
plt.ylabel("Power") 
plt.xlim(0,15) 

enter image description here

我的問題:如果情節代表我的系列信號,我該如何從功率譜密度確定,如果這是1/f(或任何其他)噪音

+2

你怎麼知道數據中有噪聲?相反,你怎麼知道數據中除了噪聲之外還有其他的東西?重要的是,你對噪聲的定義是什麼? – kazemakase

+0

我不知道噪音是否存在。我想弄明白。這可能是一系列「1/f」噪音或其他問題。我怎麼弄出來的? – FaCoffee

+0

問題是,你不能。除非你知道你在數據中尋找什麼。如果你有一個無噪聲的信號版本,你可以比較光譜,而在無無版本中沒有的東西顯然是噪聲。如果你不知道你在找什麼,你就無法知道什麼是噪音,什麼不是。考慮一下:(a)你想記錄語音。附近瀑布的聲音是噪音。 (b)你想記錄瀑布。 oaf在附近說話的聲音是短暫的。看看我在瞄準哪裏? – kazemakase

回答

2

如果我看一下圖像,我很想總結這個系列有類似冪律行爲的東西,但要說這個,你需要證明它有1/f噪聲。

讓我們看看,如果我們可以驗證這一假設:

  1. 建立1/f噪聲的噪聲模型:scale/(1 + f ** alpha)。這與參數scale(振幅)和alpha的1/f niose的數學模型(描述了高到低頻率的比值)

  2. 適合與噪聲模型的數據(在這種情況下,它裝配到功率譜密度)

  3. 檢查結果。它看起來像模型很好地描述了數據嗎?如果沒有 - 試着找到一個不同的模型。但要當心overfitting

剪斷:

from scipy.optimize import curve_fit 
import numpy as np 
import matplotlib.pyplot as plt 


data1 = np.array([1, 0.28571429, 0.20408163, 0.16326531, 0.14285714, 
        0.10204082, 0.08163265, 0.06122449, 0.04081633, 0.02040816]) 


def one_over_f(f, alpha, scale): 
    return scale/f ** alpha  


time_step = 1/30 
ps1 = np.abs(np.fft.fft(data1)) ** 2 
freqs1 = np.fft.fftfreq(data1.size, time_step) 

# remove the DC bin because 1/f cannot fit at 0 Hz 
ps1 = ps1[freqs1 != 0] 
freqs1 = freqs1[freqs1 != 0] 

params, _ = curve_fit(one_over_f, np.abs(freqs1), ps1) 
ps2 = one_over_f(freqs1, *params) 

idx1 = np.argsort(freqs1) 

fig, ax = plt.subplots() 
ax.plot(freqs1[idx1], ps1[idx1], color='red', label='data1') 
ax.plot(freqs1[idx1], ps2[idx1], color='blue', label='fit') 
plt.grid(True, which="both") 
ax.set_yscale('log') 
ax.set_xscale('log') 
plt.xlabel("Frequency") 
plt.ylabel("Power") 
plt.xlim(0,15) 
plt.legend() 

print('Alpha:', params[0], '\nScale:', params[1]) 

​​

在視覺上,該模型顯示,以適應1/f那樣的頻譜非常好。這不是一個證明。真的很難證明數據有一定的分佈。但是,您可以自己判斷一個選定的噪音模型是否可以滿足您的需求。

相關問題