簡體   English   中英

如何分析波形文件的頻率

[英]How to analyse frequency of wave file

如何以簡單的方式分析波形文件的頻率? 沒有額外的模塊。

“分析”是什么意思? 它可能意味着許多不同的東西,但我所知道的最簡單的方法之一是使用卷積 ,你可以輕松地實現離散函數 (你將在數組中有點或嘗試離散步驟):

離散卷積方程

這可以通過以下方式輕松完成:

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,......並獲得最佳結果)。

您也可以谷歌determine wave frequency或稍微研究傅立葉變換 (它是許多信號處理算法的基礎)。

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

我會研究傅立葉分析。 傅里葉變換將您的輸入從時域轉換為頻域。 讓我解釋一下:

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

另一方面,對數據進行傅里葉變換,然后將數據表示為頻率的函數。 您仍然會有一個長度為44,100個元素的向量,但每個元素將代表幅度 - 您在每個頻率上采樣了多少“信號”! 換句話說,在整個采樣周期內,信號包含的每個給定頻率的信號總數為IN TOTAL。

您應該研究離散傅立葉分析和快速傅里葉變換(FFT)的實現。

這個問題更多地涉及FFT分析: Scipy / Numpy FFT頻率分析

編輯:

我在網上無恥地竊取了一些圖片:

FFT公式:

在此輸入圖像描述

時間與頻率域:

在此輸入圖像描述

如果您的波形文件只包含一個音符,則只需檢測波形的周期性即可獲得基頻(而不是諧波)。 通過尋找0交叉來做到這一點。

如果您不想實現整個FFT算法並且不需要任何其他模塊,那么我會推薦Goertzel算法 ,該算法實際上是針對特定頻率的傅立葉變換,並為您提供樣本的頻率功率:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM