序列的運算主要包括基本的算術運算,以及對於翻轉、平移、卷積、自相關、互相關。
先說代數運算。對兩個序列做加減乘除用筆算都是一件很容易的事情,寫程序算也比較容易,關鍵是能夠將序列“對齊”:假如一個序列的下標是-3~4;另一個是1~5。那麼就得把它們長度補的一樣長,並且覆蓋二者的範圍,然後再進行運算。下面是對應的matlab程序:
function [ xe1,xe2,n ] = dataAlign( xn1,n1,xn2,n2 )
n = min(min(n1),min(n2)):max(max(n1),max(n2));
xe1 = zeros(1,length(n));
xe2 = zeros(1,length(n));
for i = 1:length(n1)
if (n1(i)>=min(n) && n1(i)<=max(n))
for j = 1:length(n)
if n1(i) == n(j)
xe1(j) = xn1(i);
end
end
end
end
for i = 1:length(n2)
if (n2(i)>=min(n) && n2(i)<=max(n))
for j = 1:length(n)
if n2(i) == n(j)
xe2(j) = xn2(i);
end
end
end
end
end
它的做法也沒有什麼高超的技巧,就是按照人解決問題的思路:首先獲取兩個序列的最大值和最小值,組成新的範圍,並將該範圍的數據初始化爲0.然後遍歷第一個序列的下標,當這個下標也存在於新的範圍中時,對新的範圍對應的數賦值。
然後介紹序列的平移。其實很簡單,序列的值不變,平移序列的下標即可:
x1n = [1:4];
n1 = [-4:-1];
figure;
stem(n1,x1n);
x1nShift = x1n;
n1Shift = n1+2;%%向左平移2個點
figure;
stem(n1Shift,x1nShift);
x1(n)平移後變成了x1(n+2)。如圖所示:
下面介紹翻轉。matlab提供了fliplr函數來對輸入的向量或者矩陣左右翻轉。我們在使用時,需要注意對於序列值的翻轉和下標的翻轉是不同的。比如對於下標[-1,0,1,2]做關於0的翻轉x(n)變爲x(-n),那麼下標變成了[-2,-1,0,1]。對應的函數值也要翻轉:
x1n = [1:4];
n1 = [-4:-1];
subplot(2,1,1);
stem(n1,x1n)
x1nFlip = fliplr(x1n);
nFlip = -fliplr(n1);
subplot(2,1,2);
stem(nFlip,x1nFlip);
下面介紹線性卷積。matlab也有自帶的卷積函數conv。但是它的輸入是兩個序列,並不帶下標(即他認爲下標都是從0開始的)。這也能夠滿足一般的情況,但是如果兩個序列的下標不是從0開始的,就要稍微麻煩一些了,假設x1(n)的下標是從0~5,x2的下標是-3~3,那麼它們卷積後的長度是6+7-1=12.由於x(n)*y(n)與x(n-l)*y(n-m)相比,只是有一個l+m的偏移,所以我們可以利用conv計算兩個序列的卷積,然後自己計算下標即可,計算方法爲x1的起始+x2的起始=卷積結果的起始,x1的結束+x2的結束=卷積結果的結束。
x1n = [1:4];
n1 = [-4:-1];
subplot(2,1,1);
stem(n1,x1n);
x2n = ones(1,5);
n2 = [1:5];
y = conv(x1n,x2n);
nyStart = -4+1;
nyEnd = -1+5;
subplot(2,1,2);
stem(nyStart:nyEnd,y);
計算結果如圖,這裏稍微提一句,這相當於對原信號進行均值濾波,使得它的變化不在那麼劇烈。
下面是計算自相關。matlab也有函數xcorr來實現自相關。但是它與卷積一樣,默認下標都是從0開始的,爲了調用它,我們也得自己計算下標。對於長度爲m的序列,下標位置爲-(m-1):(m-1)。其實根據卷積與自相關的關係,也可以通過卷積計算相關:
x1n = ones(1,4);
n1 = [1:4];
res = xcorr(x1n);
len = length(x1n);
nStart = ((len-1)*(-1));
nEnd = (len-1);
nRes = nStart:nEnd;
subplot(2,1,1);
stem(nRes,res);
x2n = fliplr(x1n);
n2 = -fliplr(n1);
res2 = conv(x1n,x2n);
nRes2 = n1(1)+n2(1): n1(end)+n2(end);
subplot(2,1,2);
stem(nRes2,res2)
最後說互相關,其實跟自相關差不多,注意一下·下標即可,這裏就不多說了。