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);