5

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

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')

在此处输入图像描述

4

4 回答 4

15

尝试这个:

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

这将为您提供交叉点及其方向。在添加样本的循环中,只需测试 x 的当前点和最后一点。如果为零,继续。如果是肯定的,加上你的 8000 分并返回测试。如果是负数,请停止。

编辑:更正了第一行代码中的错字。

于 2013-05-03T20:41:09.117 回答
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')

在此处输入图像描述

于 2013-05-04T11:43:25.413 回答
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) ) 
于 2013-05-03T20:09:51.063 回答
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
于 2016-08-13T12:47:25.187 回答