FFT 的物理意義

2021-01-10 電子產品世界
FFT是離散傅立葉變換的快速算法,可以將一個信號變換
到頻域。有些信號在時域上是很難看出什麼特徵的,但是如
果變換到頻域之後,就很容易看出特徵了。這就是很多信號
分析採用FFT變換的原因。另外,FFT可以將一個信號的頻譜
提取出來,這在頻譜分析方面也是經常用的。

雖然很多人都知道FFT是什麼,可以用來做什麼,怎麼去
做,但是卻不知道FFT之後的結果是什意思、如何決定要使用
多少點來做FFT。

本文引用地址:http://www.eepw.com.cn/article/201701/337850.htm

現在圈圈就根據實際經驗來說說FFT結果的具體物理意義
一個模擬信號,經過ADC採樣之後,就變成了數位訊號。採樣
定理告訴我們,採樣頻率要大於信號頻率的兩倍,這些我就
不在此羅嗦了。

採樣得到的數位訊號,就可以做FFT變換了。N個採樣點,
經過FFT之後,就可以得到N個點的FFT結果。為了方便進行FFT
運算,通常N取2的整數次方。

假設採樣頻率為Fs,信號頻率F,採樣點數為N。那麼FFT
之後結果就是一個為N點的複數。每一個點就對應著一個頻率
點。這個點的模值,就是該頻率值下的幅度特性。具體跟原始
信號的幅度有什麼關係呢?假設原始信號的峰值為A,那麼FFT
的結果的每個點(除了第一個點直流分量之外)的模值就是A
的N/2倍。而第一個點就是直流分量,它的模值就是直流分量
的N倍。而每個點的相位呢,就是在該頻率下的信號的相位。
第一個點表示直流分量(即0Hz),而最後一個點N的再下一個
點(實際上這個點是不存在的,這裡是假設的第N+1個點,也
可以看做是將第一個點分做兩半分,另一半移到最後)則表示
採樣頻率Fs,這中間被N-1個點平均分成N等份,每個點的頻率
依次增加。例如某點n所表示的頻率為:Fn=(n-1)*Fs/N。
由上面的公式可以看出,Fn所能分辨到頻率為為Fs/N,如果
採樣頻率Fs為1024Hz,採樣點數為1024點,則可以分辨到1Hz。
1024Hz的採樣率採樣1024點,剛好是1秒,也就是說,採樣1秒
時間的信號並做FFT,則結果可以分析到1Hz,如果採樣2秒時
間的信號並做FFT,則結果可以分析到0.5Hz。如果要提高頻率
分辨力,則必須增加採樣點數,也即採樣時間。頻率解析度和
採樣時間是倒數關係。
假設FFT之後某點n用複數a+bi表示,那麼這個複數的模就是
An=根號a*a+b*b,相位就是Pn=atan2(b,a)。根據以上的結果,
就可以計算出n點(n≠1,且n<=N/2)對應的信號的表達式為:
An/(N/2)*cos(2*pi*Fn*t+Pn),即2*An/N*cos(2*pi*Fn*t+Pn)。
對於n=1點的信號,是直流分量,幅度即為A1/N。
由於FFT結果的對稱性,通常我們只使用前半部分的結果,
即小於採樣頻率一半的結果。

好了,說了半天,看著公式也暈,下面圈圈以一個實際的
信號來做說明。

假設我們有一個信號,它含有2V的直流分量,頻率為50Hz、
相位為-30度、幅度為3V的交流信號,以及一個頻率為75Hz、
相位為90度、幅度為1.5V的交流信號。用數學表達式就是如下:

S=2+3*cos(2*pi*50*t-pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180)

