一、信号处理——2.序列的运算(含Matlab代码)

(1) 序列的移位

序列右移:y(n)=x(n+k) 

序列左移:y(n)=x(n-k)

('移位函数sigshift构建——需先运行并保存')
function [y, n] = sigshift(x, m, k)
n = m + k;('左移将'm+k'修改为'm-k'即可')
y = x;
'原始序列'
n=[-5:5];
x1=impseq(0,-5,5);
stem(n,x1);title('单位脉冲序列')
xlabel('n');ylabel('x(n)');

一、信号处理——2.序列的运算(含Matlab代码)_第1张图片    

'调用保存的sigshift函数-右移'
[y,n]=sigshift(x1,n,4);
stem(n,y);
xlabel('n');ylabel('y(n) = x(n-4)');

一、信号处理——2.序列的运算(含Matlab代码)_第2张图片

一、信号处理——2.序列的运算(含Matlab代码)_第3张图片

(2) 序列的翻褶

例:以n=0为对称轴将序列翻褶

('移位函数sigfold构建——需先运行并保存')
function [y,n]=sigfold(x,n)
y=fliplr(x); 
n=-fliplr(n);
'原始序列'
n=[0:10];
x3=stepseq(0,0,10)-stepseq(5,0,10);
subplot(2,2,1);stem(n,x3);title('矩形序列');
xlabel('n');ylabel('x(n)');

一、信号处理——2.序列的运算(含Matlab代码)_第4张图片      

'调用sigfold函数翻褶'
n=[0:10];
x3=stepseq(0,0,10)-stepseq(5,0,10);
[y,n]=sigfold(x3,n);
stem(n,y);
title('序列翻褶')
xlabel('n');ylabel('x(-n)');

一、信号处理——2.序列的运算(含Matlab代码)_第5张图片

 (3) 序列求和 

x(n)=x_{1}(n)+x_{2}(n)

'加法函数'
function[f,k]=lsxj(f1,f2,k1,k2)
k=min(min(k1),min(k2)):max(max(k1),max(k2));'构造的和序列的长度'
s1=zeros(1,length(k));s2=s1;
s1(find((k>=min(k1))&(k<=max(k1))==1))=f1;'将f1中在和序列范围内但又无定义的点赋值为零'
s2(find((k>=min(k2))&(k<=max(k2))==1))=f2;'将f2中在和序列范围内但又无定义的点赋值为零'
f=s1+s2;
stem(k,f,'filled')
axis([(min(min(k1),min(k2))-1),max(max(max(k1),max(k2))+1),(min(f)-0.5),(max(f)+0.5)])
'坐标轴的显示范围'

*zeros函数:初始化新向量,空间大小与参数有关;

*find函数:找到在序列范围内有定义的点并记录。

示例离散序列分别如下: 

f_{1}[k]=\begin{Bmatrix} -2,-1,0,1,2 \end{Bmatrix}       f_{2}[k]=\begin{Bmatrix} 1,1,1 \end{Bmatrix}

'示例代码'
f1=-2:2;k1=-2:2;
f2=[1 1 1];k2=-1:1;
subplot 221;
stem(k1,f1);
xlabel('n');
ylabel('h(n)');
axis([-3 3 -2.5 2.5]);
title('f1[k]');
subplot 222
stem(k2,f2)
xlabel('n');
ylabel('h(n)');
axis([-3 3 -2.5 2.5]);
title('f2[k]');
subplot 223
[f,k]=lsxj(f1,f2,k1,k2);
xlabel('n');
ylabel('h(n)');
title('f[k]=f1[k]+f2[k]');

一、信号处理——2.序列的运算(含Matlab代码)_第6张图片

(4) 序列乘积 

f_{1}[k]\times f _{2}[k]

'乘法函数'
function[f,k]=lsxc(f1,f2,k1,k2)
k=min(min(k1),min(k2)):max(max(k1),max(k2));
s1=zeros(1,length(k));s2=s1;
s1(find((k>=min(k1))&(k<=max(k1))==1))=f1;
s2(find((k>=min(k2))&(k<=max(k2))==1))=f2;
f=s1.*s2;
stem(k,f,'filled')
axis([(min(min(k1),min(k2))-1),max(max(max(k1),max(k2))+1),(min(f)-0.5),(max(f)+0.5)])

绘制上例中两个离散序列乘法:

'示例代码'
f1=-2:2;k1=-2:2;
f2=[1 1 1];k2=-1:1;
subplot 221;
stem(k1,f1);
xlabel('n');
ylabel('h(n)');
axis([-3 3 -2.5 2.5]);
title('f1[k]');
subplot 222
stem(k2,f2)
xlabel('n');
ylabel('h(n)');
axis([-3 3 -2.5 2.5]);
title('f2[k]');
subplot 223
[f,k]=lsxc(f1,f2,k1,k2);
xlabel('n');
ylabel('h(n)');
title('f[k]=f1[k]*f2[k]');

一、信号处理——2.序列的运算(含Matlab代码)_第7张图片

参考资料:

李欣等. 《Matlab信号处理与应用》 [M]. 北京: 机械工业出版社, 2022.

———————————————————————————————————————————

仅用作学习记录~

你可能感兴趣的:(信号处理,matlab,开发语言)