如果我已使用適當的採樣方法(奈奎斯特,濾波等)對信號進行採樣,該如何將FFT的長度與可獲得的頻率分辨率相關聯?
如果我有一個在2,000 Hz和1,999 Hz正弦波的情況下,如何確定準確區分這兩個波之間的差異所需的FFT長度?
如果我已使用適當的採樣方法(奈奎斯特,濾波等)對信號進行採樣,該如何將FFT的長度與可獲得的頻率分辨率相關聯?
如果我有一個在2,000 Hz和1,999 Hz正弦波的情況下,如何確定準確區分這兩個波之間的差異所需的FFT長度?
頻率分辨率取決於FFT長度與輸入信號採樣率之間的關係。
如果我們為FFT收集了8192個樣本,則將得到:
$$ \ frac {8192 \ \ text {samples}} {2} = 4096 \ \,\ text {FFT bins} $$
如果我們的採樣率為10 kHz,則Nyquist-Shannon採樣定理說,我們的信號可以包含高達5 kHz的頻率。然後,我們的頻點分辨率為:
$$ \ frac {5 \ \ text {kHz}} {4096 \ \,\ text {FFT bins}} \ simeq \ frac {1.22 \ \ text { Hz}} {\ text {bin}} $$
從概念上講,這可能是更簡單的解釋,但簡化了:您的bin分辨率僅為\ $ \ frac {f_ {samp}} {N } \ $,其中\ $ f_ {samp} \ $是輸入信號的採樣率,N是使用的FFT點數(採樣長度)。
從上面的內容我們可以看到,變得越來越小FFT分檔我們可以運行更長的FFT(即在運行FFT之前以相同的速率 抽取更多采樣),也可以降低採樣率。
:
在時間分辨率和頻率分辨率之間總是要取捨。
在上面的示例中,我們需要收集8192個樣本才能運行FFT ,以10 kHz採樣時需要0.82秒。
如果我們試圖通過運行更長的FFT來獲得更小的FFT檔,則收集所需樣本的時間甚至會更長。
那也許可以,但可能並非如此。重要的一點是,在固定的採樣率下,提高頻率分辨率會降低時間分辨率。也就是說,您在頻域中的測量越準確,則在時域中的準確性就越差。您實際上會丟失FFT長度內的所有時間信息。
在此示例中,如果在8192個採樣FFT的上半部分開始和停止1999 Hz音,而在下半部分FFT中播放2002 Hz聲音在窗口中,我們會看到兩者,但它們似乎是同時發生的。
您還必須考慮處理時間。 8192點FFT需要一些體面的處理能力。減少這種需求的一種方法是降低採樣率,這是提高頻率分辨率的第二種方法。
在您的示例中,如果將採樣率降低到4096 Hz之類,則只需要4096點FFT即可實現1 Hz bins * 4096 Hz,那麼您只需要4096點FFT即可實現1hz bins,仍然可以解析2khz信號。這樣既可以減小FFT信元的大小,又可以減小信號的帶寬。
最終,使用FFT總是會在頻率分辨率和時間分辨率之間進行權衡。您必須採取一些平衡的措施才能實現所有目標。
基本FFT分辨率是\ $ f_s \ over N \ $,其中\ $ f_s \ $是採樣頻率。
區分兩個非常接近的信號的能力在很大程度上取決於相對幅度和
您可能會發現,使用 Baudline信號分析儀可以很好地了解這一問題-不,運行一些FFT並繪製一個頻譜在Matlab或Python / Numpy中一次是不一樣的。
編輯:還有一個技巧可以用零填充輸入並採用更大的FFT。它不會提高您的區分能力,但可能會使頻譜更具可讀性。基本上,這是一種與矢量圖形中的抗鋸齒相似的技巧。
值得注意的是,FFT是計算Sample [k] * SineRefWave [j] [k]和Sample [j] *的多個獨立的和對(k = 0..sample_length-1)的替代方法CosRefWave [j] [k],對於所有j均不超過樣本長度的一半。如果需要在所有這些頻率下進行幅度讀數,則FFT將在O(NlgN)時間內全部計算出來,而單獨計算它們將花費O(N ^ 2)時間。另一方面,如果僅需要幾個頻率的幅度讀數,則通常最好單獨進行計算,特別是如果使用的是能夠有效地計算出總和样式的處理器或DSP。
同樣值得注意的是20ms的採樣窗口將無法區分單個1975Hz音調或N<25的頻率(1975-N)Hz和(1975 + N)Hz的組合,它可用於測量比如果附近沒有其他光譜內容,則為採樣窗口。單獨的1975Hz頻率將在1950Hz和2000Hz頻段中平均拾取,就像1974Hz和1976Hz音調的組合一樣。但是,孤立的1974Hz音調在1950Hz頻段中的拾音強度要比2000Hz頻段中的拾音強度高,而1976Hz音調在2000Hz頻段中的拾音強度更高。
頻率分辨率不取決於FFT的長度,而是總採樣時間T的長度,即1 / T,它也是您獲得的最低頻率分量。
請注意,零填充不會增加頻率分辨率;零填充信號的DFT僅僅是原始信號DTFT的更好近似。
我將嘗試以另一種方式對此進行解釋。非2 ^ n的數字可能會有所幫助。 首先,記住FFT(基本上是DFT)的作用是很有幫助的:它將-windowed-信號與基本餘弦(和正弦)乘以它的下N個諧波。算法創建。在數字計算機中,該算法創建了cos(2 pi tn)[+ j sin(2 pi nt),但我們不去考慮正弦了],其中 t (而不是n-n是諧波訂單)是箱數。這是最重要的部分:在數字計算機中,時間t在提供的箱中被量化。因此,計算機將計算標量時間值x諧波階次x 2 pi的餘弦值。
我們假設採樣率為1kHz;這意味著每1毫秒獲得一個值(通常為電壓)。如果將二進制數設置為200,則創建的最長餘弦的時間長度為200 x 0.001 = 0.2 s,因此其周期為0.2s,因此其頻率為5 Hz。這是整個餘弦集中只有一個峰值和一個谷值的餘弦。是f_min。下一個諧波將具有兩個峰值和兩個波谷,每個下一個諧波將具有三個峰值,等等。這些諧波將是5、10、15等多個Hz。
如果儘管我們選擇了500個bin,則基本餘弦將得到更大的擴展:它的時間長度為500 x 0.001 = 0.5 s => f_min = 2 Hz。因此,在後一種情況下,餘弦被構建為一系列的2,4,6,8 ...因此,我們看到增加bin的數量可以提高算法的分辨率。
提高了分辨率是因為算法的研究工具(餘弦(和正弦)係數)更加密集。輸入信號僅受采樣率的影響。
如果我們反轉乘法並將周期轉換為頻率,則第一篇文章的類型就會出現。
如果您知道可能的輸入頻率範圍,並且範圍很窄,則可以應用欠採樣以減少採樣數量和計算FFT的時間。通過256個採樣和256 Hz的採樣頻率,您可以獲得所需的1 Hz分辨率和128 Hz的無混疊帶寬。