FFT-Matlab初步實現

 

 

 

 

 

 

 

/****************************************************/函數

/****************************************************/spa

/****************************************************/3d

下面是具體說明blog

一、FFT:頻譜關於中間位置對稱,只須要觀察  0:1:N/2(這N/2+1個點)(時域採集N個點,頻域只須要觀察N/2+1個點)get

二、MATLAB中FFT的頻譜,應該看幅值it

三、X軸頻率點的設置:採樣頻率爲Fs,頻譜圖顯示的最高頻率爲Fs/2(採樣定理)class

  :X軸頻率點:(0:1:N/2)*Fs/Ngrid

四、複數幅值修正下載

 五、im

 

/****************************************************/

/****************************************************/

/****************************************************/

栗子及實踐部分

 

1、信號

%% FFT
clear;clc;close all
Fs=1000;    % 採集頻率
T=1/Fs;     % 採集時間間隔
N=2000;     % 採集信號的長度--採樣點數
f1=33;      % 第一個餘弦信號的頻率
f2=200;     % 第二個餘弦信號的頻率

t=(0:1:N-1)*T;  % 定義整個採集時間點
t=t';           % 轉置成列向量

y=1.2+2.7*cos(2*pi*f1*t+pi/4)+5*cos(2*pi*f2*t+pi/6);  % 時域信號

 

2、繪製時域信號

%% 繪製時域信號
figure
plot(t,y) 
xlabel('時間')
ylabel('信號值')
title('時域信號')

  

  

 

3、FFT變換、並繪製-幅值、實部、虛部

%% fft變換
Y=fft(y);    % Y爲fft變換的結果,爲複數向量
A=abs(Y);    % 複數的幅值(模)
RE=real(Y);  % 複數的實部
IM=imag(Y);  % 複數的虛部

%% 繪製fft變換結果(幅值,實部,虛部)
figure
subplot(3,1,1)
plot(0:1:N-1,A)
xlabel('序號 0 ~ N-1')
ylabel('幅值')
grid on

%% 頻域只讀取0:1:N/2
subplot(3,1,2)
plot(0:1:N-1,RE)
xlabel('序號 0 ~ N-1')
ylabel('實部')
grid on

subplot(3,1,3)
plot(0:1:N-1,IM)
xlabel('序號 0 ~ N-1')
ylabel('虛部')
grid on

  

  

能夠看出頻域中的點關於(N/2)對稱,因此只須要觀察(0:1:N/2)

 

4、更改相位

 

 

幅值不受影響,但實部或虛部的值,會出現0的狀況==>看MATLAB中FFT的頻譜,應該看幅值

 繪製半譜圖(幅值的)後--咱們發現-幅值-相位-頻率---均和時域對應不上。

==>進行幅值-修正

5、進行幅值-修正--並繪製圖形

%% fft變換
Y=fft(y);          % Y爲fft變換結果,複數向量
Y=Y(1:N/2+1);      % 只看變換結果的一半便可
A=abs(Y);          % 複數的幅值(模)
f=(0:1:N/2)*Fs/N;  % 生成頻率範圍
f=f';              % 轉置成列向量

%% 幅值修正
A_adj=zeros(N/2+1,1);
A_adj(1)=A(1)/N;        % 頻率爲0的位置
A_adj(end)=A(end)/N;    % 頻率爲Fs/2的位置
A_adj(2:end-1)=2*A(2:end-1)/N;

%% 繪製頻率幅值圖
figure
subplot(2,1,1)
plot(f,A_adj)
xlabel('頻率 (Hz)')
ylabel('幅值 (修正後)')
title('FFT變換幅值圖')
grid on

%% 繪製頻譜相位圖
subplot(2,1,2)
phase_angle=angle(Y);   % angle函數的返回結果爲弧度
phase_angle=rad2deg(phase_angle);
plot(f,phase_angle)
xlabel('頻率 (Hz)')
ylabel('相位角 (degree)')
title('FFT變換相位圖')
grid on

  

放大後能夠看到,此時,幅值-頻率都和時域一致

此時FFT的相位圖是雜亂無章的--不用擔憂,沒有頻率處的相位是無心義的--咱們只須要放大看各個(實際存在的)頻率點的相位便可

能夠看到--f1=33Hz處爲45度,即pi/4--是正確的

 

 

6、實際操做:請分析一個未知的採集信號 (example.mat),並肯定該採集信號的頻率成分。其中, 信號的採集頻率 Fs = 2500 Hz

代碼

clear;clc;close all
load('example')
Fs=2500;      % 採集頻率
T=1/Fs;       % 採集時間間隔
N=length(y);  % 採集信號的長度

t=(0:1:N-1)*T;   % 定義整個採集時間點
t=t';            % 轉置成列向量

% 繪製時域信號
figure
plot(t,y)
xlabel('時間')
ylabel('信號值')
title('時域信號')

% fft變換
Y=fft(y);          % Y爲fft變換結果,複數向量
Y=Y(1:N/2+1);      % 只看變換結果的一半便可
A=abs(Y);          % 複數的幅值(模)
f=(0:1:N/2)*Fs/N;  % 生成頻率範圍
f=f';              % 轉置成列向量

% 幅值修正
A_adj=zeros(N/2+1,1);
A_adj(1)=A(1)/N;       % 頻率爲0的位置
A_adj(end)=A(end)/N;   % 頻率爲Fs/2的位置
A_adj(2:end-1)=2*A(2:end-1)/N;

% 繪製頻率幅值圖
figure
subplot(2,1,1)
plot(f,A_adj)
xlabel('頻率 (Hz)')
ylabel('幅值 (修正後)')
title('FFT變換幅值圖')
grid on

% 繪製頻譜相位圖
subplot(2,1,2)
phase_angle=angle(Y);    % angle函數的返回結果爲弧度
phase_angle=rad2deg(phase_angle); 
plot(f,phase_angle)
xlabel('頻率 (Hz)')
ylabel('相位角 (degree)')
title('FFT變換相位圖')
grid on

  

 

 

 

 

所有代碼下載地址

相關文章
相關標籤/搜索