matlab实现信号的变换

    xiaoxiao2021-12-14  20

    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;
    转载请注明原文地址: https://ju.6miu.com/read-969157.html

    最新回复(0)