簡體   English   中英

Matlab-更好地理解FFT並找到音高

[英]Matlab - better understanding the FFT and finding Pitch

我知道有很多關於從FFT查找音調的主題,並且通過從時域->頻域轉換數據樣本,我對整個過程有了不錯的了解,但是仍然有一些領域(可能更高級) )我有點堅持。

我將逐步介紹當前的流程,因此希望有人可以幫助我了解我要去的地方!

在開始之前,我在這里使用的示例是我在Logic中創建的Wav文件,該文件只是A音階中的Piano預設,從Key A4開始,它只是向上縮放(A4,B4,C# 5,D5 ...)每半個小節,以120 bpm的 速度持續4秒鍾 如果有幫助,以下是wav的鏈接:[a https://www.dropbox.com/s/zq1u9aylh5cwlmm/PianoA4_120.wav?dl=0]

步驟1:我解析出元數據和實際的樣本數據。 元數據: channels => 2, sample_rate => 44100, byte_rate => 176400, bits_per_sample => 16, data_chunk_size => 705600, data => ...

步驟2:由於有2個通道,所以我有一個左右數組,其中充滿了相應的樣本數據,然后將它們各自通過FFT。 每個FFT的結果給出了給定頻率下的幅度和相位

步驟3:現在,我需要找到每個FFT的最大幅度。 我通過找到真實/復雜結果的所有幅度,然后找到最大值來做到這一點。 我正在使用Matlab來幫助我,所以我運行max(abs(fft(data))) 我從找到每個FFT的最大值中得到的值為1275.61084.0

步驟4:從各自的FFT中找到這些最大值的索引,然后在映射的頻域值的該索引處找到頻率。 這給了我1177.0 Hz1177.5 Hz

這就是我感到困惑的地方! 我繪制的時域圖和看到的間距是如何發現A4單單看的時期,並知道什么A4的周期,但我想明白,我怎么可以通過得出了同樣的結論FFT。 任何幫助/指向我的地方將不勝感激!

A4通常為440Hz。 我的猜測是,您已經檢測到440Hz的三次諧波,並且存在一個錯誤的錯誤。

以下是有關您使用的步驟的一些觀察結果:

第2步:

對兩個渠道進行分析都可能不會獲得任何收益。 通過將兩者加在一起轉換為單聲道信號

第三步:

對於可靠的復音信號(或就此而言,現實世界中的單音樂器信號)而言,這是行不通的,此外,對於單音信號,在某些情況下,來自兩個相鄰倉的功率具有相同的值-這是因為每個倉是一個帶通濾波器,其頻率響應具有指數尾部。 恰好位於兩個頻帶中間的信號對這兩個信號均起同樣的作用,在真實信號的情況下,盡管這兩個頻帶都是主要頻率,但兩個頻帶在頻譜中的能量可能都最高:請記住,諧波會存在並且可能很大。 還應注意,在某些實際樂器聲音中,從根本上講,甚至可能沒有最大的部分聲音。

FFT的相位分量為跨頻帶信號提供了大量線索。

第四步:

您正在找到具有最高能量的FFT倉的中心頻率。 由於音階是對數以2為底的,因此對於較高的頻率,這是合理的近似值,但是在較低的頻率下,即使使用較大的FFT,也無法完成工作(在這種情況下,您會消耗大量CPU周期並損失很多時間分辨率)。

為了做得更好,您可以使用短時傅立葉變換並利用:i)FFT數據連續窗口的相位(Phi)ii)和F = dPhi / dt

從中您可以得到非常准確的結果。

暫無
暫無

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

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