• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

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

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

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

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

假设移位量为m:

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

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

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

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

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

function y = cirshftf(x,m,N)
% Circular shift m samples in sequence x over[0:N-1](frequency domain)
% ____________________________________________________________________
% y = cirshftf(x,m,N)
% y = output sequence containing circular shift
% x = input sequence of length <= N
% m = sample shift
% N = size of circular buffer
% Method: y(n) = idft(dft(x(n))*WN^(mk))
% 
% If m is a scalar then y is a sequence(row vector)
% If m is a vector then y is a matrix where each row is a circular shift 
% m and x should not be matrices
% 
k = 0:1:N-1;
x = [x,zeros(1,N - length(x))];
m = m(:); %m is a column vector
Nm = length(m);
Xk = dft(x,N);
WNmk = (exp(-j*2*pi/N).^(m*k)) ; %WNmk is a matrix with Nm * N
Xk1 = zeros(Nm,N); %initialization
for i = 1:Nm
    Xk1(i,:) = WNmk(i,:).*Xk;
end
y = zeros(Nm,N); % initialization

for i = 1:Nm
    y(i,:) = idft(Xk1(i,:),N);
end


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

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

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

下面给出验证代码:

clc
clear
close all
 
 
n = 0:10;
x = [5:-1:0,0:4];
m = -5;
N = 11;

subplot(2,1,1);
stem(n,x);
title('original sequence  x(n)');
xlabel('n');

y = cirshftf(x,m,N);
subplot(2,1,2);
stem(n,y);
title('sequence after circular shift for m = -5');
xlabel('n');



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

clc
clear
close all
 
 
n = 0:10;
x = [5:-1:0,0:4];
m = [-5,3];
N = 11;

subplot(3,1,1);
stem(n,x);
title('original sequence  x(n)');
xlabel('n');

y = cirshftf(x,m,N);
subplot(3,1,2);
stem(n,y(1,:));
title('sequence after circular shift for m = -5');
xlabel('n');

subplot(3,1,3);
stem(n,y(2,:));
title('sequence after circular shift for m = 3');
xlabel('n');


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

 

 

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Matlab模糊控制的模糊曲面构成怎么看?发布时间:2022-07-18
下一篇:
均值滤波去除图像噪声的matlab程序发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap