matlab繪制正弦信號頻譜圖(虛、實頻譜、單、雙邊相位譜、單、雙邊幅頻譜)
首先我們今天繪制的正弦信號的函數表達式:f(x)=sin(2*π*f*t),其中f=2.
我使用的是matlab2020b,打開matlab后,新建腳本。
我們先畫出sin(2*π*f*t)信號的圖像:
f=2; T=1/f; Fs=100; %采樣率 Ts=1/Fs; t=0:Ts:1-Ts; %t范圍0~1,步長0.01 n=length(t); y=sin(2*pi*f*t); %正弦信號函數 sinplot=figure; plot(t,y) %繪制函數圖像 x軸為時間t,y軸為信號函數 xlabel('時間(s)') %x軸名稱 ylabel('信號') %y軸名稱 title('原信號圖像') %圖像頂部名稱 grid on
函數圖像如下:
然后對函數進行快速傅里葉變換、計算實部虛部,繪制幅頻譜、相頻譜、實頻譜、虛頻譜。
代碼如下:
[Doain,Range]=cFFT(y,Fs); Doain2=Doain(1,51:100); stem(Range(1,51:100),abs(Doain2)*2,'Marker','none','LineWidth',3);%離散繪制幅頻譜,取消原圖像小圓圈,線條粗細3
xlabel('Freq(Hz)') ylabel('幅值') title('單邊幅頻譜') grid axis([-2.5,2.5,-1.5,1.5]) %坐標顯示范圍:x軸-2.5~2.5,y軸-1.5~1.5 CnR=real(Doain); %實部 CnI=imag(Doain); %虛部 Cn=(CnR.^2+CnI.^2).^(1/2); %幅值 fain=tand(CnI./CnR)/3; %相位角 fain=fain(1,48:54); %去除影響因素 figure stem(Range,CnR) %離散繪制 grid axis([-6,6,-2,2]) title('實頻譜') xlabel('Hz') ylabel('CnR') figure stem(Range,CnI,'Marker','none','LineWidth',3) grid axis([-2.5,2.5,-1,1]) title('虛頻譜') xlabel('Hz') ylabel('CnI') figure stem(Range,Cn,'Marker','none','LineWidth',3) grid axis([-2.5,2.5,-0.5,1]) title('雙邊幅頻譜') xlabel('Hz') ylabel('|Cn|') figure stem(Range(1,48:54),-fain,'Marker','none','LineWidth',3) grid axis([-2.5,2.5,-2.5,2.5]) title('雙邊相頻譜') xlabel('Hz') ylabel('相位角') figure fain2=fain(1,4:7); stem(Range(1,51:54),-fain2,'Marker','none','LineWidth',3) grid axis([-2.5,2.5,-2.5,1.5]) title('單邊相頻譜') xlabel('Hz') ylabel('相位角') figure plot(t,y) xlabel('時間(s)') ylabel('信號') title('原信號圖像') grid on function[X,freq]=cFFT(x,Fs) %修正 N=length(x); if mod(N,2)==0 k=-N/2:N/2-1; else k=-(N-1)/2:(N-1)/2; end T=N/Fs; freq=k/T; X=fft(x)/N; X=fftshift(X); end
繪制圖像如下:
最后附上完整代碼:
f=2; T=1/f; Fs=100; Ts=1/Fs; t=0:Ts:1-Ts; n=length(t); y=sin(2*pi*f*t); sinplot=figure [Doain,Range]=cFFT(y,Fs); Doain2=Doain(1,51:100); stem(Range(1,51:100),abs(Doain2)*2,'Marker','none','LineWidth',3); xlabel('Freq(Hz)') ylabel('幅值') title('單邊幅頻譜') grid axis([-2.5,2.5,-1.5,1.5]) CnR=real(Doain); CnI=imag(Doain); Cn=(CnR.^2+CnI.^2).^(1/2); fain=tand(CnI./CnR)/3; fain=fain(1,48:54); figure stem(Range,CnR) grid axis([-6,6,-2,2]) title('實頻譜') xlabel('Hz') ylabel('CnR') figure stem(Range,CnI,'Marker','none','LineWidth',3) grid axis([-2.5,2.5,-1,1]) title('虛頻譜') xlabel('Hz') ylabel('CnI') figure stem(Range,Cn,'Marker','none','LineWidth',3) grid axis([-2.5,2.5,-0.5,1]) title('雙邊幅頻譜') xlabel('Hz') ylabel('|Cn|') figure stem(Range(1,48:54),-fain,'Marker','none','LineWidth',3) grid axis([-2.5,2.5,-2.5,2.5]) title('雙邊相頻譜') xlabel('Hz') ylabel('相位角') figure fain2=fain(1,4:7); stem(Range(1,51:54),-fain2,'Marker','none','LineWidth',3) grid axis([-2.5,2.5,-2.5,1.5]) title('單邊相頻譜') xlabel('Hz') ylabel('相位角') figure plot(t,y) xlabel('時間(s)') ylabel('信號') title('原信號圖像') grid on function[X,freq]=cFFT(x,Fs) N=length(x); if mod(N,2)==0 k=-N/2:N/2-1; else k=-(N-1)/2:(N-1)/2; end T=N/Fs; freq=k/T; X=fft(x)/N; X=fftshift(X); end
延遲T/4后的代碼
fo=2; T=1/fo; Fs=100; Ts=1/Fs; t=0:Ts:1-Ts; n=length(t); y=sin(2*pi*fo*t-pi/2); sinplot=figure [Doain,Range]=centeredFFT(y,Fs); Doain2=Doain(1,51:100); stem(Range(1,51:100),abs(Doain2)*2,'Marker','none','LineWidth',3); xlabel('Freq(Hz)') ylabel('幅值') title('單邊幅頻譜') grid axis([-2.5,2.5,-1,1.5]) CnR=real(Doain); CnI=imag(Doain); Cn=(CnR.^2+CnI.^2).^(1/2); fain=tand(CnR./CnI)*3.2; fain=fain(1,48:54); figure stem(Range,CnR,'Marker','none','LineWidth',3) grid axis([-2.5,2.5,-1,1]) title('實頻譜') xlabel('Hz') ylabel('CnR') figure stem(Range,CnI) grid axis([-6,6,-2,2]) title('虛頻譜') xlabel('Hz') ylabel('CnI') figure stem(Range,Cn,'Marker','none','LineWidth',3) grid axis([-2.5,2.5,-0.5,1]) title('雙邊幅頻譜') xlabel('Hz') ylabel('|Cn|') figure stem(Range(1,48:54),abs(fain),'Marker','none','LineWidth',3) grid axis([-2.5,2.5,-4,4]) title('雙邊相頻譜') xlabel('Hz') ylabel('相位角') figure fain2=fain(1,4:7); stem(Range(1,51:54),abs(fain2),'Marker','none','LineWidth',3) grid axis([-2.5,2.5,-4,4]) title('單邊相頻譜') xlabel('Hz') ylabel('相位角') figure plot(t,y) xlabel('時間(s)') ylabel('y') title('原信號圖像') grid on function[X,freq]=centeredFFT(x,Fs) N=length(x); if mod(N,2)==0 k=-N/2:N/2-1; % N even else k=-(N-1)/2:(N-1)/2; % N odd end T=N/Fs; freq=k/T; %the frequency axis accordingly X=fft(x)/N; X=fftshift(X); End
文件鏈接:https://ricardio.lanzous.com/iJDdrjoewpe (matlabxinhao1文件是本文所提到的信號,matlabxinhao2是將本文提到的信號延遲T/4之后的信號繪圖。)