在這篇博客中,我們不討論有關於正弦信號數學層面的意義,而是將理論結合工程,討論信號處理中一些要注意的事項。
圖 1
上圖是一個用matlab生成的頻率為10Hz的正弦信號,需要注意的是,matlab生成的正弦信號,本質是一組離散有限長度的周期信號。實際上,我們任何的一個數字信號系統(比如雷達系統),所得到的信號都是離散的,持續時間有限的信號。
我們對上述信號新型FFT處理,得到:
圖 2
在上述頻譜圖中,出現了兩個峰值,可以看到第一個峰在10Hz左右的位置,這與信號的頻率一致。還有一個峰出現在190Hz左右的位置。這是什么呢?按道理而言,正弦信號的確有兩個峰。但是是關於零頻(0Hz)對稱的。也就是說另一個峰應該出現在頻率等於-10Hz的地方。原因在於,FFT之后,得到是數組,顯然,數組的索引代表了頻率值,然而索引值顯然是從1開始的,因此無法表示負頻率。因此只能把-10Hz的頻率成分放在最后,變成201-10Hz=190Hz。這也就是為什么我們在190Hz的地方看到峰的原因。使用fftshift函數,則可以得到我們想要的結果:
圖 3
上圖中,兩個峰值分別出現在10Hz和-10Hz的位置,出現在正確的位置。
圖 4
對比圖3和圖4,可以看出,模擬信號的采樣率提升了,則在采樣周期相同的情況下,采樣點數更多了,那么其對應的頻率分辨率就更高。
圖5
增加FFT點數,並不能提高頻譜分辨率,但是可以細化頻譜,圖5中,可以較為清楚的看到頻域信號的sinc函數的形狀。
幅度失真后果
頻率失真的結果
頻率偏移的運行結果:
可見頻率失真對於頻譜的影響是非常大的。
代碼:
%% 正弦信號頻譜分析,matlab代碼 clear close all clc %% signal A=1; %幅度 f=10; %頻率 w=2*pi*f; % p=0; %相位 %采樣 T=1; %s %觀測時間 fs=20*f; %Hz %采樣頻率 d=1/fs; %s %采樣間隔 t0=-T/2:d:T/2; %離散時間t s1=A*sin(w*t0+p); %正弦信號 figure(1) plot(t0,s1); xlabel('時間/s'); ylabel('幅度'); %% FFT %FFT (這里會多一個鏡像信號,但是位置不對) NFFT = length(t0); FFTres = fft(s1,NFFT); FFTAmu = abs(FFTres); n = 0:NFFT-1; ft0=n*fs/NFFT; %頻率序列 figure(2) plot(ft0,FFTAmu) xlabel('頻率/Hz'); ylabel('幅度'); title('信號頻率f=10Hz,傅里葉變換點數NFFT=N'); %% 采用fftshift將對稱干擾信號搬移到正確位置。 FFTres = fftshift(fft(s1,NFFT)); FFTAmu = abs(FFTres); ft=(-NFFT/2:NFFT/2-1)*fs/NFFT; %頻率序列 figure(3) plot(ft,FFTAmu) title('采樣頻率fs=200Hz,傅里葉變換點數NFFT=N') xlabel('頻率/Hz'); ylabel('幅度'); %% 改變采樣頻率,看結果會怎么樣 fs=5*f; %Hz %采樣頻率,10倍信號頻率 T=1; %s %觀測時間,信號長度 %采樣間隔 d=1/fs; %s %采樣間隔 t1=-T/2:d:T/2; %離散時間t s1=A*sin(w*t1+p); %正弦信號 NFFT1 = length(t1); FFTres = fftshift(fft(s1,NFFT1)); FFTAmu = abs(FFTres); ft1=(-NFFT1/2:NFFT1/2-1)*fs/NFFT1; %頻率序列 figure(4) plot(ft1,FFTAmu) % 結果表明采樣頻率降低之后,信號頻譜分辨率會降低 %從另外一個角度講, title('采樣頻率fs=50Hz,信號時長T=1S') xlabel('頻率/Hz'); ylabel('幅度'); %% 改變傅里葉變換的點數 fs=20*f; %Hz %采樣頻率,10倍信號頻率 T=1; %s %觀測時間,信號長度 %采樣間隔 d=1/fs; %s %采樣間隔 t1=-T/2:d:T/2; %離散時間t s1=A*sin(w*t1+p); %正弦信號 NFFT = 8*length(t1); FFTres = fftshift(fft(s1,NFFT)); FFTAmu = abs(FFTres); ft=(-NFFT/2:NFFT/2-1)*fs/NFFT; %頻率序列 figure(5) plot(ft,FFTAmu) % 結果表明采樣頻率降低之后,信號頻譜分辨率會降低 %從另外一個角度講, title('采樣頻率fs=200Hz,傅里葉變換點數NFFT = 4*N') xlabel('頻率/Hz'); ylabel('幅度'); %% 改變信號持續周期 fs=5*f; %Hz %采樣頻率,10倍信號頻率 T=4; %s %觀測時間,信號長度 %采樣間隔 d=1/fs; %s %采樣間隔 t2=-T/2:d:T/2; %離散時間t s1=A*sin(w*t2+p); %正弦信號 NFFT = length(t2); FFTres = fftshift(fft(s1,NFFT)); FFTAmu = abs(FFTres); ft=(-NFFT/2:NFFT/2-1)*fs/NFFT; %頻率序列 figure(6) plot(ft,FFTAmu) title('采樣頻率fs=50Hz,信號時長T=4S') xlabel('頻率/Hz'); ylabel('幅度'); %% 假設信號的初始相位不為0,會發生什么? A=1; %幅度 f=10; %頻率 w=2*pi*f; % p=pi/3; %相位 %采樣 T=1; %s %觀測時間 fs=20*f; %Hz %采樣頻率 d=1/fs; %s %采樣間隔 t0=-T/2:d:T/2; %離散時間t s1=A*sin(w*t0+p); %正弦信號 NFFT = length(t0); FFTres = fftshift(fft(s1,NFFT)); FFTAmu = abs(FFTres); ft=(-NFFT/2:NFFT/2-1)*fs/NFFT; %頻率序列 figure(7) plot(ft,FFTAmu) title('采樣頻率fs=20f,信號觀測時長T =1s,初始相位p=pi/3') %% 假設信號的幅度有失真,會發生什么? f=10; %頻率 w=2*pi*f; % p=0; %相位 %采樣 T=1; %s %觀測時間 fs=20*f; %Hz %采樣頻率 d=1/fs; %s %采樣間隔 t0=-T/2:d:T/2; %離散時間t NFFT = length(t0); % 隨機生成幅度值 pd = makedist('Normal',1,0.2) % Normal(mu,sigma) pdt = truncate(pd,0.5,1.5) % truncated to interval (0,1) numRows = 1; numCols = NFFT; A = random(pdt,numRows,numCols); % Sample from distribution `pdt` s1=A.*sin(w*t0+p); %正弦信號 figure(8) plot(t0,s1); xlabel('時間/s'); ylabel('幅度'); FFTres = fftshift(fft(s1,NFFT)); FFTAmu = abs(FFTres); ft=(-NFFT/2:NFFT/2-1)*fs/NFFT; %頻率序列 figure(9) plot(ft,FFTAmu) title('采樣頻率fs=20f,信號觀測時長T =1s') %% %% 假設信號的頻率有失真,會發生什么? A=1; %幅度 p=0; %相位 %采樣 T=1; %s %觀測時間 fs=20*10; %Hz %采樣頻率 d=1/fs; %s %采樣間隔 t0=-T/2:d:T/2; %離散時間t NFFT = length(t0); % 隨機生成幅度值 pd = makedist('Normal',10,0.5); % Normal(mu,sigma) pdt = truncate(pd,9,11) ; % truncated to interval (0,1) numRows = 1; numCols = NFFT; f= random(pdt,numRows,numCols); % Sample from distribution `pdt` w=2*pi.*f; % s1=A.*sin(w.*t0+p); %正弦信號 figure(10) plot(t0,s1); xlabel('時間/s'); ylabel('幅度'); FFTres = fftshift(fft(s1,NFFT)); FFTAmu = abs(FFTres); ft=(-NFFT/2:NFFT/2-1)*fs/NFFT; %頻率序列 figure(11) plot(ft,FFTAmu) title('采樣頻率fs=20f,信號觀測時長T =1s') %% 處理接收兩路的回波信號 A=1; %幅度 f1=10; %頻率 f2=25; w1=2*pi*f1; w2=2*pi*f2; p=0; %采樣 T=1/10; %s %觀測時間 fs=20*f2; %Hz %采樣頻率 d=1/fs; %s %采樣間隔 t0=-T/2:d:T/2; %離散時間t s1=A*sin(w1*t0+p)+A*sin(w2*t0+p); %正弦信號 figure(10) plot(t0,s1); FFTres = fftshift(fft(s1,NFFT)); FFTAmu = abs(FFTres); ft=(-NFFT/2:NFFT/2-1)*fs/NFFT; %頻率序列 figure(12) plot(ft,FFTAmu) title('采樣頻率fs=20f,信號觀測時長T =1s')