寻找正向和零交叉的零交叉,这些都是负面的

时间:2013-05-03 19:43:28

标签: matlab signal-processing octave

我有一个信号,我想复制它:

1)从过零点开始

2)复制一定数量的点(如8000)

3)并且在复制8000点后继续追加点,直到找到零交叉下降部分。

我可以找到零交叉,但是我知道如何判断零交叉是否为正和/或零交叉为负时我有一些问题。我也很难在最后的8000分之后添加下一部分(所以问题#1 并且问题#3 以粗体显示我有问题)

注意:请记住我正在使用的信号是音频信号,所以它不如简单的等式那么好。

我已将测试代码与图像一起附加。我正在使用matlab / octave

clear all, clc, tic, clf;
n=16000
t=linspace(0,2*pi,n);
y=cos(6*t)+sin(4*t);

%find zero crossings
t1=y(1:n-1);
t2=y(2:n);
tt=t1.*t2;
indx=find(tt<0)

%1) start at first zero crossing going positive 
%2) get 8000 pts 
%3) and after the 8000 points continue appending points until a zero crossing going down section is found
new_y=y(indx(1,1):8000); %start at zero section found get 8000 pts
subplot(2,1,1);plot(y);title('Original Signal')
subplot(2,1,2);plot(new_y);title('New signal')

enter image description here

4 个答案:

答案 0 :(得分:14)

试试这个:

x = diff(sign(y));
indx_up = find(x>0);
indx_down = find(x<0);

那将为您提供过境点及其方向。在添加样本的循环中,只需测试当前点和最后一个点的x。如果它为零,继续前进。如果它是积极的,加上你的8000点并返回测试。如果它是否定的,请停止。

编辑:更正了第一个代码行中的拼写错误。

答案 1 :(得分:1)

以下是其他人有类似问题的测试代码

%zero crossing testing  (find zero upward, copy fs 4000, find next zero upward.
clear all, clc, tic, clf;
n=16000
t=linspace(0,2*pi,n);
y=cos (6*t)+sin(4*t);

find_zero = diff(sign(y));
indx_up = find(find_zero>0); %find all upward going zeros
indx_down = find(find_zero<0); %find all downward going zeros
new_y=[];

fs_range_wanted=indx_up(1,1)+4000; %starts from first zero adds sample size wanted
new_y=[y(indx_up(1,1):fs_range_wanted)]; %may have to minus 1
ii=0;
while (find_zero(1,fs_range_wanted+ii)  ~= 2);  %do while not going dwn and append 
    ii=ii+1
    y_pt_loc=fs_range_wanted+ii %what is the location of the point
    new_y = [new_y, y(1,fs_range_wanted+ii)]; %append points
end


subplot(3,1,1);plot(y);title('Original Signal')
subplot(3,1,2);plot(new_y);title('New signal')
subplot(3,1,3);plot(find_zero);title('Zeros-Pos-Neg')

enter image description here

答案 2 :(得分:0)

你可以这样做,找到“上升”或“下降”过零点:

%find zero crossings
t1=y(1:n-1);
t2=y(2:n);
tt=t1.*t2;
indx=find(tt<0)

dt        = t2-t1;
indx_up   = find( (tt<0) & (dt>0) ) 
indx_down = find( (tt<0) & (dt<0) ) 

答案 3 :(得分:0)

function[t,s]=zerocorss(x,m)
    if nargin<2
      m='b';
    end

    s=x>0;

    k=s(2:end)-s(1:end-1)

  if any(m=='p')
      f=find(k>0);
  elseif (m=='n')
      f=find(k<0);
  else
      f=find(k~=0);
  end

  s=x(f+1)-x(f);
  f=f-x(f)./s;

  if ~nargout
      n=length(x);
      subplot(2,1,1),plot(1:n,x,'x',t,zerocorss(length(x)/1),'o');
      subplot(2,1,2),stem(t,s);
  end
end