matlab運用fft進行簡單的濾波


******該程序共分為四個部分,繪制原始時域信號圖;進行傅里葉變換並繪制頻譜圖;濾波並繪制頻譜圖;進行傅里葉反變換,繪制濾波后時域信號圖******

clear all;
dt=0.02;N=512;
n=1:N-1;t=n*dt;                                         %時間序列
f=n/(N*dt);                                             %頻率序列
f1=3;f2=10;                                             %已知原始信號的頻率成分
x=0.5*sin(2*pi*3*n*dt)+cos(2*pi*10*n*dt);               %原始信號
subplot(2,2,1);plot(t,x);                               %時域信號圖
title('時域信號');xlabel('時間/s');


y=fft(x);                                               %對時域信號進行FFT變換
xlim([0 12]);ylim([-1.5 1.5]);
subplot(2,2,2);plot(f,abs(y)*2/N);                      %繪制原始信號的振幅圖
xlabel('頻率/Hz');ylabel('振幅');
xlim([0 50]);title('原始振幅譜');
ylim([0 0.8]);


f1=8;f2=15;                                             %要濾除頻率的上下限
yy=zeros(1,length(y));                                  %設置與y相同的元素數組
for m=0:N-1                                             %將頻率落在該頻率范圍內及其大於奈奎斯特的波濾除
    %小於奈奎斯特頻率的濾波范圍
    if (m/(N*dt)>f1&m/(N*dt)<f2)|(m/(N*dt)>(1/dt-f2)&m/(N*dt)<(1/dt-f1));
        %大於奈奎斯特頻率的濾波范圍
        %1/dt為一個頻率周期
        yy(m+1)=0;                                      %將落在此頻率范圍內的振幅設置為0
    else
        if m<511;                                       %確定數組y(m+1)不溢出
        yy(m+1)=y(m+1);                                 %其余頻率范圍內的信號保持不變
        end
    end
end
subplot(2,2,4);plot(f,abs(yy)*2/N);                     %繪制濾波后的振幅譜
xlim([0 50]);ylim([0 0.5]);
xlabel('頻率/Hz');ylabel('振幅');
gstext=sprintf('自%4.1f-%4.1fHz的頻率被濾除',f1,f2);
%將濾波范圍顯示作為標題
title(gstext);


subplot(2,2,3);plot(t,real(ifft(yy)));
%繪制濾波后的數據運用ifft變換回時域並繪圖
title('通過IFFT回到時域');
xlabel('時間/s');
ylim([-0.6 0.6]);xlim([0 12]);


免責聲明!

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



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