【 MATLAB 】序列的奇偶分解的 MATLAB 函数编写实践

举报
李锐博恩 发表于 2021/07/15 04:52:18 2021/07/15
【摘要】 序列 x(n)的奇偶分解的公式为: 编写一个序列 x(n) 的奇偶分解式 xe(n) 和 xo(n),需要考虑的问题是序列长度,下标的变化。 这里必须做个声明,下面的程序中用到了前几篇博客中的几个函数,这里给贴出来: 信号相加: function [y,n] = sigadd(x1,n1,x2,n2)% implements y(n) = x1(n) + x2...

序列 x(n)的奇偶分解的公式为:

x_e(n) = \frac{1}{2}[x(n)+x(-n)]

x_o(n) = \frac{1}{2}[x(n)-x(-n)]

编写一个序列 x(n) 的奇偶分解式 xe(n) 和 xo(n),需要考虑的问题是序列长度,下标的变化。

这里必须做个声明,下面的程序中用到了前几篇博客中的几个函数,这里给贴出来:

信号相加:


  
  1. function [y,n] = sigadd(x1,n1,x2,n2)
  2. % implements y(n) = x1(n) + x2(n)
  3. % [y,n] = sigadd(x1,n1,x2,n2)
  4. %____________________________________
  5. % y = sum sequence over n, which includes n1 and n2
  6. % x1 = first sequence over n1
  7. % x2 = second sequence over n2( n2 can be different from n1)
  8. %
  9. n = min( min(n1), min(n2) ):max( max(n1), max(n2) ); %duration of y(n)
  10. y1 = zeros(1,length(n)); y2 = y1; %initialization
  11. y1( find( ( n >= min(n1) )&( n <= max(n1) ) == 1 ) ) = x1; %x1 with duration of y1
  12. y2( find( ( n >= min(n2) )&( n <= max(n2) ) == 1 ) ) = x2; %x2 with duration of y2
  13. y = y1 + y2;

信号移位:


  
  1. function [y,n] = sigshift(x,m,k)
  2. %implements y(n) = x(n - k)
  3. %_________________________
  4. %[y,n] = sigshift(x,m,k)
  5. %
  6. n = m+k;
  7. y = x;

相关博文:【 MATLAB 】基本序列运算及其MATLAB的等效表示

单位阶跃序列:


  
  1. function [x,n]=stepseq(n0,n1,n2);
  2. % generate x(n) = u(n - n0); n1 <= n <= n2
  3. %_____________________________________________
  4. %[x,n] = stepseq(n0, n1, n2);
  5. %
  6. n = [n1:n2];
  7. x = [(n-n0) >= 0];

相关博文:【 MATLAB 】常用的离散时间序列的 Matlab 产生

下面给出函数程序:


  
  1. function [xe, xo, m] = evenodd(x, n)
  2. % Real signal decomposition into even and odd parts
  3. %__________________________________________________
  4. %[xe, xo, m] = evenodd(x, n)
  5. %
  6. if any( imag(x) )
  7. error('x is not a real sequence!');
  8. end
  9. % Ensure m of xe and xo
  10. m = - fliplr(n);
  11. m1 = min([m,n]);
  12. m2 = max([m,n]);
  13. m = m1:m2;
  14. % Ensure x over m
  15. nm = n(1) - m(1);
  16. n1 = 1:length(n);
  17. x1 = zeros(1,length(m)); % initialization
  18. x1(nm + n1) = x;
  19. x = x1; % new x which enlarge index n
  20. % xe and xo
  21. xe = 0.5*(x + fliplr(x));
  22. xo = 0.5*(x - fliplr(x));

序列和及其位置分别装入 x 和 n 数组。首先确认是否已知序列是实序列并在m数组中确定偶部和奇部分量的位置,最后将所得奇偶分量存入xe和xo数组中。

下面以一个实例来验证上述函数:

x(n) = u(n) - u(n - 10)

将x(n)分解为奇偶分量。


  
  1. clc
  2. clear
  3. close all
  4. n = 0:10;
  5. x = stepseq(0,0,10) - stepseq(10,0,10);
  6. [xe, xo, m] = evenodd(x,n);
  7. subplot(2,2,1);
  8. stem(n,x,'filled');
  9. title('Rectangular pulse');
  10. xlabel('n');ylabel('x(n)');
  11. axis([-10,10,0,1.2]);
  12. subplot(2,2,2);
  13. stem(m,xe,'filled');
  14. title('Even part');
  15. xlabel('n');ylabel('xe(n)');
  16. axis([-10,10,0,1.2]);
  17. subplot(2,2,4);
  18. stem(m,xo,'filled');
  19. title('Odd part');
  20. xlabel('n');ylabel('xo(n)');
  21. axis([-10,10,-0.6,0.6]);


事实上,这篇博文到这里已经结束了,那我还想看看序列x(n)= u(n) - u(n-10)的合成过程:


  
  1. clc
  2. clear
  3. close all
  4. [u1,n1] = stepseq(0,0,10);
  5. subplot(3,1,1)
  6. stem(n1,u1,'filled');
  7. title('u(n)');
  8. ylabel('u(n)');xlabel('n');
  9. axis([-10,10,0,1.2]);
  10. [u2,n2] = sigshift(u1,n1,10);
  11. subplot(3,1,2)
  12. stem(n2,u2,'filled');
  13. title('u(n-10)')
  14. xlabel('n');ylabel('u(n - 10)');
  15. axis([0,20,0,1.2]);
  16. [x,n] = sigadd(u1,n1,-u2,n2);
  17. subplot(3,1,3)
  18. stem(n,x,'filled');
  19. title('Rectangular sequence');
  20. xlabel('n');ylabel('x(n)= u(n) - u(n -10)');
  21. axis([-10,10,0,1.2]);

 

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/83274514

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。