WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

ZeroCrossing eines Signals mit additiven AWGN-Rauschen

 

-Spun-
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 07.08.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.08.2013, 05:36     Titel: ZeroCrossing eines Signals mit additiven AWGN-Rauschen
  Antworten mit Zitat      
Hallo,

bin in Matlab absoluter Neuling.. auch in Signalverarbeitung nicht der Beste... aber ich habe folgendes Problem:

Zu erst habe ich die Zero-Crossings (Nullpunkt-Durchgaenge) von einem normalen Sinus bestimmt.

Nun aber moechte ich die Zero-Crossings eines Sinus mit ueberlagerten AWGN-Rauschen bestimmen.

Problem: Durch das Rauschen sind nun logischerweise viel zu viele ZeroCrossings vorhanden...

Hat einer von euch vll. ne Idee?

Hier ein Ausschnitt meines bisherigem Programms:

Code:
clear all; close all; 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]

%Timevector
tstart = 0;
tstep = 1/fs;
tend = 0.01-tstep;         %0.01 [s]
t1 = tstart:tstep:tend;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Sinusgenerator
w2 = 2*pi*fr;

sinus2 = sin(w2*t1);


%AWGN Noise
n_awgn = randn(1,length(sinus2));  %AWGN for Receiver
sinus2_awgn = sinus2 + n_awgn;     %Receiver signal with noise

subplot(212);
plot(t1,sinus2,'k');
hold on;
plot(t1,sinus2_awgn,'r');
grid on;

%ZeroCrossing
[tzcross_sinus2] = zerocros(sinus2,fs);
[tzcross_sinus2_awgn] = zerocros(sinus2_awgn,fs);

figure
plot(t1,sinus2,tzcross_sinus2,zeros(1,length(tz_cross_sinus2)))
figure
plot(t1,tzcross_sinus2_awgn)
 


mit folgender Funktion

Code:

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;
 


Waere echt super wenn ihr mir behilflich sein koennten.

Vielen Dank im voraus.

Viele Gruesse,

Spun
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 07.08.2013, 09:23     Titel: Re: ZeroCrossing eines Signals mit additiven AWGN-Rauschen
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
-Spun-
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 07.08.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.08.2013, 09:58     Titel:
  Antworten mit Zitat      
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:

close all; 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]

%Timevector
tstart = 0;
tstep = 1/fs;
tend = 0.01-tstep;         %0.01 [s]
t1 = tstart:tstep:tend;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Sinusgenerator
w2 = 2*pi*fr;

sinus2 = sin(w2*t1);


%AWGN Noise
%n_awgn = 100*randn(1,length(sinus2));  %AWGN for Receiver
n_awgn = awgn(sinus2,10,'measured')
sinus2_awgn = sinus2 + n_awgn;     %Receiver signal with noise

subplot(212);
plot(t1,sinus2,'k');
hold on;
plot(t1,sinus2_awgn,'r');
grid on;

%ZeroCrossing
[tzcross_sinus2] = zerocros(sinus2,fs);
[tzcross_sinus2_awgn] = zerocros(sinus2_awgn,fs);

figure
plot(t1,sinus2,'r')
hold on;
plot(t1,sinus2_awgn,tzcross_sinus2_awgn,zeros(1,length(tzcross_sinus2_awgn)),'o','MarkerEdgeColor', 'k')
grid on;
 
 


Code der Funktion:
Code:


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;
 
 


Vielen Dank für eure Bemühungen!!!

Sinus mit AWGN und CZs.jpg
 Beschreibung:

Download
 Dateiname:  Sinus mit AWGN und CZs.jpg
 Dateigröße:  106.98 KB
 Heruntergeladen:  1227 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
-Spun-
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 07.08.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2013, 01:41     Titel:
  Antworten mit Zitat      
keiner eine Idee? :-/
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 12.08.2013, 09:00     Titel:
  Antworten mit Zitat      
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 Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
-Spun-
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 07.08.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2013, 09:31     Titel:
  Antworten mit Zitat      
Danke fuer deinen Beitrag. Smile

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...

Vll. mit ner Fensterung oder so?
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 12.08.2013, 11:43     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
-Spun-
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 07.08.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.08.2013, 03:43     Titel:
  Antworten mit Zitat      
Vielen Dank fuer eure Hilfe!

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. Very Happy

Haette mich aber dennoch mal interessiert wie das funktioniert...

Aber nun ja.. Das ist nicht von hoher Prioritaet.

Grossen Dank!

Max!
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.