2.序列的運算

序列的運算主要包括基本的算術運算,以及對於翻轉、平移、卷積、自相關、互相關。

先說代數運算。對兩個序列做加減乘除用筆算都是一件很容易的事情,寫程序算也比較容易,關鍵是能夠將序列“對齊”:假如一個序列的下標是-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)



最後說互相關,其實跟自相關差不多,注意一下·下標即可,這裏就不多說了。

發佈了276 篇原創文章 · 獲贊 110 · 訪問量 166萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章