function[t,s]=zerocros(x,fs)
%ZEROCROS finds the zeros crossings in a signal [T,S]=(X,M)% find zero crossings in a signal
%Inputs: x = input waveform
% fs = sampling rate of the input waveform (x)
%
%
% Outputs: t = sample positions of zero crossings (not necessarily integers) % s = estimated slope of x at the zero crossing
%
% This routine uses linear interpolation to estimate the position of a zero crossing % A zero crossing occurs between x(n) and x(n+1) iff (x(n)>=0) ~= (x(n+1)>=0)
s=x>=0;
k=s(2:end)-s(1:end-1);
f=find(k~=0);
s=x(f+1)-x(f);
o=f-x(f)./s; %Zeitvektor
t = o./fs;
Verfasst am: 07.08.2013, 09:23
Titel: Re: ZeroCrossing eines Signals mit additiven AWGN-Rauschen
Hallo -Spun-,
Neben meiner üblichen Warnung vor "clear all" (das löscht auch alle Breakpoints des Debuggers, und alles, was den Debugger behindert, ist ein Feind des Programmierers!), habe ich eine Rückfrage:
Natürlich bekommt man durch ein Rauschen mehr Null-Durchgänge. Dies läßt sich aber nicht einfach verhindern, was ja der Natur des Rauschens entspricht. Du könntest das Rauschen verkleinern, in dem Du die nicht zum Nutz-Signal gehörenden Frequenzanteile herausfilterst. Dazu muss man aber den Unterschied zwischen Rauschen und Nutzsignal genau kennen und beide Teile sollten möglich weit von einander entfernt sein. In realen Signalen ist das aber nie der Fall.
Deshalb ist es auch bei sehr guter Filterung möglich, dass der Null-Durchgang nicht eindeutig ist. Nun kommt es darauf an, was man eigentlich genau sucht. Wenn man z.B. 10 Millionen Perioden einer verrauschten Sinuskurve hat, ist es relativ einfach die Frequenz zu ermitteln und so die Null-Durchgänge des Nutz-Signal sehr genau finden zu können. Wenn es aber um Signale mit mehreren zeitlich veränderlichen Frequenzen geht, benötigt man eine ganz andere Strategie.
Was suchst Du also genau?
Gruß, Jan
Zuletzt bearbeitet von Jan S am 07.08.2013, 14:42, insgesamt einmal bearbeitet
Mein Problem ist nun, das ich logischerweise aufgrund des Rauschens an den eigentlichen ZeroCrossings mehrere Druchgaenge habe (siehe Bild). Dass das nicht zu verhindern ist, ist klar.
Auch in meinem Fall, hat der Receiver kein Referenzsignal, um dort mittels z.B. adaptiven Filtern etwas anzustellen...
Was ich gern haette, waere der Weg zu einer Annaeherung...
Denn dort wo viele Nullstellen nebeneinander liegen, muss ja ungefaehr in Mitte die eigentliche Nullstelle liegen.
Stichwort: Mittelwertbildung
Nun reichen aber nicht meine Kenntnisse aus, um das zu programmieren...
Ich muesse ja abschnittsweise ueberpruefen, an welchem Ort sich viele Nullstellen haeufen und dann daraus den Mittelwert zu bilden um so eine hoffentlich ausreichende Annaeherung zu bekommen.
Aber wie mache ich das? Könntet ihr mir da bitte behilflich sein?
Hier nochmals mein Code, da sich im oberen Code einige Fehler noch versteckt hatten:
Code:
closeall; clc;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Notional variables
c = 340; %speed of sound[m/s]
fr = 510; %Received frequency [Hz]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Sinusgenerator: Transmitter
ft = 500; %Transmitter frequency [Hz]
w1 = 2*pi*ft; %Radial frequency [s^-1]
fs = 48000; %Sampling frequency [Hz]
function[t,s]=zerocros(x,fs)
%ZEROCROS finds the zeros crossings in a signal [T,S]=(X,M)% find zero crossings in a signal
%Inputs: x = input waveform
% fs = sampling rate of the input waveform (x)
%
%
% Outputs: t = sample positions of zero crossings (not necessarily integers) % s = estimated slope of x at the zero crossing
%
% This routine uses linear interpolation to estimate the position of a zero crossing % A zero crossing occurs between x(n) and x(n+1) iff (x(n)>=0) ~= (x(n+1)>=0)
s=x>=0;
k=s(2:end)-s(1:end-1);
f=find(k~=0);
s=x(f+1)-x(f);
o=f-x(f)./s; %Zeitvektor
t = o./fs;
Wie wäre es, wenn du das Signal erst mit einem Tiefpass filterst, bevor du die Nulldurchgänge ermittelst. Das sollte die Aufgabe deutlich einfacher machen
Aber selbst nach dem Tiefpass-Filter ware das Problem doch immer noch das Gleiche oder?
Dann haette ich zwar ein paar weniger Spitzen und vll. ein paar weniger nebeneinanderliegende Nullstellen... Aber dennoch sind noch immer ein paar zu viele Nullstellen vorhanden, und staende dennoch vor dem gleichen Problem, dass ich den Durchschnitt abschnittsweise irgendwie ausrechnen muesste...
Es kommt auf das Filter drauf an und ob Nutz- und Störsignal im Frequenzbereich weit genug auseinander liegen. Man kann durchaus so filtern, dass die Störung eliminiert wird. Das setzt aber Kenntnisse über das Frequenzspektrums von Nutz- und Störsignal voraus. Hier heißt das Stichwort FFT. Aber darauf wies Jan ja schon hin. Wenn dein Nutzsignal immer nur eine Frequenz enthält, sollte das aber kein Problem sein. Dann könnte man sogar mit einem Notch Filter arbeiten (sehr enger Bandpass oder Bandsperre), der nur das Nutzsignal durchlässt/sperrt.
Um dir gezielter helfen zu können, sind weitere Infos über dein Nutzsignal aber unabdingbar.
Oder man macht die Fiterung über die FFT, in dem man damit vom Nutzsignal Amplitude, Frequenz und Phase bestimmt und dieses dann daraus im Zeitbereich wieder selber erstellt.
Hab nun doch mal das Signal mit einem Bandpass gefiltert. Und nun mit einer Filterordnung von nur 4 bzw. 8 tatsaechlich ein nahezu perfektes Signal.
Nun besteht das Problem mit dem mitteln der ZeroCrossings gar nicht mehr.
Haette mich aber dennoch mal interessiert wie das funktioniert...
Aber nun ja.. Das ist nicht von hoher Prioritaet.
Grossen Dank!
Max!
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.