1. 程式人生 > >matlab進行傅立葉變換fft和shiftfft

matlab進行傅立葉變換fft和shiftfft

使用matlab進行傅立葉變換

模擬訊號進行奈奎斯特取樣後成為離散的數字訊號,時域分析不太方便,通常要進行頻域變換更好的分析訊號,matlab中的fft和shiftfft兩個函式可以快速的幫助我們進行頻譜分析。兩個函式存在一些差別。

關於fft的預備知識:

由奈奎斯特取樣定理知,要使訊號無失真的還原,頻譜不出現混疊,取樣頻率必須是訊號(基帶訊號)最高頻率的兩倍。這裡設訊號頻率f=100HZ,取樣頻率Fs=500HZ,取樣點N=8192。Fs/N是頻譜解析度,就是頻譜中兩根譜線的間距,理論上N越大,頻譜越好,但是硬體實現要求高,FFT蝶形運算的開銷和時間都會增加,這裡就不討論了。fft(x)運算後得到的是N的結果對應[0,fs]頻點的對應的值,進行(abs(fft(x))*2/N)後才是頻斜體樣式點對應的真是幅度值,其中abs是數值的絕對值和複數的幅值。這裡abs(fft(x))出來並不是真正的幅度值,還需要(*2/N),如果是支流部分是1/N,不需要乘2,之所以有這個操作和matlab的fft內部積分求和實現有關,可以看作是一種歸一化處理吧。

實訊號的頻譜分析:

實訊號的頻譜特點:關於原點對稱,是雙邊譜。
使用fft得到只有正頻域的,如圖1,我們可以在正頻率部分看到兩根譜線,一根在100HZ,一根在400HZ,有數字訊號處理的知識可知這是因為進行了時域的取樣,取樣頻率500HZ,使得頻域出現週期性,週期為500HZ,相當與把頻譜從零頻搬移到了500HZ處,我們看到的400HZ處的譜線,實際是-100處的譜線搬移過來的。
為了看到負頻率部分的頻譜,我們可以使用shiftfft函式,效果如圖2。使用shiftfft時需要注意的是橫座標刻度是[-fs/2,fs/2]。

% clear all; close all; clc;
f=100;%訊號頻率
Fs=500;
%取樣頻率 ts=1/Fs;%取樣時間間隔 N=8192;%取樣點數 t=0:t:(N-1)*t; x=100*sin(2*pi*f*t);%單音訊號 figure(1); f1_index=(0:N-1)*(Fs/N); y1=abs(fft(x)).*2/N; subplot(2,2,1); plot(f1_index,y1); xlabel('頻率(Hz)');ylabel('幅度(V)');title('fft sin'); f2_index = (-N/2:(N-1)/2)*(Fs/N); y2=abs(fftshift(fft(x))).*2/N; subplot(2,2,2); plot
(f2_index,y2); xlabel('頻率(Hz)');ylabel('幅度(V)');title('fftshift sin'); PYf1 =20*log10(y1); subplot(2,2,3); plot(f1_index,PYf1); xlabel('頻率(Hz)');ylabel('幅度(dB)');title('fft sin'); PYf2 =20*log10(y2); subplot(2,2,4); plot(f2_index,PYf2); xlabel('頻率(Hz)');ylabel('幅度(dB)');title('fftshift sin');

在這裡插入圖片描述

覆信號的頻譜分析:

覆信號是實際訊號處理常用的表示形式:x=x_re+j*x_im;分為實部和虛部,虛部是實部的希爾伯特變換。
覆信號的頻譜特點:只存在正頻域部分,單邊譜。
同樣使用fft和shiftfft進行分析。
從圖中可以看出,覆信號頻譜只有正頻域部分。

% clear all; close all; clc;
f=100;%訊號頻率
Fs=500;%取樣頻率
N=8192;%取樣點數
ts=1/Fs;
t=0:ts:(N-1)*ts;
x_re=100*cos(2*pi*f*t);%單音實部
x_im=100*sin(2*pi*f*t);%單音虛部
x=x_re+1i*x_im;
    
figure(1);
f1_index=(0:N-1)*(Fs/N);
y1=abs(fft(x)).*2/N;
subplot(2,1,1);
plot(f1_index,y1);
xlabel('頻率(Hz)');ylabel('幅度(V)');title('fft complex');
    
f2_index = (-N/2:(N-1)/2)*(Fs/N);
y2=abs(fftshift(fft(x))).*2/N;
subplot(2,1,2);
plot(f2_index,y2);
xlabel('頻率(Hz)');ylabel('幅度(V)');title('fftshift complex');

在這裡插入圖片描述

參考連結:https://ww2.mathworks.cn/help/matlab/ref/fft.html