式中cos參數為弧度,所以-30度和90度要分別換算成弧度。
我們以256Hz的採樣率對這個信號進行採樣,總共採樣256點。
按照我們上面的分析,Fn=(n-1)*Fs/N,我們可以知道,每兩個
點之間的間距就是1Hz,第n個點的頻率就是n-1。我們的信號
有3個頻率:0Hz、50Hz、75Hz,應該分別在第1個點、第51個點、
第76個點上出現峰值,其它各點應該接近0。實際情況如何呢?
我們來看看FFT的結果的模值如圖所示。

圖1 FFT結果
從圖中我們可以看到,在第1點、第51點、和第76點附近有
比較大的值。我們分別將這三個點附近的數據拿上來細看:
1點: 512+0i
2點: -2.6195E-14 - 1.4162E-13i
3點: -2.8586E-14 - 1.1898E-13i

50點:-6.2076E-13 - 2.1713E-12i
51點:332.55 - 192i
52點:-1.6707E-12 - 1.5241E-12i

75點:-2.2199E-13 -1.0076E-12i
76點:3.4315E-12 + 192i
77點:-3.0263E-14 +7.5609E-13i

很明顯,1點、51點、76點的值都比較大,它附近的點值
都很小,可以認為是0,即在那些頻率點上的信號幅度為0。
接著,我們來計算各點的幅度值。分別計算這三個點的模值,
結果如下:
1點: 512
51點:384
76點:192
按照公式,可以計算出直流分量為:512/N=512/256=2;
50Hz信號的幅度為:384/(N/2)=384/(256/2)=3;75Hz信號的
幅度為192/(N/2)=192/(256/2)=1.5。可見,從頻譜分析出來
的幅度是正確的。
然後再來計算相位信息。直流信號沒有相位可言,不用管
它。先計算50Hz信號的相位,atan2(-192, 332.55)=-0.5236,
結果是弧度,換算為角度就是180*(-0.5236)/pi=-30.0001。再
計算75Hz信號的相位,atan2(192, 3.4315E-12)=1.5708弧度,
換算成角度就是180*1.5708/pi=90.0002。可見,相位也是對的。
根據FFT結果以及上面的分析計算,我們就可以寫出信號的表達
式了,它就是我們開始提供的信號。

總結:假設採樣頻率為Fs,採樣點數為N,做FFT之後,某
一點n(n從1開始)表示的頻率為:Fn=(n-1)*Fs/N;該點的模值
除以N/2就是對應該頻率下的信號的幅度(對於直流信號是除以
N);該點的相位即是對應該頻率下的信號的相位。相位的計算
可用函數atan2(b,a)計算。atan2(b,a)是求坐標為(a,b)點的角
度值,範圍從-pi到pi。要精確到xHz,則需要採樣長度為1/x秒
的信號,並做FFT。要提高頻率解析度,就需要增加採樣點數,
這在一些實際的應用中是不現實的,需要在較短的時間內完成
分析。解決這個問題的方法有頻率細分法,比較簡單的方法是
採樣比較短時間的信號,然後在後面補充一定數量的0,使其長度
達到需要的點數,再做FFT,這在一定程度上能夠提高頻率分辨力。
具體的頻率細分法可參考相關文獻。

[附錄:本測試數據使用的matlab程序]
close all; %先關閉所有圖片
Adc=2; %直流分量幅度
A1=3; %頻率F1信號的幅度
A2=1.5; %頻率F2信號的幅度
F1=50; %信號1頻率(Hz)
F2=75; %信號2頻率(Hz)
Fs=256; %採樣頻率(Hz)
P1=-30; %信號1相位(度)
P2=90; %信號相位(度)
N=256; %採樣點數
t=[0:1/Fs:N/Fs]; %採樣時刻

%信號
S=Adc+A1*cos(2*pi*F1*t+pi*P1/180)+A2*cos(2*pi*F2*t+pi*P2/180);
%顯示原始信號
plot(S);
title(原始信號);

figure;
Y = fft(S,N); %做FFT變換
Ayy = (abs(Y)); %取模
plot(Ayy(1:N)); %顯示原始的FFT模值結果
title(FFT 模值);

