2012-11-14 63 views

回答

5

這是什麼意思「分析」?這可能意味着很多不同的東西,但是我知道最簡單的方法一個大約是使用convolution,你可以很容易地實現對discrete functions(你必須在數組中的點或是試圖分立步驟):

Equation of discrete convolution

這可以很容易地做到:

for i in main_array: 
    from = i - len(convolution_kernel)/2 
    // Todo: check boundaries 
    result[i] = 0 

    for j in convolution_kernel: 
     result[i] += convolution_kernel[j] * main_array(from+j) 

或者你可以使用循環卷積(想法來自eryksuns評論拍攝):

result = [sum(f[m]*g[n-m] for m in xrange(len(f))) for n in xrange(len(g))] 

這將使您能夠測試某個信號是否出現在另一個信號中(並且您將嘗試頻率10,20,50,...並獲得最佳結果)。

你也可以google determine wave frequency或研究Fourier transformation有點(這是很多信號處理算法的基礎)。

+1

或者你可以做一個循環卷積,假定零填充,如DFT的作用:'結果=Σ(F [M] * G [(納米)%LEN(克)]爲米xrange(len(f)))for n in xrange(len(g))]''。 – eryksun

+0

微小更新:由於Python包裝負指數,模操作是多餘的。你可以使用'g [n-m]'。 – eryksun

1

免責聲明:信號處理是不是我的專業,這個答案可能有點粗糙和簡陋;隨時糾正/我:)

我會去了解一下傅立葉分析。 A Fourier transformation將您的輸入從時域轉換到頻域。讓我來解釋一下,多一點:

抽樣時的聲音,例如,你確定你的採樣頻率和您的位深度。我相信CD的採樣率爲44.1 kHz,分辨率爲16位。樣品。這意味着音樂每秒採樣44,100次並轉換爲16位值。音樂被表示爲長度爲44,100的矢量(或數組)。它是時間的函數,因此這是時間域。

在另一方面,進行數據的傅里葉變換,你就會有表現爲頻率的函數,而不是數據。你仍然會有一個向量44,100個元素長,但每個元素將代表幅度 - 你在每個頻率上採樣了多少「信號」!換句話說,您的信號在整個採樣週期內包含的每個給定頻率有多少信號。

你應該看看離散傅立葉分析和快速傅立葉變換(FFT)的實現。

這個問題倒是FFT分析多一點: Scipy/Numpy FFT Frequency Analysis

編輯:

我無恥地偷走一些圖形在線:

FFT計算公式:

enter image description here

時間與頻率範圍:

enter image description here

1

如果你的波形文件只包含一個音符,你可以簡單地通過檢測波的週期性得到的基頻(而不是諧波)。通過查找0交叉口來做到這一點。

1

如果您不希望實現整體FFT算法,不希望任何額外的模塊,那麼我會的電子書籍,其Goertzel Algorithm是有效的傅里葉變換爲特定的工頻突變,讓您在該頻率的電​​源樣品:

define goertzel(sample, target_frequency, sample_rate): 
    s_prev = 0 
    s_prev2 = 0 
    normalized_frequency = target_frequency/sample_rate 
    coeff = 2 * cos(2 * PI * normalized_frequency) 
    for element in sample: 
     s = element + coeff * s_prev - s_prev2 
     s_prev2 = s_prev 
     s_prev = s 
    end 
    power = s_prev2 * s_prev2 + s_prev * s_prev - coeff * s_prev * s_prev2 
    return power