Verfasst am: 25.09.2014, 18:30
Titel: Trennen eines Rechtecksignals vom Rauschsignal
Hallo liebes Forum,
ich habe folgendes Problem:
Ich habe ein Rechtecksignal, welches durch weisses gaussches Rauschen gestört wird (additiv). Das Signal liegt als *.wav Datei vor. Aus dem Spektrum kann man erkennen, das es sich um ein 400Hz-Nutzsignal handelt. Ich soll Nutz -sowie Störsignal trennen, bin aber mit meinem Wissen am Ende. Über eine Hilfestellung würde ich mich sehr freuen.
Auch wenn es dir verboten ist das Signal anzuhängen, hast du schon mal versucht ein theoretisches Testsignal zu erzeugen, das in etwa dem Audiosignal entspricht?
Falls der Code im Bild die gezeigten figures erzeugt, kann ich dir schon mal sagen, dass die Skalierung deines Amplitudenspektrums nicht stimmt.
Schau mal dir mal hier die Funktion Betragsspektrum an. Kannst sie so eigentlich gleich übernehmen. Ich empfehle dir außerdem die Darstellung in dB.
Problem an der Überlagerung von Rechteck und einem weißen Rauschen ist ja, dass beide Signalanteile über den ganzen Frequenzbereich vorliegen. Das weiße Rauschen ohnehin und das Rechtecksignal zumindest über einer großen Bereich. Die 400Hz spiegeln ja nur die Periode des Rechtecks wieder. Aber mit einem Bandpass kommt man hier nicht wirklich weiter.
Hast du mal den SNR bestimmt? Dann kann man schon mal grob einschätzen wie weit man mit einer herkömmlichen Filterung überhaupt kommt. Evtl. ist es sogar sinnvoll neben dem Betragsspektrum ein Leistungsdichtespektrum zu erzeugen.
Ist das Rechtecksignal denn noch irgendwie moduliert? Also hat es eine schwankende Amplitude oder ändert sich das Verhältnis von Einschalt- zu Periodendauer? Und muss das in Echtzeit funktionieren?
Wenn alles nicht, solltest Du eigentlich irgendwie mit einer Kreuzkorrelation und einem selbst hergestellten ungestörtem Rechteck die Phasenlage des gestörten Rechteck-Signals herausfinden können. Wenn Du die kennst, kannst Du damit das gestörte Rechteck ungestört rekonstruieren und vom gestörten Signal abziehen.
Falls alles nicht, aber mit benötigter Echzeitfähigkeit, könntest Du die Phasenlage mit einer PLL bestimmen und so ein ungestörtes Signal konstruieren.
Beides sind aber nur Gedankenspiele - keine Ahnung, ob man das vernünftig und funktionierend umgesetzt bekommt und ob ich nicht noch nen Denk- oder Verständnisfehler drin habe...
Danke für die schnellen Antworten.
Ich habe nun mal ein Testsignal erzeugt das in etwa der Tonlage entspricht und das selbe Spektrum aufweist. Natürlich sind es nicht genau dieselben Signale.
Um die Skalierung werd ich mich nun kümmern.
Den SNR habe ich nicht bestimmt. Ich habe keine Idee wie ich das tun soll.
Ich weiss nur das es ein Rechtecksignal, überlagert mit weissem gausschen Rauschen ist. Ich vermute das es ein einfaches Rechtecksignal mit konstanter Amplitude und konstanter Periodendauer ist, da man neben dem Rauschen keine Lautstärkenschwankungen oder Frequenzschwankungen erkennen kann.
Da das Signal periodisch ist, kann man doch mit Hilfe einer Fourierreihen die relevanten Frequenzen bestimmen. Das wäre mein nächster Ansatz gewesen. Um die Kreuzkorrelation und das Leistungsdichtespektrum werde ich mich als nächstes kümmern. Diese Lösungsansätze scheinen mir auf ersten Blick sinnvoll. Da ich Anfänger bin freue ich mich über weitere Hilfen
Code:
% Signal mit Ähnlichkeit clear clc
fre=22000 [u,t] = gensig('square',1/425,10,1/fre);
signal = 0.5*u-0.25;
noise_signal = 0.2*randn(1,220001);
x = signal + noise_signal';
plot(t,x);
axis([010-1.21.2]) title('Audiosignal');
grid on;
xlabel('t'); ylabel('Amplitude');
Sollte das Testsignal tatsächlich in etwa deinem echten Signal entsprechen, dürfte der Weg über die klassische Filterung nahezu ausgeschlossen sein. Dafür ist die Leistung des Nutzsignals gegenüber der Störung einfach zu gering (SNR nur rund 14dB). Wie du hier aber sehen kannst, besteht ein Rechtecksignal eben nicht nur aus einer Frequenz sondern geht fast über den kompletten Frequenzbereich.
Auch ein adaptives Filter wird hier möglicherweise nicht die gewünschte Entstörung leisten können. Dennoch ist ein Ansatz über die (Kreuz-) Korrelation der beiden Signale sicher einen Versuch wert.
Für die Darstellung brauchst du die unten angehängte Funktion, welche ich ja auch schon in meinem ersten Post verlinkt hatte.
subplot(2,2,4);
% Amplitude in dB plot(fv,mag_dB,fv,mag_dB2,fv,mag_dB3);grid on;
axis([05000-1000]);
xlabel('Frequenz in Hz');
ylabel('Amplitude dB');
title('Betragsspektrum in dB');
legend('white gaus.','signal + noise','signal');
Die Diagramme zeigen doch einen Signal-Rauschabstand, der zwar nicht groß ist, aber immerhin vorhanden. Kann man damit mathematisch nicht die Werte bis zu einem bestimmten Pegel herrausnehmen?
Amplitudenspektrum und Leistungsdichtespektrum.png
Amplitudenspektrum und Leistungsdichtespektrum.png
Dateigröße:
829.46 KB
Heruntergeladen:
545 mal
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.