【 MATLAB 】DFT的性质讨论(二)序列的循环移位及其 MATLAB 实现(频域方法)

举报
李锐博恩 发表于 2021/07/15 04:51:08 2021/07/15
【摘要】 上篇博文:【 MATLAB 】DFT的性质讨论(二)序列的循环移位及其 MATLAB 实现(时域方法) 提到了对序列x(n)做循环移位后的DFT形式为: 上篇博文已经讨论过了第一种实现循环移位的方法,通过在时域中对序列移位,之后取模运算,得到循环移位。并给出了精辟地验证。可以很放心的使用。 这篇博文呢?我们就通过序列循环移位后的DFT形式来反推序列的循环移位,并独立...

上篇博文:【 MATLAB 】DFT的性质讨论(二)序列的循环移位及其 MATLAB 实现(时域方法)

提到了对序列x(n)做循环移位后的DFT形式为:

上篇博文已经讨论过了第一种实现循环移位的方法,通过在时域中对序列移位,之后取模运算,得到循环移位。并给出了精辟地验证。可以很放心的使用。

这篇博文呢?我们就通过序列循环移位后的DFT形式来反推序列的循环移位,并独立给出函数。

这个函数的功能可就强大了。

假设移位量为m:

如果m 是一个标量,那么序列移位后就得到一个移位后的序列,这个序列是一个向量。

如果m是一个向量,向量的每一个元素都是移位量,那么得到的移位后的序列是一个矩阵。

这个矩阵的每一行都是对输入序列的循环移位,而移位值就是m中的相应元素,例如m的第一个元素为4,那么得到的y的第一行就是x循环右移4位得到的序列。

趁热打铁,我编写了一个相关的函数,并给出了验证,几经修改,结果正确,自己都把自己感动哭了。成就感就如当年考研最后一门专业课考完后把自己感动哭了的感觉一样。

知识是用来分享的,我也附出所有代码以及测试:


  
  1. function y = cirshftf(x,m,N)
  2. % Circular shift m samples in sequence x over[0:N-1](frequency domain)
  3. % ____________________________________________________________________
  4. % y = cirshftf(x,m,N)
  5. % y = output sequence containing circular shift
  6. % x = input sequence of length <= N
  7. % m = sample shift
  8. % N = size of circular buffer
  9. % Method: y(n) = idft(dft(x(n))*WN^(mk))
  10. %
  11. % If m is a scalar then y is a sequence(row vector)
  12. % If m is a vector then y is a matrix where each row is a circular shift
  13. % m and x should not be matrices
  14. %
  15. k = 0:1:N-1;
  16. x = [x,zeros(1,N - length(x))];
  17. m = m(:); %m is a column vector
  18. Nm = length(m);
  19. Xk = dft(x,N);
  20. WNmk = (exp(-j*2*pi/N).^(m*k)) ; %WNmk is a matrix with Nm * N
  21. Xk1 = zeros(Nm,N); %initialization
  22. for i = 1:Nm
  23. Xk1(i,:) = WNmk(i,:).*Xk;
  24. end
  25. y = zeros(Nm,N); % initialization
  26. for i = 1:Nm
  27. y(i,:) = idft(Xk1(i,:),N);
  28. end

注意,这个函数里面用到了dft以及idft函数,这些函数我以前的博文都给出了。

见博文:【 MATLAB 】离散傅里叶变换(DFT)以及逆变换(IDFT)的MATLAB实现

这里说一句,我的数字信号处理的MATLAB专栏,不断更新这方面的知识,有兴趣的可以关注下:数字信号处理的MATLAB实现

下面给出验证代码:


  
  1. clc
  2. clear
  3. close all
  4. n = 0:10;
  5. x = [5:-1:0,0:4];
  6. m = -5;
  7. N = 11;
  8. subplot(2,1,1);
  9. stem(n,x);
  10. title('original sequence x(n)');
  11. xlabel('n');
  12. y = cirshftf(x,m,N);
  13. subplot(2,1,2);
  14. stem(n,y);
  15. title('sequence after circular shift for m = -5');
  16. xlabel('n');


如果m是一个向量的话,假设m = [-5,3],就是对序列x(n),分别循环移位-5和3,得到的y的第一行就是循环移位-5后的序列,而第二行就是循环移位3后的序列:


  
  1. clc
  2. clear
  3. close all
  4. n = 0:10;
  5. x = [5:-1:0,0:4];
  6. m = [-5,3];
  7. N = 11;
  8. subplot(3,1,1);
  9. stem(n,x);
  10. title('original sequence x(n)');
  11. xlabel('n');
  12. y = cirshftf(x,m,N);
  13. subplot(3,1,2);
  14. stem(n,y(1,:));
  15. title('sequence after circular shift for m = -5');
  16. xlabel('n');
  17. subplot(3,1,3);
  18. stem(n,y(2,:));
  19. title('sequence after circular shift for m = 3');
  20. xlabel('n');

最后给出序列的频域循环移位性质:

 

 

 

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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