figure;
Ayy=Ayy/(N/2); %換算成實際的幅度
Ayy(1)=Ayy(1)/2;
F=([1:N]-1)*Fs/N; %換算成實際的頻率值
plot(F(1:N/2),Ayy(1:N/2)); %顯示換算後的FFT模值結果
title(幅度-頻率曲線圖);

figure;
Pyy=[1:N/2];
for i=1:N/2
Pyy(i)=phase(Y(i)); %計算相位
Pyy(i)=Pyy(i)*180/pi; %換算為角度
end;
plot(F(1:N/2),Pyy(1:N/2)); %顯示相位圖

原文 地址:http://computer00.21ic.org/user1/2198/archives/2008/48202.html

相關焦點

  • 每日函數——fft
    fft快速傅立葉變換語法Y  = fft(X)Y  = fft(X
  • 通俗易懂的講解FFT的讓你快速了解FFT
    =1; //經過觀察,發現每級蝶形運算需要N/2次運算,共運算N/2*log2N  次   unsigned char fft_counter=0; //在此要進行補2   N必須是2^n   在此略 //蝶形級數  (L級) L=log2(N);         //計算每級蝶形計算的次數(這裡只是一個初始值)
  • 快速傅立葉變換(FFT)結果的物理意義是什麼?(附Matlab程序)
    現在就根據實際經驗來說說FFT結果的具體物理意義。一個模擬信號,經過ADC採樣之後,就變成了數位訊號。採樣定理告訴我們,採樣頻率要大於信號頻率的兩倍,這些我就不在此羅嗦了。採樣得到的數位訊號,就可以做FFT變換了。N個採樣點,經過FFT之後,就可以得到N個點的FFT結果。為了方便進行FFT運算,通常N取2的整數次方。
  • matlab下實現FFT信號分析
    利用matlab做頻譜分析前我們需要了解分析過程中的一些基礎知識,matlab中的 fft 函數用法、fftshift 函數的用法函數 1  fft :作用:快速傅立葉變換。語法:Y = fft(X)Y = fft(X,n)Y = fft(X,n,dim)語法:Y = fft(X) 用快速傅立葉變換 (FFT) 算法計算 X 的離散傅立葉變換 (DFT)。
  • 用FPGA實現FFT算法(圖)
    快速傅立葉變換(fast fourier transformation,簡稱fft)使dft運算效率提高1~2個數量級。其原因是當n較大時,對dft進行了基4和基2分解運算。fft算法除了必需的數據存儲器ram和旋轉因子rom外,仍需較複雜的運算和控制電路單元,即使現在,實現長點數的fft仍然是很困難。
  • 史上最簡單的FFT(快速傅立葉變換)
    asin(1.0)*2; typedef complex<double> cp; cp tmp[N<<1],a[N<<1],b[N<<1]; int n,m;cp c(int n,int k){ return cp(cos(2*k*PI/n),sin(2*k*PI/n)); } void fft
  • FFT
    最近在項目中需要用到FFT,之前對於FFT也只是有一個模糊的印象也並不清楚他的具體物理意義,之前幾次想學習都被擱置了,現在項目需要又從新學習,在此把我收穫的和大家分享一下
  • 數字與信號處理實驗3 用FFT進行譜分析
    處,因而用到fftshift語句。移位後頻率範圍為範圍的值,若要處於對稱的頻率範圍,則需採用fftshift(X)。       2.有限長序列x(n)的頻譜^n1; X1=fft(x1);                     %長度為N1的序列及其FFT                            N2=2*N1; n2=0 : N2-1;                     %數據長度加倍為N2                            x2=0.5.
  • 使用STM32 的DSP庫進行FFT變換
    * 使用三角函數生成採樣點,供FFT計算* 進行FFT測試時,按下面順序調用函數即可:* dsp_asm_init();* dsp_asm_test();*/#include "stm32f10x.h"#include "dsp_asm.h"#include "stm32_dsp.h"#include "table_fft.h"
  • 快速傅立葉變換FFT在MATLAB中的實現
    (y); %採集信號的長度t=(0:1:N-1)*T; %定義整個採集時間點t=t';  %轉置成列向量figureplot(t,y)xlabel('時間')ylabel('信號值')title('時域信號')2. fft
  • MATLAB實驗——FFT變換
    實驗代碼:clc;clear;alex=imread('E:\SEO\公眾號\0最菜程序猿\圖片\1.jpg');alex1=rgb2gray(alex);alex2=im2double(alex1);alex=fft2(alex2);subplot(2,1,1);imshow(alex1);alex1=fftshift(alex);alex2
  • 用C語言實現FFT算法
    /*****************fft programe*********************/#include typedef.h #include math.h本文引用地址:http://www.eepw.com.cn/article/150637.htmstruct compx
  • 中考物理知識點:歐姆定律的物理意義
    中考物理知識點:歐姆定律的物理意義   歐姆定律:導體中的電流跟導體兩端的電壓成正比,跟這段導體的電阻成反比.歐姆定律公式:I=U/R歐姆定律公式變形式:U=IRR=U/IR   物理意義:揭示了「導體中的電流由導體兩端的電壓和導體的電阻決定」這一制約關係。
  • 基於MSP430系列微控制器的FFT算法實現
    由於MSP430系列微控制器的開發軟體不支持複數運算,這裡複數運算需要分解成實部和虛部分別來完成,下面的函數「fft_2sin」用來實現蝶形運算。在前面給出的函數「fft_2 sin」中需要通過三角運算分別完成相位因子實部和虛部的計算。三角函數計算需要花費大量的時間,但是在分析的數據點數量給定以後可以首先完成相位因子的計算,將計算值存儲在一個數據表中,通過查表的方法代替三角函數計算。修改後的基2的FFT算法函數如下。
  • 向心加速度的物理意義
    向心加速度的物理意義及線速度方向變化快慢「向心加速度的物理意義是線速度方向變化快慢的程度」這一說法雖然在正規的教科書中從未見過
  • 複數的物理意義
    By:Octolet不少學物理的人都覺得"物理意義"是一個沒有良定義的概念, 而且由於這個詞在民科之中極高的出場率, 導致大家對這個詞都很反感.從物理的角度看, 用複數表示還是用矩陣表示其實不重要, 重要的是代數結構, 或者說描述對稱性的對稱群在什麼代數結構上表示比較方便. 所以, 真正的問題不是"複數對於物理有什麼意義", 而是"複數域這個代數結構對物理有什麼意義', 這樣的代數結構包含了怎樣的對稱性?
  • 卷積的定義和物理意義
    卷積(Convolution)是分析數學中一個重要的運算,很多具體實際應用中會用到這個概念,卷積的數學定義就是一個式子,背後有什麼物理背景意義呢 卷積的物理意義(定義的來源思路)如果一個信號是一組歷史信號的組合,比如a(0),a(1),a(2).a(n).,其中a(i)是i時刻信號的量值,我們要計算在某一時刻n的信號的組合量值f(n), f(n)是a(0),a(1),a(2).a(n)的組合。
  • PyTorch中的傅立葉卷積:通過FFT計算大核卷積的數學原理和代碼
    從概念上講,此功能的內部工作原理是:def fft_conv( signal: Tensor, kernel: Tensor, bias: Tensor = None, padding: int = 0, ) -> Tensor: # 1.
  • 脫離物理的數學有意義嗎?
    甚至可以說,很多數學就是脫胎於物理的需要而產生的。很多人就此產生了數學是依附於物理的感覺。他們不禁要問:脫離物理的數學還有意義嗎?這個問題的回答是:數學的意義,正是它能夠脫離一切具體的研究對象,包括物理。圖片來自pixabay舉個例子。人們一開始定義實數,是因為它描述了物理世界中發生的事情,比如說距離和時間。