如何獲取FFT序列中每個點的頻率值?Linglai Li2015-01-07 17:33:34

這個問題問得很不清楚,按我的理解可能是這樣的:

H是一個向量(通常意義下應該是一串等時間取樣的時間序列),設H的取樣率為fs,即取樣時間為dt = 1/fs,取樣點為N,則總時長T = N*dt。對N點序列做FFT得到的頻譜,其分佈區間為[0, fs),而頻譜點的間隔即為df = 1/T。根據Nyquist取樣定理,其中只有[0,fs/2)有資訊量,剩下一半是共軛對稱的。所以這段話有兩個重要的資訊,取樣頻率fs決定了可分辨的頻率範圍是[0,fs/2),而取樣的總時長決定了頻域解析度df

舉個例子:在電力系統中計算諧波。中國電網頻率是50Hz,一個周波就是20ms,假設取樣是一週波256個點,即取樣率是fs = 256*50 = 12800Hz,dt = 1/12800,取樣點N = 256個(正好一個週期),則FFT的結果也是256個點,分別對應直流量,基波(50Hz),二次諧波(100Hz),三次諧波(150Hz),直到127次諧波;剩下的129個點是個特殊點,再剩下的127個點是跟1-127次共軛對稱的值。

如果我的理解是對的,題主想問的是要把FFT的結果n個點畫出來,其橫軸應該怎麼設定,那答案就是0:1/T : (n-1)/T,而縱軸一般是兩個分別畫:幅值和相角。

其實matlab自己fft這個函式的例子就有。

如何獲取FFT序列中每個點的頻率值?楊小當2015-01-15 15:10:21

這幾天我在幫師兄做傅立葉分析,就是從示波器踩過來的資料,儲存在excel檔案中。用matlab讀取,進行fft運算。大概通過幾天的學習dft,瞭解到如果你拿來一個向量,N個點。進行fft後結果當然也是N個點。但是這些點的頻率你是無法得知的。因為你沒有交代著N個點的時間長度。

以我最近幫師兄做的工作為例。示波器對300HZ電壓進行取樣,時長0。1s。那麼也就是30個周波。由於示波器的取樣頻率很高,所得到的資料是50w個點。這僅僅是0。1s啊

如何獲取FFT序列中每個點的頻率值?

如何獲取FFT序列中每個點的頻率值?

儲存在exce結果透過matlab讀取後,進行fft運算。結果也是50w 個點。於是問題來了,哪一個點是我要的300hz呢。答案是第31個點。

如何獲取FFT序列中每個點的頻率值?

如何獲取FFT序列中每個點的頻率值?

為什麼呢,因為matlab陣列是從1開始,第一個點是直流分量。即0hz,那為什麼第31點是300hz呢。因為時間長度是0。1s。那麼這段訊號進行fft的解析度就是10hz。所以300hz就是 30+1的點。

順便說一句,matlab進行fft運算的結果,幅值要經過*2/n的運算才能得到真實值。n是取樣點個數。還有,直流分量要再除以2,即第一個點雖然是直流 但是 幅值是真實值的2倍。原理高數傅立葉級數講過,已經餵狗。

回答的不好,不對的地方請高手指正。

如何獲取FFT序列中每個點的頻率值?李澤光2016-01-31 17:54:50

FFT結果任意一點的頻率為:

假設訊號取樣頻率為fs,從取樣定理可以知道,訊號抽樣後,抽樣訊號的頻譜是週期譜,其頻譜的週期是抽樣頻率fs,因此,對訊號做FFT時,無論你取多少點,其分析的頻率範圍就是0~fs,所以,如果你做N點的FFT(其實是離散傅立葉變換),則,FFT結果的兩點之間的頻率間隔是fs/N,這樣,任一點k(k=0~N-1)代表的頻率就是k*fs/N。另外,這N個點的FFT值是以N/2為對稱的,所以,一般真正用到的只有N/2個點。N點取的大隻說明譜線密一些而已,

注意:取樣定理非常重要啊!

如何獲取FFT序列中每個點的頻率值?Voyager2016-09-24 12:29:54

連續的時間域訊號x(t)以取樣率fs進行取樣後,得到離散的時間域訊號x(n)(即題主所指的向量H),然後經過N點DFT得到離散的頻率域序列X(m)(即題主所指的序列F)。

DFT輸出值X(m)對應的頻率取決於取樣率fs和樣點個數N。例如:如果取樣率為500Hz,然後進行16點DFT,那麼基頻為fs/N=500/16=31。25Hz,X(m)對應的頻率為基頻的整數倍,即

X(0)對應第1個頻率項,頻率=0 × 31。25=0Hz,

X(1)對應第2個頻率項,頻率=1 × 31。25=31。25Hz,

X(2)對應第3個頻率項,頻率=2 × 31。25=62。5Hz,

X(3)對應第4個頻率項,頻率=3 × 31。25=93。75Hz,

。。。

。。。

X(15)對應第16個頻率項,頻率=15 × 31。25=468。75Hz。

N點DFT的分析頻率為

f_{analysisx} (m)=\frac{mf_s} {N}

更詳細的DFT計算過程見理解離散傅立葉變換

如何獲取FFT序列中每個點的頻率值?趙易明2017-01-09 03:59:54

先來看看一段簡單的MATLAB程式碼

dt

=

0。002

t

=

0

dt

2

f0

=

100

x

=

sin

2

*

pi

*

f0

*

t

);

X

=

fft

x

length

x

));

plot

abs

X

),

‘linewidth’

2

);

set

gcf

‘color’

‘white’

axis

tight

很清楚,這是給一個100Hz正弦波做傅立葉變換,得到

如何獲取FFT序列中每個點的頻率值?

如何獲取FFT序列中每個點的頻率值?

很明顯得到一個單頻訊號,不過下標沒有對準100Hz。不過沒關係。換成下面的程式碼再跑一次:

dt = 0。002;

t = 0:dt:2;

f0 = 100;

N = length(x);

x = sin(2*pi*f0*t);

X = fft(x,N);

f = (0:N-1)/N * (1/dt);

plot(f,abs(X),‘linewidth’,2);

set(gcf,‘color’,‘white’)

axis tight

如何獲取FFT序列中每個點的頻率值?

如何獲取FFT序列中每個點的頻率值?

看頻譜的時候,只要看前一半就好了。要得到真實頻率的下標其實很簡單。只要先將頻率歸一化

f

=

0

N

-

1

/

N

然後,再乘以取樣率

f

=

f

*

fs

這個取樣率就是你輸入的資料裡,相鄰兩個點之間的間隔的倒數。比如說在你採集的資料裡

\Delta t=t(n+1)-t(n)

那麼取樣率就是

f_s=1/\Delta t

至於為什麼要這樣做,這是因為在連續傅立葉變換轉換到離散傅立葉變換的過程中,頻率間隔是這樣的

dw\rightarrow \Delta w=2\pi /(N\Delta t)