[英]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.