我有一个信号,我想复制它:
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')
答案 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')
答案 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