我制作了这个程序用于平顶采样,所以我的o / p遵循方波!
t = 0:0.001:1;
m = cos(2*pi*25*t);
Vc =square(2*pi*15*t);
n = length(t);
% this for loop is where sampling is done
for i = 2:n
k = i-1;
while (Vc(i)== 1 && i<numel(Vc))
% I will be initialising y with zeros before the while loop
y = m(k)*Vc;
i =i+1;
end;
end;
我的'for'循环是否犯了错误?
答案 0 :(得分:0)
好的,我还没有收到你的回复,所以让我们继续你的原始代码。我将假设“平顶采样”意味着Zero-Order-Hold采样。这是许多处理数字信号的DSP和其他硬件中的常用技术,在时钟的每个正转换处,您可以采样该时间点存在的任何幅度。您保持该幅度直到下一个时钟周期,然后重复该过程。
您的代码有几个问题,我将在下面指出:
您没有初始化输出信号y
。事实上,在while
循环中,您将输出分配为单个变量,而不是将其放置在数组中。这样做的结果是,您只会记住您采样的最后一点,这可能不是您的意图。
关于初始化输出,虽然您不需要相对较小的信号,但建议您预先分配您要使用的任何变量(如果要一次填充它们)。
for
循环,但之后您还要更改for
循环内的while
循环迭代索引。不建议更改循环体内的for
循环索引。事实上,你的MATLAB编辑器会给你一个警告,告诉你不鼓励这种行为。由于循环索引的动态变化方式取决于您所处的时钟转换的哪个部分,我建议您改为编写while
循环。m(k)*Vc
因为Vc
已经为1才能满足while
循环。你可以一起摆脱Vc
,而只需使用m(k)
。我也冒昧地清理了一些不必要的变量,我还在你的代码中添加了注释。有了我所谈到的所有内容,这就是最终代码的样子。请注意,我已将信号截断为0.5秒,以使信号更清晰。我还提供了原始信号,时钟信号和零阶保持采样信号的图表:
%// Your code
t = 0:0.001:0.5;
m = cos(2*pi*25*t);
Vc =square(2*pi*15*t);
%// Defined n here as number of points in signal
n = numel(t);
%// Pre-allocate array
y = zeros(1,n);
%// Initialize starting of loop to 2
idx = 2;
%// Start at the first amplitude of our signal
k = 1;
%// Until we reach the end of the array...
while idx < n
%// If we see a negative value of the square, just hold
%// onto the previous amplitude until we hit a positive one
if Vc(idx) == -1
y(idx) = m(k);
idx = idx + 1; %// Go to next sample
%// Now we've hit a positive amplitude
else
k = idx - 1; %// Remember the last amplitude
%// Until we hit a negative transition...
while (Vc(idx) == 1 && idx < n)
y(idx) = m(k); %// Copy over last amplitude
idx = idx + 1; %// Go to the next sample
end
end
end
%// Plot all of our relevant signals
plot(t,m,t,Vc,t,y);
xlabel('Time');
ylabel('Amplitude');
legend('Original', 'Clock', 'ZOH Sampling');
这是我得到的情节:
作为次要说明,有更有效的方法可以做到这一点,但从您的帖子判断,您想要确定您的代码无法正常工作的原因,而不是更有效的计算ZOH采样的方法。如果他们选择提供更有效的答案,我会将此作为练习或其他StackOverflow回答者留给您。
祝你好运!答案 1 :(得分:0)
t = 0:0.001:1;
m = cos(2*pi*25*t);
Vc =square(2*pi*15*t);
n = length(t);
% this for loop is where sampling is done
for i = 2:n
end
k = i-1;
while (Vc(i)== 1 && i<numel(Vc))
% I will be initialising y with zeros before the while loop
y = m(k)*Vc;
i =i+1;
end;
this should work