这个平顶采样程序有什么问题?

时间:2014-09-19 20:45:50

标签: matlab

我制作了这个程序用于平顶采样,所以我的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'循环是否犯了错误?

2 个答案:

答案 0 :(得分:0)

好的,我还没有收到你的回复,所以让我们继续你的原始代码。我将假设“平顶采样”意味着Zero-Order-Hold采样。这是许多处理数字信号的DSP和其他硬件中的常用技术,在时钟的每个正转换处,您可以采样该时间点存在的任何幅度。您保持该幅度直到下一个时钟周期,然后重复该过程。

您的代码有几个问题,我将在下面指出:

  1. 您没有初始化输出信号y。事实上,在while循环中,您将输出分配为单个变量,而不是将其放置在数组中。这样做的结果是,您只会记住您采样的最后一点,这可能不是您的意图。

    关于初始化输出,虽然您不需要相对较小的信号,但建议您预先分配您要使用的任何变量(如果要一次填充它们)。

  2. 您正在编写for循环,但之后您还要更改for循环内的while循环迭代索引。不建议更改循环体内的for循环索引。事实上,你的MATLAB编辑器会给你一个警告,告诉你不鼓励这种行为。由于循环索引的动态变化方式取决于您所处的时钟转换的哪个部分,我建议您改为编写while循环。
  3. 您没有处理时钟周期处于负转换时发生的情况。如果是这种情况,那么您需要使用正转换的幅度并继续迭代。一旦达到正转换,然后刷新当前幅度,然后保持这一直到下一个正转换。
  4. 您不需要执行m(k)*Vc因为Vc已经为1才能满足while循环。你可以一起摆脱Vc,而只需使用m(k)
  5. 我也冒昧地清理了一些不必要的变量,我还在你的代码中添加了注释。有了我所谈到的所有内容,这就是最终代码的样子。请注意,我已将信号截断为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');
    

    这是我得到的情节:

    enter image description here


    作为次要说明,有更有效的方法可以做到这一点,但从您的帖子判断,您想要确定您的代码无法正常工作的原因,而不是更有效的计算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