1.數字訊號處理中基本的操作有產生序列(單位階躍序列,單位脈衝序列,正弦序列,指數序列等等),指數,正弦序列比較簡單,只需要簡單得公式輸入即可
單位階躍,單位脈衝序列利用邏輯數組顯得比較好懂易於理解,
如需要產生δ(n-n0):x=(n==n0),階躍序列同樣的道理
2.關於序列的一些列變化
在處理訊號的過程中,會涉及到很多訊號處理,訊號相加(相乘),訊號反轉,訊號的尺度變換,訊號的移位,訊號的迴圈移位,訊號的線性(周期/圓周)卷積等等
(1)訊號的相加(相乘):原則需要保持兩段序列的等長,即需要在某些地方補零,此時,靈活運用matlab的find函數可以大大減少代碼量
n=min(min(n1),min(n2)):max(max(n1),max(n2)); %value range of y
N=length(n); %length of y
y1=zeros(1,N);y2=y1; %initialization of y1,y2
y1(find((n>=min(n1)) & (n<=max(n1))))=x1; %add 0 in y1
y2(find((n>=min(n2)) & (n<=max(n2))))=x2; %add 0 in y2
這樣就是的序列等長,且僅僅補上零。最後便可以相加或相乘。
(2)序列的移位,序列的反轉:不改變幅度的值,只需要改變下標就行。
(3)序列的迴圈移位:不能單單改變下標值了,為了更加方便獲得一個迴圈的序列,可以利用matlab中的gallery('circul',x) 可以產生length(x)*length(x)的迴圈矩陣,
效果如,若x=[1 2 3]; 則gallery('circul',x)=[1 2 3;3 1 2;3 2 1]
代碼:(用了兩種方法)
第二種便是前面講到的gallery;第一種就是講x序列相等於再複製兩次,得到一個1*(3*length(x))的向量,然後就可以根據移位參數m得到結果:
function [y,n]=seq_XHYW(x,n1,m)
%m>0 right
%m<0 left
%% approach 1
% x1=x'*ones(1,3);
% x1=x1(:)';
%
% N=length(n1);
% m=rem(m,N);
% y=x1(N+1-m:N+N-m);
% n=n1;
%% approach 2
y=gallery('circul',x);
m=mod(m,length(n1));
y=y(m+1,:);
n=n1;
(4)序列的周期拖延: 分大於序列周期和不大於序列周期兩種情況討論(如果小於序列周期會引起重疊)
function [y,n]=seq_ZQYT(x,n1,T);
%T:the period of extension
%x:sequence
%n1:the indice of sequence
N=length(x);
if T>=N
y=[x,zeros(1,T-N)];
y=reshape(y'*ones(1,3),1,[])
n=n1(1):n1(1)+3*T-1
else
y=zeros(N,N);
for i=N:-1:1
y(i,1:i)=x(N-i+1:end);
end
x_sum=sum(y(end:-T:1,:));
y=x_sum(1:T);
y=reshape(y'*ones(1,3),1,[]);
n=n1(1):n1(1)+3*T-1;
end
(5)序列的對稱分解,任何函數(訊號)都可以分成一個奇函數和偶函數。簡單得利用公式計算即可(利用前面講到的相加原則)
function [y1,y2,n]=seq_oddeven(x1,n1)
%y1:even singal
%y2:odd signal
x2=fliplr(x1);
n2=-fliplr(n1);
n=min([n1,n2]):max([n1,n2]); %value range of y
N=length(n); %length of y
y1=zeros(1,N);y2=y1; %initialization of y1,y2
y1(find((n>=min(n1)) & (n<=max(n1))))=x1; %add 0 in y2
y2(find((n>=min(n2)) & (n<=max(n2))))=x2; %add 0 in y2
y1=0.5*(y1+y2);
y2=0.5*(y1-y2);
(6)序列的尺度變換:這個被坑了好多時間,還是沒做想明白,也不知道程式碼封裝不包含所有情況了。有更加簡單的方法的可以交流,歡迎指出錯誤!
function [y,n]=seq_scachange(x,n1,m)
% m>1 sampling
% m<1 add 0
if m>1
logi=[mod(n1,m)==0];
[num,ind]=find(logi==1);
n=n1(ind(1))/m:n1(ind(1))/m+length(num)-1;
y=x(ind);
else
n=floor(n1(1)/m):floor(n1(end)/m);
k=length(n);
for i=1:k
if mod(n(i),1/m)==0
y(i)=x(n(i)*m-min(n1)+1);
else
y(i)=0;
end
end
end
(7)關於序列卷積:
線性卷積是matlab內建函數的,conv;
周期卷積是線性卷積的周期拖延(可以利用前面的周期拖延函數);
圓周卷積是周期卷積去主值序列;
這樣就將三者都聯絡起來了,有了線性卷積就可以求出其他兩個卷積來。
(關於卷積,巧用矩陣會有意想不到的情況)。