13

我工作的一個軟件,其需要實現的一組數據的wiggliness。這裏的輸入我會收到的樣本,合併每個垂直像素帶的亮度情節: alt text確定數據集的「wiggliness」 - Python的

不難看出,左邊距爲真的波浪(即有一噸最小值/最大值),我想生成一組圖像的關鍵點。我已經對數據應用了一個高斯平滑函數〜10次,但是它似乎開始時相當虛弱。

任何想法?

這裏是我的原代碼,但它不會產生(用於wiggliness)很不錯的結果:

def local_maximum(list, center, delta): 
    maximum = [0, 0] 

    for i in range(delta): 
    if list[center + i] > maximum[1]: maximum = [center + i, list[center + i]] 
    if list[center - i] > maximum[1]: maximum = [center - i, list[center - i]] 

    return maximum 

def count_maxima(list, start, end, delta, threshold = 10): 
     count = 0 

    for i in range(start + delta, end - delta): 
    if abs(list[i] - local_maximum(list, i, delta)[1]) < threshold: count += 1 

    return count 

def wiggliness(list, start, end, delta, threshold = 10): 
    return float(abs(start - end) * delta)/float(count_maxima(list, start, end, delta, threshold)) 
+10

你可以發佈一個鏈接到一個準確定義的wiggliness? – 2010-11-16 06:29:48

+0

您正在尋找描繪頻率特徵或振幅特徵的統計數據嗎? – SingleNegationElimination 2010-11-16 07:14:45

+1

如果你問的方式來描述,而不是一種方式wiggliness以編程方式實現該特性,您可能對http://stats.stackexchange.com/更多的運氣。 – katrielalex 2010-11-16 07:38:32

回答

5

看一看低通/高通/陷波/帶通濾波器,傅立葉變換,或小波。基本思想是有很多不同的方法來計算在不同時間段量化的信號的頻率內容。

如果我們能找出wiggliness是,這將有助於。我會說最左邊的邊緣是扭曲的B/C它有更多的高頻內容,您可以通過使用傅里葉變換來形象化。

如果你把紅色信號的高通濾波器,你會得到公正的高頻內容,然後可以測量振幅和做閾值來確定wiggliness。但是我認爲,莽撞只是需要更多的形式主義。

+0

謝謝!我會看看他們。我仍在試着弄清楚所有這些術語是什麼意思;) – Blender 2010-11-17 15:05:28

1

對於這樣的事情,numpy的使事情更加容易,因爲它用於操縱矢量數據,例如提供有用的功能例如,你可以試着用原始數據wiggliness1或第一個差異wiggliness2的過零率(取決於應該是什麼樣的wiggliness,確切地說,如果全球趨勢被忽略,你應該使用差異數據)。對於x,您可以從原始數據中獲取感興趣的切片或窗口,從而獲得某種本地wiggliness的度量。 如果您使用原始數據,在刪除偏差後,您可能還想將小於某個閾值的所有值設置爲0,以忽略低幅擺動。

import numpy as np 

def wiggliness1(x): 
    #remove bias: 
    x=x-np.average(x) 
    #calculate zero crossing rate: 
    np.sum(np.abs(np.sign(np.diff(x)))) 


def wiggliness(x): 
    #calculate zero crossing rate of the first difference: 
    return np.sum(np.abs(np.sign(np.diff(np.sign(np.diff(x)))))) 
+0

謝謝,我從來沒有想到這一點。我想我會使用它,因爲我的平滑算法消除了一些關鍵點... – Blender 2010-11-17 18:54:22