關於MATLAB的數字信號處理(一)

一、離散時間信號的時域分析

1.序列的產生

1.1產生繪製一個單位樣本序列

用到的基礎的MATLAB命令,產生長度爲N的單位樣本序列u[n]

u=[1 zeros(1,N-1)]

實現代碼

![% Program P1_1
% 產生一個單位樣本序列 
%清除前面的圖形
clf;
% 產生一個從 -1020的向量
n = -10:20;
%產生單位樣本序列
u = \[zeros(1,10) 1 zeros(1,20)\];
% 繪製單位樣本序列
stem(n,u);
xlabel('時間序號 n');ylabel('振幅');
title('單位樣本序列');
axis(\[-10 20 0 1.2\]);

運行結果
在這裏插入圖片描述

1.1.1 對上述的序列延時11個單位,並顯示

用到的MATLAB命令

延時M個樣本且長度爲N的單位樣本序列ud[n]

ud=[zeros(1,M) 1 zeros(N-M-1)]

實現代碼

% Program P1_1_1
% 產生一個延遲11個單位的單位樣本序列 
%清除前面的圖形
clf;
% 產生一個從 -1020的向量
n = -10:20;
%產生延遲11個單位的單位樣本序列
u = [zeros(1,21) 1 zeros(1,9)];
% 繪製單位樣本序列
stem(n,u);
xlabel('時間序號 n');ylabel('振幅');
title('延遲11個單位的單位樣本序列');
axis([-10 20 0 1.2]);

運行結果

在這裏插入圖片描述

1.1.2 修改程序以產生單位步長序列s[n]

MATLAB 命令產生長度爲N的單位階躍序列 s = [ones(1,N)]

實現代碼

% Program P1_1_2
% 產生一個單位步長序列 
%清除前面的圖形
clf;
% 產生一個從 -1020的向量
n = -10:20;
%產生單位步長序列
s = [zeros(1,10) 1 ones(1,20)];
% 繪製單位步長序列
stem(n,s);
xlabel('時間序號 n');ylabel('振幅');
title('單位步長序列');
axis([-10 20 0 1.2]);

運行結果

在這裏插入圖片描述

1.2產生一個復指數序列

實驗代碼

% Program P1_2
% 產生一個復指數序列
clf;
c = -(1/12)+(pi/6)*i;%可控制序列是增長或衰減
K = 2;
n = 0:40;
x = K*exp(c*n);
%分頁畫圖
subplot(2,1,1);
%畫出實部的圖像
stem(n,real(x));
xlabel('時間 n');ylabel('振幅');
title('實部');
%畫出虛部的圖像
subplot(2,1,2);
stem(n,imag(x));
xlabel('時間 n');ylabel('振幅');
title('虛部');

實驗結果

[
在這裏插入圖片描述
在這裏插入圖片描述

1.3 產生一個實指數序列

實現代碼

% Program P1_3
% 產生一個實指數序列
clf;
n = 0:35;
a = 1.2;%控制序列的增長或衰減(值小於1)
K = 0.2;%調整振幅
x = K*a.^n;
stem(n,x);
xlabel('時間序號 n');ylabel('振幅');

運行結果
在這裏插入圖片描述

1.4產生一個正弦序列和一個餘弦序列

實現代碼

% Program P1_4
% 產生一個正弦序列和一個餘弦序列
n = 0:40;	
f = 0.1;             %頻率參數			
phase = 0;       %相位			
A = 1.5;            %振幅			
arg = 2*pi*f*n - phase; 
x = A*sin(arg);
y = A*cos(arg);
clf;			        % 清除舊圖形
subplot(2,1,1)
stem(n,x);		% 繪製正弦序列
axis([0 40 -2 2]);
grid; 
title('正弦序列');
xlabel('時間序號 n');
ylabel('振幅');
subplot(2,1,2)
stem(n,y);		% 繪製餘弦序列
axis([0 40 -2 2]);
grid; 
title('餘弦序列');
xlabel('時間序號 n');
ylabel('振幅');

運行結果

在這裏插入圖片描述
在這裏插入圖片描述

1.5 對一個正弦序列進行壓縮和展寬

產生長度爲50,頻率爲0.08,振幅爲2.5,相移爲90度

實現代碼

% Program P1_4
% 產生一個正弦序列
n = 0:0.5:50;	
f = 0.08;        %頻率參數			
phase = 90;      %相位			
A = 2.5;        %振幅			
arg = 2*pi*f*n - phase; 
x = A*sin(arg);
x1 = A*sin(2*arg);%對x進行壓縮
x2 = A*sin(1/2*arg);%對x進行展寬
x3 = A*sin(-1*arg);%對x進行反轉
clf;			% 清除舊圖形
subplot(4,1,1);
stem(n,x);		% 繪製正弦序列
axis([0 40 -3 3]);
grid; 
title('正弦序列x(n)');
xlabel('時間序號 n');
ylabel('振幅');
subplot(4,1,2);
stem(n,x1);		% 繪製壓縮2倍的正弦序列
axis([0 40 -3 3]);
grid; 
title('正弦序列x(2n)');
xlabel('時間序號 n');
ylabel('振幅');
subplot(4,1,3);
stem(n,x2);		% 繪製展寬2倍的正弦序列
axis([0 40 -3 3]);
grid; 
title('正弦序列x(1/2 n)');
xlabel('時間序號 n');
ylabel('振幅');
subplot(4,1,4);
stem(n,x3);		% 繪製反轉的正弦序列
axis([0 40 -3 3]);
grid; 
title('正弦序列x(-n)');
xlabel('時間序號 n');
ylabel('振幅');

實驗結果

在這裏插入圖片描述

1.6產生一個長度爲100的隨機信號,該信號在區間[-2,2]上均勻分佈

實現代碼:

%programer p1_5
%產生一個長度爲100的隨機信號,該信號在區間[-2,2]上均勻分佈
clf;
y=4*rand(1,100)-2;    %[-2,2]上用隨機函數rand()產生
plot(y);

運行結果

在這裏插入圖片描述

1.7產生一個顯示長度爲75的高斯隨機信號,該信號正態分佈且均值爲0,方差爲3.

實現代碼

%programer p1_5_1
%產生一個顯示長度爲75的高斯隨機信號,該信號正態分佈且均值爲0,方差爲3.
%randn(1,N)函數可以產生長度爲N,
%且具有零均值和單位方差的正態分佈隨機信號
%控制(方差)variance的話,在randn後面乘以一個sqrt(開平方根)
%括號裏面就是你的需要的varaince
y1=sqrt(3)*randn(1,75);
plot(y1);

運行結果

在這裏插入圖片描述

1.8 產生並顯示五個長度爲31的隨機正弦信號。

X[n]=Acos(ω0n+ϕ) X[n]=A*cos(ω_0 n+ϕ)

其中振幅A和相位ϕ是統計獨立的隨機變量,振幅在區間0≤A≤4內均勻分佈,相位在0≤ ϕ ≤2π內均勻分佈

實現代碼:

%programer p1_5_2

%編寫一個MATLAB程序,以產生並顯示五個長度爲31的隨機正弦信號。
%                  {X[n]}={A*cos(ω_0 n+ϕ)}
%其中振幅A和相位ϕ是統計獨立的隨機變量,振幅在區間0≤A≤4內均勻分佈,
%相位在0≤ ϕ ≤2π內均勻分佈
clf;
w0=2*pi*10;
for k=1:5
   %幅度A
    A=4*rand(1,31);
   %相位phy
    phy=2*pi*rand(1,31);
   %正弦信號
    x=A.*cos(w0*[1:31]+phy);
    %分頁作圖
    subplot(5,1,k);
    plot(x);
end

運行結果
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

2.序列的簡單運算

通常處理算法由加法、標量乘法、時間反轉、延時或乘積運算等基本運算組合而成

2.1信號平滑

數字信號處理的一個常見例子就是從被加性噪聲污染的信號中移除噪聲。假定信號s[n]被噪聲的d[n]所污染,得到了一個含有噪聲的信號x[n]=s[n]+d[n]。我們的目的是對x[n]進行運算,產生一個合理逼近s[n]的信號yn]。因此,對時刻n的樣本附近的一些樣本求平均,產生輸出信號是一種簡單有效的方法。

例如,採用三點滑動平均算法(常用的還有五點、十點平均)的表達式如下
y[n]=1/3(x[n1]+x[n]+x[n+1]) y[n]=1/3(x[n-1]+x[n]+x[n+1])
加性噪聲一般指熱噪聲、散彈噪聲等,它們與信號的關係是相加,不管有沒有信號,噪聲都存在。

與它存在的另一種噪聲爲乘性噪聲

乘性噪聲一般由信道不理想引起,它們與信號的關係是相乘,信號在它在,信號不在它就消失。信道特性隨機變化引起的噪聲,它主要表現在無線電通信傳輸信道中,例如,電離層和對流層的隨機變化引起信號不反應任何消息含義的隨機變化,而構成對信號的干擾。這類噪聲只有在信號出現在上述信道中才表現出來,它不會主動對信號形成干擾,因此稱之爲乘性噪聲。

實現代碼

% Program P1_6
% 通過平均的信號平滑
clf;
R = 51;
d = 0.8*(rand(R,1) - 0.5); % 產生隨機噪聲
m = 0:R-1;
s = 2*m.*(0.9.^m); % 產生未污染的信號
x = s + d'; % 產生被噪聲污染的信號
subplot(2,1,1);
plot(m,d','r-',m,s,'g--',m,x,'b-.');
xlabel('時間序號 n');ylabel('振幅');
legend('d[n] ','s[n] ','x[n] ');%添加圖例
%三點滑動平均法
x1 = [0 0 x];x2 = [0 x 0];x3 = [x 0 0];
y = (x1 + x2 + x3)/3;
subplot(2,1,2);
plot(m,y(2:R+1),'r-',m,s,'g--');
legend( 'y[n] ','s[n] ');
xlabel('時間序號 n');ylabel('振幅');

運行結果

在這裏插入圖片描述
在這裏插入圖片描述
嘗試五點平均,並觀測對比效果
y[n]=1/5(x[n2]+x[n1]+x[n]+x[n+1]+x[n+2]) y[n]=1/5(x[n-2]+x[n-1]+x[n]+x[n+1]+x[n+2])
實現代碼:

% Program P1_6
% 通過平均的信號平滑
clf;
R = 51;
d = 0.8*(rand(R,1) - 0.5); % 產生隨機噪聲
m = 0:R-1;
s = 2*m.*(0.9.^m); % 產生未污染的信號
x = s + d'; % 產生被噪聲污染的信號
subplot(3,1,1);
plot(m,d','r-',m,s,'g--',m,x,'b-.');
xlabel('時間序號 n');ylabel('振幅');
legend('d[n] ','s[n] ','x[n] ');%添加圖例
%三點滑動平均法
x1 = [0 0 x];x2 = [0 x 0];x3 = [x 0 0];
y = (x1 + x2 + x3)/3;
subplot(3,1,2);
plot(m,y(2:R+1),'r-',m,s,'g--');
legend( 'y[n] ','s[n] ');
xlabel('時間序號 n');ylabel('振幅');
%嘗試五點平均滑動
x1 = [x 0 0 0 0];x2 = [0 x 0 0 0];x3 = [0 0 x 0 0];x4 = [0 0 0 x 0];x5 = [0 0 0 0 x];
y1 = (x1 + x2 + x3 + x4 +x5)/5;
subplot(3,1,3);
plot(m,y1(2:R+1),'r-',m,s,'g--');
legend( 'y[n] ','s[n] ');
xlabel('時間序號 n');ylabel('振幅');

運行結果

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

對比發現效果最好的是三點滑動平均算法

注意:在語句x=s+**d’**中,若把它改爲x=s+d。則出現錯誤,隨機數就並沒有加到對應的原始信號上,因爲維度不對

2.2複雜信號的產生

更復雜的信號可通過在簡單信號上執行基本的運算來產生

例如:振幅信號可用低頻調製信號
XL=cos(wLn) X_L=cos(w_L n)
來調製高頻正弦信號
XH[n]=cos(wLn) X_H[n]=cos(w_L n)
得到的信號y(n)爲
y(n)=A(1+mXL[n])XH(n) y(n) =A(1+m·X_L [n])X_H (n)

=A(1+mcos(wLn))cos(wLn) =A(1+m·cos(w_L n))cos(w_L n)

其中m爲調製指數,用來確保1+m·X_L [n]在所有可能的n的情況下m都是正數。

振幅調製:振幅調製(AM)調製信號m(t)疊加直流後再與載波相乘,則輸出的信號就是常規雙邊帶調幅(AM)信號。

AM信號的頻譜是由載頻分量和上、下兩個邊帶組成(通常稱頻譜中畫斜線的部分爲上邊帶,不畫斜線的部分爲下邊帶)。上邊帶的頻譜與原調製信號的頻譜結構相同,下邊帶是上邊帶的鏡像。顯然,無論是上邊帶還是下邊帶,都含有原調製信號的完整信息。故AM信號是帶有載波的雙邊帶信號,它的帶寬爲基帶信號帶寬的兩倍。

實現代碼:

% Program P1_7
% 產生一個振幅調製信號
clf;
n = 0:100;	
m = 0.4;
fH = 0.1; %載波頻率
fL = 0.01;%調製頻率				
xH = sin(2*pi*fH*n); %載波信號
xL = sin(2*pi*fL*n);%調製信號
y = (1+m*xL).*xH;%振幅調製信號
stem(n,y);grid;
xlabel('時間序號 n');ylabel('振幅');

運行結果:

在這裏插入圖片描述

3.其他類型的信號

3.1方波和鋸齒波信號

實現代碼:

% Program P1_8
% 產生一個方波序列和鋸齒波序列
clf;
n = 0:30;
m =0:0.5:50;
A=2.5;
y = A*square(n);%產生方波信號
y1= A*sawtooth(m);%產生鋸齒波信號
subplot(2,1,1);
stem(n,y);
axis([0 30 -3 3]);
grid;
title('方波序列');
xlabel('時間序號 n');ylabel('振幅');
subplot(2,1,2);
stem(m,y1);
axis([0 50 -2.5 2.5]);
grid;
title('鋸齒波序列');
xlabel('時間序號 n');ylabel('振幅');

運行結果
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章