① FFT的使用方法
一.調用方法X=FFT(x);X=FFT(x,N);
x=IFFT(X);x=IFFT(X,N)用MATLAB進行譜分析時注意:(1)函數FFT返回值的數據結構具有對稱性。例:N=8;n=0:N-1;xn=[4 3 2 6 7 8 9 0];Xk=fft(xn)→Xk =
39.0000 -10.7782 + 6.2929i 0 - 5.0000i 4.7782 - 7.7071i 5.0000 4.7782 + 7.7071i 0 + 5.0000i -10.7782 - 6.2929iXk與xn的維數相同,共有8個元素。Xk的第一個數對應於直流分量,即頻率值為0。(2)做FFT分析時,幅值大小與FFT選擇的點數有關,但不影響分析結果。在IFFT時已經做了處理。要得到真實的振幅值的大小,只要將得到的變換後結果乘以2除以N即可。二.FFT應用舉例例1:x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t)。采樣頻率fs=100Hz,分別繪制N=128、1024點幅頻圖。clf;fs=100;N=128; %采樣頻率和數據點數n=0:N-1;t=n/fs; %時間序列x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t); %信號y=fft(x,N); %對信號進行快速Fourier變換mag=abs(y); %求得Fourier變換後的振幅f=n*fs/N; %頻率序列subplot(2,2,1),plot(f,mag); %繪出隨頻率變化的振幅xlabel('頻率/Hz');ylabel('振幅');title('N=128');grid on;subplot(2,2,2),plot(f(1:N/2),mag(1:N/2)); %繪出Nyquist頻率之前隨頻率變化的振幅xlabel('頻率/Hz');ylabel('振幅');title('N=128');grid on;%對信號采樣數據為1024點的處理fs=100;N=1024;n=0:N-1;t=n/fs;x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t); %信號y=fft(x,N); %對信號進行快速Fourier變換mag=abs(y); %求取Fourier變換的振幅f=n*fs/N;subplot(2,2,3),plot(f,mag); %繪出隨頻率變化的振幅xlabel('頻率/Hz');ylabel('振幅');title('N=1024');grid on;subplot(2,2,4)plot(f(1:N/2),mag(1:N/2)); %繪出Nyquist頻率之前隨頻率變化的振幅xlabel('頻率/Hz');ylabel('振幅');title('N=1024');grid on;運行結果:
fs=100Hz,Nyquist頻率為fs/2=50Hz。整個頻譜圖是以Nyquist頻率為對稱軸的。並且可以明顯識別出信號中含有兩種頻率成分:15Hz和40Hz。由此可以知道FFT變換數據的對稱性。因此用FFT對信號做譜分析,只需考察0~Nyquist頻率范圍內的福頻特性。若沒有給出采樣頻率和采樣間隔,則分析通常對歸一化頻率0~1進行。另外,振幅的大小與所用采樣點數有關,採用128點和1024點的相同頻率的振幅是有不同的表現值,但在同一幅圖中,40Hz與15Hz振動幅值之比均為4:1,與真實振幅0.5:2是一致的。為了與真實振幅對應,需要將變換後結果乘以2除以N。例2:x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t),fs=100Hz,繪制:(1)數據個數N=32,FFT所用的采樣點數NFFT=32;(2)N=32,NFFT=128;(3)N=136,NFFT=128;(4)N=136,NFFT=512。clf;fs=100; %采樣頻率Ndata=32; %數據長度N=32; %FFT的數據長度n=0:Ndata-1;t=n/fs; %數據對應的時間序列x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t); %時間域信號y=fft(x,N); %信號的Fourier變換mag=abs(y); %求取振幅f=(0:N-1)*fs/N; %真實頻率subplot(2,2,1),plot(f(1:N/2),mag(1:N/2)*2/N); %繪出Nyquist頻率之前的振幅xlabel('頻率/Hz');ylabel('振幅');title('Ndata=32 Nfft=32');grid on;
Ndata=32; %數據個數N=128; %FFT採用的數據長度n=0:Ndata-1;t=n/fs; %時間序列x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t);y=fft(x,N);mag=abs(y);f=(0:N-1)*fs/N; %真實頻率subplot(2,2,2),plot(f(1:N/2),mag(1:N/2)*2/N); %繪出Nyquist頻率之前的振幅xlabel('頻率/Hz');ylabel('振幅');title('Ndata=32 Nfft=128');grid on;
Ndata=136; %數據個數N=128; %FFT採用的數據個數n=0:Ndata-1;t=n/fs; %時間序列x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t);y=fft(x,N);mag=abs(y);f=(0:N-1)*fs/N; %真實頻率subplot(2,2,3),plot(f(1:N/2),mag(1:N/2)*2/N); %繪出Nyquist頻率之前的振幅xlabel('頻率/Hz');ylabel('振幅');title('Ndata=136 Nfft=128');grid on;
Ndata=136; %數據個數N=512; %FFT所用的數據個數n=0:Ndata-1;t=n/fs; %時間序列x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t);y=fft(x,N);mag=abs(y);f=(0:N-1)*fs/N; %真實頻率subplot(2,2,4),plot(f(1:N/2),mag(1:N/2)*2/N); %繪出Nyquist頻率之前的振幅xlabel('頻率/Hz');ylabel('振幅');title('Ndata=136 Nfft=512');grid on;
結論:(1)當數據個數和FFT採用的數據個數均為32時,頻率解析度較低,但沒有由於添零而導致的其他頻率成分。(2)由於在時間域內信號加零,致使振幅譜中出現很多其他成分,這是加零造成的。其振幅由於加了多個零而明顯減小。(3)FFT程序將數據截斷,這時解析度較高。(4)也是在數據的末尾補零,但由於含有信號的數據個數足夠多,FFT振幅譜也基本不受影響。對信號進行頻譜分析時,數據樣本應有足夠的長度,一般FFT程序中所用數據點數與原含有信號數據點數相同,這樣的頻譜圖具有較高的質量,可減小因補零或截斷而產生的影響。
例3:x=cos(2*pi*0.24*n)+cos(2*pi*0.26*n)
(1)數據點過少,幾乎無法看出有關信號頻譜的詳細信息;(2)中間的圖是將x(n)補90個零,幅度頻譜的數據相當密,稱為高密度頻譜圖。但從圖中很難看出信號的頻譜成分。(3)信號的有效數據很長,可以清楚地看出信號的頻率成分,一個是0.24Hz,一個是0.26Hz,稱為高解析度頻譜。可見,采樣數據過少,運用FFT變換不能分辨出其中的頻率成分。添加零後可增加頻譜中的數據個數,譜的密度增高了,但仍不能分辨其中的頻率成分,即譜的解析度沒有提高。只有數據點數足夠多時才能分辨其中的頻率成分。
② 正弦序列FFT頻譜分析程序問題!!
因為N個樣點的信號經過fft以後變成N個樣點的頻譜,這個頻譜是關於第N/2+1樣點左右對稱的,所以真正有用的頻譜數據只有前面一半,後面一半是鏡像。mxk11是對前N/2個樣點取幅度譜,其實應該是取1:N1/2+1,你這里少取了一個點。具體為什麼會鏡像請看數字信號處理DFT章節。
③ 如何使用MATLAB中的fft函數來進行頻譜分析
matlab如何採集語音
[x,fs,bits]
=
wavread('filename.wav')
;
fs
存的是采樣率,單位hz,bits
是數據的位數。
matlab如何畫fft頻譜
clf;
fs=100;n=128;
%采樣頻率和數據點數
n=0:n-1;t=n/fs;
%時間序列
x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t);
%信號
y=fft(x,n);
%對信號進行快速fourier變換
mag=abs(y);
%求得fourier變換後的振幅
f=n*fs/n;
%頻率序列
plot(f,mag);
%繪出隨頻率變化的振幅
xlabel('頻率/hz');
ylabel('振幅');title('n=128');grid
on;
至於如何合起來,題主應該懂吧
④ 關於用MATLAB設計對信號進行頻譜分析和濾波處理的程序
完整的程序
%寫上標題
%設計低通濾波器:
[N,Wc]=buttord()
%估算得到Butterworth低通濾波器的最小階數N和3dB截止頻率Wc
[a,b]=butter(N,Wc); %設計Butterworth低通濾波器
[h,f]=freqz(); %求數字低通濾波器的頻率響應
figure(2); % 打開窗口2
subplot(221); %圖形顯示分割窗口
plot(f,abs(h)); %繪制Butterworth低通濾波器的幅頻響應圖
title(巴氏低通濾波器'');
grid; %繪制帶網格的圖像
sf=filter(a,b,s); %疊加函數S經過低通濾波器以後的新函數
subplot(222);
plot(t,sf); %繪制疊加函數S經過低通濾波器以後的時域圖形
xlabel('時間 (seconds)');
ylabel('時間按幅度');
SF=fft(sf,256); %對疊加函數S經過低通濾波器以後的新函數進行256點的基—2快速傅立葉變換
w= %新信號角頻率
subplot(223);
plot()); %繪制疊加函數S經過低通濾波器以後的頻譜圖
title('低通濾波後的頻譜圖');
%設計高通濾波器
[N,Wc]=buttord()
%估算得到Butterworth高通濾波器的最小階數N和3dB截止頻率Wc
[a,b]=butter(N,Wc,'high'); %設計Butterworth高通濾波器
[h,f]=freqz(); %求數字高通濾波器的頻率響應
figure(3);
subplot(221);
plot()); %繪制Butterworth高通濾波器的幅頻響應圖
title('巴氏高通濾波器');
grid; %繪制帶網格的圖像
sf=filter(); %疊加函數S經過高通濾波器以後的新函數
subplot(222);
plot(t,sf); ;%繪制疊加函數S經過高通濾波器以後的時域圖形
xlabel('Time(seconds)');
ylabel('Time waveform');
w; %新信號角頻率
subplot(223);
plot()); %繪制疊加函數S經過高通濾波器以後的頻譜圖
title('高通濾波後的頻譜圖');
%設計帶通濾波器
[N,Wc]=buttord([)
%估算得到Butterworth帶通濾波器的最小階數N和3dB截止頻率Wc
[a,b]=butter(N,Wc); %設計Butterworth帶通濾波器
[h,f]=freqz(); %求數字帶通濾波器的頻率響應
figure(4);
subplot(221);
plot(f,abs(h)); %繪制Butterworth帶通濾波器的幅頻響應圖
title('butter bandpass filter');
grid; %繪制帶網格的圖像
sf=filter(a,b,s); %疊加函數S經過帶通濾波器以後的新函數
subplot(222);
plot(t,sf); %繪制疊加函數S經過帶通濾波器以後的時域圖形
xlabel('Time(seconds)');
ylabel('Time waveform');
SF=fft(); %對疊加函數S經過帶通濾波器以後的新函數進行256點的基—2快速傅立葉變換
w=( %新信號角頻率
subplot(223);
plot(')); %繪制疊加函數S經過帶通濾波器以後的頻譜圖
title('帶通濾波後的頻譜圖');
⑤ 如何使用Matlab,對一組數據進行FFT變換,得到頻譜分析,萬分感謝。
看看下面的程序,應該能幫上你的忙,已經通過調試:
Fs=256;
%采樣頻率(Hz)
N=256;
%采樣點數
t=[0:1/Fs:N/Fs];
%采樣時刻
S=2+3*cos(2*pi*10*t+pi*30/180)+cos(2*pi*20*t+pi*90/180);
%我的調試信號,你自己是電流電壓數據的話,最開始通過load指令載入就是
Y
=
fft(S,N);
%做FFT變換
Ayy
=
abs(Y);
%取模
Ayy=Ayy/(N/2);
%換算成實際的幅度
Ayy(1)=Ayy(1)/2;
F=([1:N]-1)*Fs/N;
%換算成實際的頻率值,Fn=(n-1)*Fs/N
stem(F(1:N/2),Ayy(1:N/2));
%顯示換算後的FFT模值結果
title('幅度-頻率曲線圖');
⑥ 用FFT對離散信號進行譜分析
數字信號處理課程主要研究用數字序列或符號序列表示信號,並用數字計算方法對這些序列進行處理,以便把這些信號變成符合某種需要的形式,例如對信號進行濾波處理、頻譜分析、功率譜估計等。本課程重點討論確定性數字信號的處理,在此基礎上,對隨機信號處理進行研究。其主要內容有:(1)離散傅里葉變換(DFT):DFT基本理論、基本方法、基本性質,利用循環卷積計算線性卷積方法。快速傅里葉變換(FFT)方法。運用FFT對信號進行譜分析,運用FFT計算線性卷積;(2)數字濾波器原理和設計方法:數字濾波器IIR和FIR類型濾波器基本網路結構,沖激不變法、雙線性變換法數字濾波器設計方法,數字巴特沃斯(Butterworth)、切比雪夫(Chebyshev)及橢圓數字濾波器設計方法、步驟及特性。IIR數字濾波器頻率變換方法技術,FIR窗函數方法設計濾波器,頻率取樣方法設計FIR類數字濾波器方法及其特性;(3)離散隨機過程:離散隨機過程的幾個基本特性,功率譜基本性質和計算方法,隨機信號通過線性系統;(4)有限長效應:有限長效應引起的誤差的分類,不同方法表示負數時量化效應的不同影響。信號由於量化所引入的雜訊情形,定點、浮點運算中有限長影響的情形,IIR濾波器、FFT中的數字量化效應情形;(5)功率譜估計:估計理論的幾個基本概念,自相關、周期圖、直接變換譜估計方法的分析、實現。現代譜估計的幾個基本方法。
⑦ matlab里有什麼工具箱,可以用FFT(快速傅立葉變換)做頻譜分析
1、采樣數據導入Matlab 。
采樣數據的導入至少有三種方法。
第一就是手動將數據整理成Matlab支持的格式,這種方法僅適用於數據量比較小的采樣。
第二種方法是使用Matlab的可視化交互操作,具體操作步驟為:File --> Import Data,然後在彈出的對話框中找到保存采樣數據的文件,根據提示一步一步即可將數據導入。這種方法適合於數據量較大,但又不是太大的數據。
第三種方法,使用文件讀入命令。數據文件讀入命令有textread、fscanf、load等,如采樣數據保存在txt文件中,則推薦使用 textread命令。如[a,b]=textread('data.txt','%f%*f%f'); 這條命令將data.txt中保存的數據三個三個分組,將每組的第一個數據送給列向量a,第三個數送給列向量b,第二個數據丟棄。命令類似於C語言,詳細可查看其幫助文件。文件讀入命令錄入采樣數據可以處理任意大小的數據量,且錄入速度相當快,一百多萬的數據不到20秒即可錄入。
2、對采樣數據進行頻譜分析 。
頻譜分析自然要使用快速傅里葉變換FFT了,對應的命令即 fft ,簡單使用方法為:Y=fft(b,N),其中b即是采樣數據,N為fft數據采樣個數。一般不指定N,即簡化為Y=fft(b)。Y即為FFT變換後得到的結果,與b的元素數相等,為復數。以頻率為橫坐標,Y數組每個元素的幅值為縱坐標,畫圖即得數據b的幅頻特性;以頻率為橫坐標,Y數組每個元素的角度為縱坐標,畫圖即得數據b的相頻特性。典型頻譜分析M程序舉例如下: clc fs=100;
t=[0:1/fs:100];
N=length(t)-1;%減1使N為偶數 %頻率解析度F=1/t=fs/N
p=1.3*sin(0.48*2*pi*t)+2.1*sin(0.52*2*pi*t)+1.1*sin(0.53*2*pi*t)... +0.5*sin(1.8*2*pi*t)+0.9*sin(2.2*2*pi*t);
%上面模擬對信號進行采樣,得到采樣數據p,下面對p進行頻譜分析
figure(1) plot(t,p); grid on
title('信號 p(t)'); xlabel('t') ylabel('p') Y=fft(p);
magY=abs(Y(1:1:N/2))*2/N; f=(0:N/2-1)'*fs/N; figure(2)
%plot(f,magY);
h=stem(f,magY,'fill','--');
set(h,'MarkerEdgeColor','red','Marker','*') grid on
title('頻譜圖 (理想值:[0.48Hz,1.3]、[0.52Hz,2.1]、[0.53Hz,1.1]、[1.8Hz,0.5]、[2.2Hz,0.9]) '); xlabel('f (Hz)') ylabel('幅值')
對於現實中的情況,采樣頻率fs一般都是由采樣儀器決定的,即fs為一個給定的常數;另一方面,為了獲得一定精度的頻譜,對頻率解析度F有一個人為的規定,一般要求F<0.01,即采樣時間ts>100秒;由采樣時間ts和采樣頻率fs即可決定采樣數據量,即采樣總點數N=fs*ts。這就從理論上對采樣時間ts和采樣總點數N提出了要求,以保證頻譜分析的精準度。