信號處理第一式——離散信號序列的基本運算及MATLAB實現

離散時間信號——序列的基本運算及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
作者:草莓味的徐大力

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