matlab實現訊號的變換

來源:互聯網
上載者:User

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;
周期卷積是線性卷積的周期拖延(可以利用前面的周期拖延函數);
圓周卷積是周期卷積去主值序列;
這樣就將三者都聯絡起來了,有了線性卷積就可以求出其他兩個卷積來。
(關於卷積,巧用矩陣會有意想不到的情況)。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.