FFT IP核調用與仿真之FFT數學分析


 對於FFT這個IP核,我其實對它真的是又愛又恨,因為它真的耗費了我太多時間,但是隨着研究的深入,遇到的問題一點點給消化解決,終於不用帶着問題睡覺了,哈哈,有時候真的挺佩服自己的,遇到不懂的,不了解的,真的不允許自己留一點疑惑,必須深挖到底,一點含糊都不留給自己,其實,不知道大家有沒有這樣的疑惑,現在不懂的,懶得去研究的,估計過不了多久這個知識點又會兜回來找你的。我有時候也會僥幸自己能逃過不會做的任務,但是真的過不了多久,我越是不會的東西就越是會來找我,感覺今天的話有點多,趕緊回到正題上來。FFT是什么?我也曾經花了大半個月的時間去研究過它的原理,還手寫代碼不調用IP核去實現它的計算,這個實現過程還是挺復雜的,所以最簡單易上手的還是好好學會調用IP核吧,這個IP核真的忒好用呢。

    FFT其實本質上就是用來做頻譜分析的,我給你一堆混雜的頻譜,你知道里面有哪些頻率嗎?你不知道,但是FFT知道,它能幫你分析混雜頻譜中有哪些頻率成分。說得官方一點就是:FFT是離散傅立葉變換的快速算法,可以將一個信號變換到頻域,有些信號在時域上是很難看出什么特征的,但是如果變換到頻域之后,就很容易看出特征了,這就是很多信號分析采用FFT變換的原因。簡單來說,FFT的作用就是對信號進行頻譜分析

  我們首先結合MATALB這個強大的數學分析軟件來生動闡釋下FFT這個概念,它可以拿來做什么?它是如何實現頻譜分析的?一個模擬信號,經過ADC采樣之后,就變成了數字信號,我們就可以拿采樣得到的數字信號,做FFT變換。N個采樣點,經過FFT之后,就可以得到N個點的FFT結果。為了方便進行FFT運算,通常N取2的整數次方。 例如某點n所表示的頻率為:Fn=(n-1)*Fs/N。由這條公式可以看出,Fn所能分辨到的頻率為Fs/N,舉例來說如果采樣頻率Fs為1024Hz,采樣點數為1024點,則可以分辨到1Hz。1024Hz的采樣率采樣1024點,剛好是1秒,也就是說,采樣1秒時間的信號並做FFT,則結果可以分析到1Hz,如果采樣2秒時間的信號並做FFT,那這個對應的時間序列點數就是2048,則結果可以分析到0.5Hz。所以如果要提高頻率分辨力,則必須增加采樣點數,也即采樣時間。頻率分辨率和采樣時間是倒數關系。由於FFT結果的對稱性,通常我們只使用前半部分的結果,即小於采樣頻率一半的結果。

  假設我們有一個信號,它含有2V的直流分量,里面包含頻率為5MHz、相位為-30度、幅度為3V的交流信號,以及一個頻率為7.5MHz、相位為90度、幅度為1.5V的交流信號。用數學表達式就是如下:    S1=Adc+A1*cos(2*pi*F1*t+pi*P1/180)+A2*cos(2*pi*F2*t+pi*P2/180);%它含有2V的直流分量,頻率為5MHz、相位為-30度、幅度為3V的交流信號,以及一個頻率為75Hz、相位為90度、幅度為1.5V的交流信號這里式中的cos參數為弧度,所以-30度和90度要分別換算成弧度。我們以25.6MHz的采樣率對這個信號進行采樣,總共采樣256點。根據公式:Fn=(n-1)*Fs/N,我們可以知道,每兩個點之間的間距就是0.1MHz,也就是它的分辨率是0.1MHZ,第n個點的頻率就是n-1。我們的信號有3個頻率:0MHz、5MHz、7.5MHz,根據公式,n分別在1、51、76,也就是應該分別在第1個點、第51個點、第76個點上出現峰值,其它各點應該接近0。
實際情況如何呢?我們把S1這個交流信號灌進去MATLAB看看計算結果:
   1)峰值出現位置:我們可以看到在第1個點、第51個點、第76個點上分別出現峰值:

 

