matlab实现信号的变换

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);
  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值