Guten Abend,
ist hier zufällig jemand am Weg, der sich mit hochauflösenden Verfahren
zur Richtungsbestimmung von Signalen auskennt?
Ich versuche gerade im Rahmen meiner Masterarbeit MUSIC zu
implementieren, scheitere aber an der Signalanzahlschätzung auf Basis
der Kovarianzmatrix.
Die Situation ist folgende:
Ich habe 8 Antennen, von denen ich jeweils 100 Samples aufnehme
die ich in eine Matrix D schreibe ( Spalten : Antennen, Zeilen Samples)
Die Kovarianzmatrix schätze ich nun durch
(D^H * D ) ./ 100.
Soweit so gut. Wenn ich nun jedoch die Eigenwerte der Matrix betrachte
erhalte ich zum teil negative Eigenwerte. Das darf meienr Ansicht nach
nicht sein, da laut definition eine Kovarianzmatrix positiv semidefinit
sein sollte, oder liege ich hier falsch?
Ferner erhalte ich steets nur einen Signaleigenwert, egal wieviele
Signale ich simulativ überlagere
(Vorgehen hierzu:
mehrere Vektoren für die einzelnen WInkel aus den Referenzdaten
extrahieren, Phasenoffset erzeugen, Rauschen überlagern und additiv
überlagern.
Mache ich hier etwas fundamental falsch?
(Ja ich weiß - diese Frage ist mehr als speziell:) Aber vielleicht habe
ich ja Glückk
Sepp Obermaier schrieb:> Wenn ich nun jedoch die Eigenwerte der Matrix betrachte> erhalte ich zum teil negative Eigenwerte.
Sind deine Signale vielleicht nicht mittelwertfrei?
> Ferner erhalte ich steets nur einen Signaleigenwert, egal wieviele> Signale ich simulativ überlagere
Vielleicht sind deine Signale voll korreliert. Dein Vorgehen klingt
danach.
Danke für deine Antwort...
Ich war eigenlich der Ansicht das wenn ich die relativ Phasen der
einzelnen Signale gegeneinander verschiebe und auf jedes Sample der
Kovarianzmatrix Rauschen hinzu gebe
die Signale nicht mehr voll korreliert sind.
Sepp Obermaier schrieb:> ch war eigenlich der Ansicht das wenn ich die relativ Phasen der> einzelnen Signale gegeneinander verschiebe und auf jedes Sample der> Kovarianzmatrix Rauschen hinzu gebe> die Signale nicht mehr voll korreliert sind.
Relative Phasenverschiebung ist ja nur eine Multiplikation mit einer
komplexen Zahl exp(j*phi), also eine Skalierung. Oder bei breitbandigen
Signalen eine Verschiebung der Zeitachse entsprechend der
unterschiedlichen Laufzeiten. Reine Skalierung oder Zeitverschiebung
führt aber nicht zu einer Dekorrelation, der Korrelationskoeffizient
bleibt bei Eins. Jedenfalls solange der Antennenabstand kleiner als die
Korrelationslänge des Signals ist (wovon ich ausgehe).
Vermutlich sind also zwar deine Rauschanteile unkorreliert (abhängig
davon, wie du das Rauschen erzeugst. Auch dabei kann man sich ins Knie
schießen.), die Signalanteile sind jedoch voll korreliert und es bleibt
bei einem eindimensionalen Signalraum.
Es ist eine bekannte Eigenschaft von MUSIC, dass seine Performance bei
korrelierten Signalen in die Knie geht.
Was wäre deiner Ansicht nach eine geeignete möglichkeit unkorrelierte
Signale zu simulieren?
Von Preprocessing Verfahren wie Spatial Smoothing oder FB Averaging
wollte ich zunächst die Finger lassen
Das beschriebene Vorgehen hat bislang bei normalen Beamforming Verfahren
ganz gut funktioniert.
Das Rauschen erzeuge ich über die Add Gaussian whithe noise Funktion der
Communications Toolbox.
Ich bin auf dem Gebiet leider noch Anfänger, daher sind die fragen vllt
teils etwas unbeholfen.
Sepp Obermair schrieb:> Was wäre deiner Ansicht nach eine geeignete möglichkeit unkorrelierte> Signale zu simulieren?
Deine Simulation ist doch sicher ein Modell für irgendein Szenario, das
du untersuchen willst. Du solltest also deine Simulation an dein
Szenario anpassen und nicht die Signale so züchten, bis ein von dir
gewähltes und möglicherweise ungeeignetes Verfahren endlich
funktioniert.
Wenn deine synthetischen Signale dein Szenario gut modellieren, dann
lasse es dabei. Suche lieber nach einem DOA-Schätzer, der mit
korrelierten Quellen umgehen kann. Zielführende index terms sind "DOA
estimation" und "coherent sources". Spatial smoothing wäre natürlich
schon ein Schritt in die richtige Richtung.
richtig,
Ich versuche die Richtung von Radarzielen zu detektieren.
Hierzu habe ich simulierte Refrenzdaten meiner 2 Wege Antennendiagramme
in einem Winkelraster.
So langsam glaube ich auch meienn Fehler gefunden zu haben.
Mein Vorgehen zur Bildung der Samples ist wohl nicht korrekt:
1
function [CX] = selMeasData(Data, sn, PhaseOffset, dataWinkel)
2
3
winkel = Data(:,1);
4
5
n= ((size(Data,2)-1)/2) ; %Beamzahl bestimmen
6
for m=1:1:n; % Aus real./imag. Werten eine Komplexe Matrix basteln
7
CD(:,m) = (Data(:,m*2) + Data(:,m*2+1) * i);
8
end
9
10
posI = find(winkel==dataWinkel); %Spaltenvektor zu Winkel zuordnen
11
vektorI = CD(posI,:); %Spaltenvektor selektieren
12
13
BetragI =abs(vektorI); % In Betrag und Phase aufspalten
14
PhaseI =angle(vektorI) + PhaseOffset * (pi /180);
15
16
REAL = BetragI .* cos(PhaseI); %komplexe Zahlbasteln
17
IMAG = BetragI .* sin(PhaseI);
18
CXI = REAL + IMAG * i;
19
CX = (awgn(CXI, sn , 'measured')); % Rauschen hinzufügen)
Liegt mein Denkfehler darin, das ich die signale nicht nur zufällig
aufaddiern muss sondern sie über einen Sinus mit der Signal Freuquenz
meiner Nutzsignale sampeln muss?
Ich habe hier vor Ort leider niemanden zum Diskutieren
Sepp Obermair schrieb:> for m=1:1:n;> CD(:,m) = (Data(:,m*2) + Data(:,m*2+1) * i);> end
Solche Schleifen sind sehr ineffizient. Das gleiche müsstest du mit
1
k = [1:length(Data)];
2
CD = Data(mod(k,2)==0) + i*Data(mod(k,2)==1);
bekommen (ungetestet). Auch das ganze Zeug hier
> BetragI =abs(vektorI);> PhaseI =angle(vektorI) + PhaseOffset * (pi /180);> REAL = BetragI .* cos(PhaseI);> IMAG = BetragI .* sin(PhaseI);> CXI = REAL + IMAG * i;
ist nur eine umständliche Schreibweise von
1
CXI = vektorI .* exp(i*pi*PhaseOffset/180);
> Liegt mein Denkfehler darin, das ich die signale nicht nur zufällig> aufaddiern muss sondern sie über einen Sinus mit der Signal Freuquenz> meiner Nutzsignale sampeln muss?
Du arbeitest ja schon zeitdiskret, also mit Abtastwerten. Nochmal
samplen brauchst du nicht. Ansonsten fehlt mir jetzt auch ein bisschen
die Zeit, mich in deine Sachen reinzudenken. Was ich zum Beispiel an
deiner Kovarianzbildung nicht verstehe, ist dass du mit KVMD(i,:) zwar
eine Zeile adressierst, ihr aber dann 2 Spalten zuweist (von selMeasData
kommt doch eine Spalte zurück, oder?).
> Ich habe hier vor Ort leider niemanden zum Diskutieren
Hast du für deine Masterarbeit keinen Betreuer???
Plasmon schrieb:> Was ich zum Beispiel an> deiner Kovarianzbildung nicht verstehe, ist dass du mit KVMD(i,:) zwar> eine Zeile adressierst, ihr aber dann 2 Spalten zuweist (von selMeasData> kommt doch eine Spalte zurück, oder?).
Sehe gerade, dass da gar keine [] sind, die das zu 2 Spalten machen
würden. Aber dann verstehe ich die Zeile
ich wollte nochmal rückmeldung geben.
Ich habs mittlerweile hinbekommen.
Zunächst habe ich eine Betrachtung an einem Array isotroper strahler
vorgenommen und diese dann später auf meine Simulationsdaten übertragen.
Das Problem lag wie vermutet in der Bildung der Kovarianzmatrix.
Danke an für deine Hilfe.
Gerade befasse ich mich mit Spatail Smoothing, hierzu hatt sich bei mir
eine weitere Frage aufgetan.
Meine geglättete Kovarianzmatrix erhalte ich aus folgendem matlab Script
wobei R die Ausgangskovarianzmatrix, p die Anzahl der Sensoren pro
Untergruppe, M die Anzahl der Antennenelemente ist,
1
function Rss = spatailsmooting(R, p)
2
M=length(R);
3
%%% Wie viele Antennenspannungen habe ich?
4
Rss = zeros(M-p,M-p);
5
%%% leere Matrix der entsprechenden Dimension erzeugen
6
for i = 1:1:M-p+1
7
Rss= Rss+ R((i:1:i+p-1),(i:1:i+p-1));
8
%%% weitere Untergruppe aufaddieren
9
end
10
Rss = Rss / (M-p+1);
11
%%% Kovarainzmatrix durch Anzahl der Untergruppen teilen
Die Kovarianzmatrix hat nach dem Glätten ja die Dimension( M-p+1 x
M-p+1))
Meine Refrenzdaten jedoch die Dimension (M x theta)
Muss ich also die Refrenzdaten nach dem gleichen vorgehen glätten? Ich
habe es einmal versucht, und zwar mit folgendem Code
1
CDS =zeros(p,length(winkel));
2
3
for i = 1:1:M-p+1;
4
5
CDS= CDS + CD(i:1:i+p-1,:);
6
end
7
CDS = CDS / (M-p+1);
8
9
10
Wobei CD die Matrix der Referenzdaten in der Form (M x theta) und CDS die geglättete Matrix der Referenzdaten (M-p+1 x theta) ist.
Wende ich nun jedoch das MUSIC Verfahren auf die beiden matrizen an, so
erhalte ich ein Leistungsspektrum ohne jeden Peak...
Woran kann das liegen? Ode rmache ich etwas grundlegend falsch?
Danke und Gruß Sepp