2)信號幅值對比:

預測猜想:按照我們的原始頻率輸入,第1個點、第51個點、第76個點的幅度值分別是2、3、1.5;

 Matlab輸出結果:

3)相位輸出驗證:

預測猜想:第1個點直流分量沒有相位輸出,不管,第51個點、第76個點的幅度值分別是-30,90;

Matlab輸出結果:

   以上就是FFT結合Matlab的數學分析,這個例子是我們預先知道了頻率的成分,然后利用FFT對原始信號作FFT運算,最后根據運算結果提取到的頻譜來驗證是否是我們灌進來的那些頻率信號。在實際的頻譜分析中,我們往往是不知道頻率成分的,但是基於合適的采樣率,經過了FFT運算后,可以提取到信號所對應的幅度值、相位、頻率,從而我們就可以還原出原始信號所攜帶的一些頻譜成分。
  基於Matlab的FFT數學分析就講到這里,接下來會詳細學習下FFT這個IP核。😀
  附錄:MATLAB實現代碼:
 1 %知識點補充:
 2 % 假設經過FFT處理之后,某點n用復數a+bi表示,那么這個復數的模就是An=sqrt(a*a+b*b),幅度值=An/(N/2)(對於直流信號是除以N),相位=atan2(b,a)。
 3 %1、假設某一點頻率為Fn=(n-1)*Fs/N,那Fn所能分辨到的頻率為Fs/N,舉例來說如果采樣頻率Fs為1024Hz,采樣點數為1024點,則可以分辨到1Hz。
 4 %2、以1024Hz的采樣率采樣1024點,剛好是1秒,也就是頻率分辨率是1Hz,如果是以采樣2秒的時間做FFT也就是說對應的時間序列點數就是2048,則頻率分辨率可以提高至0.5Hz。
 5 %3、要提高頻率分辨力,則必須增加采樣點數,也即采樣時間。
 6 %4、頻率分辨率和采樣時間是倒數關系,由於FFT結果的對稱性,通常我們只使用前半部分的結果,即小於采樣頻率一半的結果。
 7 
 8 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 9 close all; 
10 Adc=2;  %直流分量幅度
11 A1=3;   %頻率F1信號的幅度
12 A2=1.5; %頻率F2信號的幅度
13 F1=50;  %信號1頻率(Hz)
14 F2=75;  %信號2頻率(Hz)
15 Fs=256; %采樣頻率(Hz)
16 P1=-30; %信號1相位(度)
17 P2=90;  %信號相位(度)
18 N=256;  %采樣點數
19 t=[0:1/Fs:N/Fs]; %采樣時刻
20 
21 %信號
22 S=Adc+A1*cos(2*pi*F1*t+pi*P1/180)+A2*cos(2*pi*F2*t+pi*P2/180)
23 %顯示原始信號
24 plot(S);
25 title('原始信號');
26 
27 figure;
28 Y = fft(S,N) ;%做FFT變換
29 Ayy = (abs(Y));%取模
30 plot(Ayy(1:N)); %顯示原始的FFT模值結果
31 title('FFT 模值');
32 
33 figure;
34 Ayy=Ayy/(N/2);  %換算成實際的幅度
35 Ayy(1)=Ayy(1)/2;%直流信號幅度值
36 
37 F=([1:N]-1)*Fs/N; %換算成實際的頻率值
38 plot(F(1:N/2),Ayy(1:N/2));   %顯示換算后的FFT模值結果
39 title('幅度-頻率曲線圖');
40 
41 figure;
42 Pyy=[1:N/2];
43 for i=1:N/2;
44 Pyy(i)=phase(Y(i)); %計算相位
45 Pyy(i)=Pyy(i)*180/pi; %換算為角度
46 end;
47 plot(F(1:N/2),Pyy(1:N/2));   %顯示相位圖
48 title('相位-頻率曲線圖');
49 
50 num=[1 3 5];den=[2 5 7 8 3];
51 sys=tf(num,den);
52 bode(sys);grid on; 
View Code

 

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM