信號處理第一篇——淺談正弦信號


在這篇博客中,我們不討論有關於正弦信號數學層面的意義,而是將理論結合工程,討論信號處理中一些要注意的事項。

圖 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')

 


免責聲明!

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



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