離散時間信號——序列的基本運算及matlab實現
文章目錄
前言
本篇文章主要介紹數字信號處理內容中的離散信號序列的基本運算,如:序列相加、序列相乘、倍率、移位、摺疊、樣本和等內容及matlab代碼的實現。
提示:以下是本篇文章正文內容,下面MATLAB已親測有效
一、什麼是離散時間信號?
1、離散時間信號
信號可分爲模擬信號和數字信號。模擬信號可表示爲x(t),表示連續時間,,例如生活中的聲音信號。而數字信號可以用x(n)來表示,代表時間的離散時刻,因此也稱爲離散時間信號,它的表示方法是一個有序的數字序列。
離散時間信號:時間爲離散變量,幅度爲連續變化的變量。
2、數字信號處理系統
數字信號處理系統基本由以下部分組成:前端模擬信號接收裝置、抗混疊濾波、A/D轉換裝置、數字信號處理模塊(DSP)、D/A轉換裝置、平滑濾波組成。
二、序列的基本運算
1.序列相加
序列相加是一個對應樣本與樣本之間的相加。
自定義sigadd函數演示運算:
function [y,n] = sigadd(x1,n1,x2,n2)
%實現序列相加
% 實現y(n)=x1(n)+x2(n)
% [y,n ]=sigadd(x1 ,n1,x2,n2)
n = min(min(n1),min(n2)):max(max(n1),max(n2));
y1 = zeros(1,length(n));
y2=y1;
y1 (find( (n>=min (n1) ) & (n<=max (n1) )==1) )=x1 ;
y2 (find( (n>=min (n2) ) & (n<=max (n2) )==1) )=x2 ;
y=y1+y2;
end
調用該函數
n1=[0 1 2 3];
x1=[1 2 3 4];
n2=[2 3 4 5];
x2=[1 2 3 4];
subplot(131);
stem(n1,x1);
axis([-1 5,0 5]);
title('x1序列');
subplot(132);
stem(n2,x2);
axis([-1 6,0 5]);
title('x2序列');
[y,n]=sigadd(x1,n1,x2,n2);
subplot(133);
stem(n,y);
axis([-1 6,0 8]);
title('相加後序列');
結果是正確的
2.序列相乘
序列相乘是對應採樣點之間的相乘(點乘)
自定義sigmuti函數演示運算:
function [y,n] = sigmuti(x1,n1,x2,n2)
% 實現y(n)=x1(n)*x2(n)
% [y,n ]=sigmuti(x1 ,n1,x2,n2)
n = min(min(n1),min(n2)):max(max(n1),max(n2));
y1 = zeros(1,length(n));
y2=y1;
y1 (find( (n>=min (n1) ) & (n<=max (n1) )==1) )=x1 ;
y2 (find( (n>=min (n2) ) & (n<=max (n2) )==1) )=x2 ;
y=y1.*y2;
end
調用該函數
n1=[0 1 2 3];
x1=[1 2 3 4];
n2=[2 3 4 5];
x2=[1 2 3 4];
subplot(131);
stem(n1,x1);
axis([-1 5,0 5]);
title('x1序列');
subplot(132);
stem(n2,x2);
axis([-1 6,0 5]);
title('x2序列');
[y,n]=sigmuti(x1,n1,x2,n2);
subplot(133);
stem(n,y);
axis([-1 6,0 10]);
title('相乘後序列');
結果圖
3、序列倍率
這個運算很簡單,每一個採樣值都乘以倍數a就可以了。
自定義sigdouble函數演示運算:
function [y,n] = sigdouble(x1,n1,a)
%sigdouble 序列倍率
% 在此運算中,
% 每個採樣值乘以一個常數a。
% a{
x(n)}= {
ax(n)}
% 在MATLAB中可用算術運算符“*”來實現倍率運算。
n=n1;
y=a*x1;
end
調用運行
n1=[0 1 2 3];
x1=[1 2 3 4];
a=3; %倍率
[y,n]=sigdouble(x1,n1,a);
subplot(121);
stem(n1,x1);
axis([-1 5,0 5]);
title('x1序列');
subplot(122);
stem(n,y);
axis([-1 5,0 13]);
title('倍率後序列');
結果圖
4、序列移位
通過移位運算,每個採樣值都向右移動k個單位(k正爲右,負爲左)。
移位後:y(n)={x(n-k)}
自定義sigfold函數演示運算:
function [y,n] = sigshift(x,m,n0)
%實現y(n)=x(n-n0)
%移位--在此運算中,x (n)的每一個樣本都移動n0個週期,移位後的序列y (n)如下。
n=m+n0;
y=x;
end
調用運行:
n1=[0 1 2 3];
x1=[1 2 3 4];
a=-3; %向左平移3個單位
[y,n]=sigshift(x1,n1,a);
subplot(121);
stem(n1,x1);
axis([-4 4,0 5]);
title('x1序列');
subplot(122);
stem(n,y);
axis([-4 4,0 5]);
title('移位後序列');
結果圖:
5、序列摺疊
通過摺疊運算,使得采樣值每個樣本按照n=0翻轉
自定義sigfold函數演示運行:
function [y,n] = sigfold(x,n0)
%序列摺疊運算
%在此運算中,x (n)的每個樣本都對n= o翻轉,得到一個摺疊後的序列y(n)
%y(n)={
x(-n)}
y=fliplr(x);
n=-max(n0):-min(n0);
end
調用運行:
n1=[0 1 2 3];
x1=[1 2 3 4];
[y,n]=sigfold(x1,n1);
subplot(121);
stem(n1,x1);
axis([-4 4,0 5]);
title('x1序列');
subplot(122);
stem(n,y);
axis([-4 4,0 5]);
title('摺疊後序列');
結果圖:
總結
至此,序列的基本運算就介紹完了。往後我會持續更新信號處理的其他內容,歡迎志同道合的同仁批評指正,一起探討經驗。
QQ:2395277840
作者:草莓味的徐大力