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

Wiener Filter : Kreuzkorrelationsmatrix aus 2 Vektoren

 

cound

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.07.2011, 12:55     Titel: Wiener Filter : Kreuzkorrelationsmatrix aus 2 Vektoren
  Antworten mit Zitat      
Hallo,

das Problem das ich habe bezieht sich auf die Lösung der Wiener-Hopf Gleichung zur Kanalschätzung in OFDM-basierten Funksystemen.

es gilt die Gleichung y=B*x zu lösen, wobei

yest=schätzung der gesendeten Werte (Bits)
x= empfangene Werte
B= Schätzmatrix mit den Koeffizienten die den fehler zwischen ytrans und yest minimieren
B ist also gesucht,x und y sind bekannt (y:Pilotsymbole, x:verrauschte Piloten)


Durch ein paar Umformungen kann man die Gleichung auf die Form

B=Ryx*Rxx^(-1) bringen wobei

Rxx die Autokorrelationsmatrix von x ist und
Ryx die Kreuzkorrelation zwischen y und x.

Rxx lässt sich einfacvh erzeugen mit


Code:

xx= corrmtx(x,m-1);
Rxx=xx'*xx;
 


(m ist hier 10, die länge des datenverktors y bzw x)

das problem an dem ich verzweifle ist wie ich nun aus den vektoren x und y die Kreuzkorrelationsmatrix zur Lösung der Gleichung erzeuge.

mit
Code:


gibt mit Matlab nur die KK-Sequenz in Form eines Vektors. Wie kann ich diesen nun in die passende Matrix Überführen?
Oder hab ich bei der ganzen Geschichte grundsätzlich einen Denkfehler drin?

thx,

cound[/math]


DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 06.07.2011, 13:26     Titel:
  Antworten mit Zitat      
Wenn du nur Vektoren für die Auto- und Kreuzkorrelation benutzt, erhältst du wieder nur einen Vektor als Ergebnis (mit der Länge m+n-1, wobei x[m] und y[n]) Wink

Du meinst mit Matrix wohl folgendes...

Code:

% Autokorrelationsmatrix R
% R = E{X[k] * X[k]'}
R = toeplitz(X);

%Kreuzkorrelationsvektor p
[rXY,lags] = xcorr(X,Y,'option'); % option z.B. coeff oder biased, kann auch weggelassen werden
p = rXY(1:N)';

% Wiener Lösung -> optimaler Gewichtsvektor
w0 = R^(-1) * p;
% N = die Länge des Eingangsignals (= n = m)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
cound

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.07.2011, 23:52     Titel:
  Antworten mit Zitat      
also erstellst du die Autokorrelationsmatrix mit

Code:


Die Toeplitzmatrix des Vektors x entspricht also der AKmatrix von x??die weicht nämlich von der AKmatrix ab die ich mit
Code:

xx= corrmtx(x,n-1);
Rxx=xx'*xx;
 


erhalte.

zur Kreuzkorrelation:
du bildest also die Kreuzkorrelation der beiden Vektoren und schneidest alles was über die Länge des Eingangssignalvektors hinausgeht ab, richtig?
Und in deinem Codebeispiel gibt mir Matlab einen Dimensionsfehler, ich vermute das p nicht transponiert werden muss für die Matrix-Vektor Multiplikation, als Zeilenvektor kann es ja nicht funktionieren.

Nachdem der Koeffizientenvektor w0 berechnet wurde sollte ich doch eigentlich durch multiplikation von w0 mit den empfangenen Daten wieder das Eingangssignal erhalten,also
Code:

ytrans=w0*x'
 



tue ich aber leider nicht, das ganze ergibt eine Matrix (bzw wenn ich es "andersrum" transponiere das Skalarprodukt. Smile

Bin auch noch ziemlich neu in der ganzen Thematik, deswegen die Frage ob mein Verständnis der ganzen Sache richtig ist:
Der Filter bestimmt aus dem (verrauschten) empfangenen Signal durch Korrelation mit sich selbst und durch die Kreuzkorrelation mit den gesendeten Daten (der bekannten Trainingssequenz) seine benötigten Koeffizienten so dass der Fehler zwischen gesendeten und empfangenen Daten möglichst klein wird, wodurch dann eine Schätzung des Kanals vorliegt, richtig?

Zuguterletzt nochmal ein (minimal)Beispiel meines Codes


Code:

SNR=15;
n=10;
ytrans= randint(n,1); %pseudo-random trainingssequenz

%empfangenes signal, awgn kanal
x= awgn(ytrans,SNR);

%Korrelationen
%R = toeplitz(x);
xx= corrmtx(x,n-1);
Rxx=xx'*xx;

[rYX,lags] = xcorr(ytrans,x);
p = rYX(1:n);
w0 = Rxx^(-1) * p
 


Das wäre dann so korrekt?

Sorry, hatte nicht geplant das das so lang wird aber ich hoffe es ist klar geworden wo mein(e) problem(e) liegen... Smile
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 07.07.2011, 16:32     Titel:
  Antworten mit Zitat      
Ich habe etwas den Eindruck, dass dir bei den Grundlagen noch das ein oder andere unklar ist. Zunächst einmal legen wir mal dein ytrans Signal als unser d[n] Signal, d = desired = erwünscht. Dieses Signal überlagerst du ja additiv mit einem weißen Rauschen, was dein Signal x[n] = d[n] + stör[n] ergibt.

Der Fehler des Filters ergibt sich aus: e[n] = d[n] - y[n]

y[n] = w0 * x[n] wobei * = Faltung bedeutet und nicht Multiplikation
Matlabbefehl:
Code:


Die Wiener Lösung bietet dir nun den minimalen mittleren quadratischen Fehler (MMSE) an, also die optimale Lösung für das kleinstmögliche e[n]. Wie gut dabei nachher das Störsignal aus x[n] gefiltert wird, hängt aber einzig und allein von der Korrelation der beiden Signale d[n] und stör[n] ab. Das Optimum wäre eine Unkorreliertheit (= 0). Da das aber eher selten gegeben ist, wird auch nie das gewünschte Signal mit dem Filter erreicht.


Code:

clear all;
 SNR=15;
 n=20;
 % Nutzsignal = erwünschtes Signal d[n]
 d = randint(n,1); %pseudo-random trainingssequenz

 % empfangenes signal, awgn kanal
 % Nutz- und Störsignal x[n] = d[n] + stör[n]
 % Störung ist weißes Rauschen
 x = awgn(d,SNR);

 % Autokorrelationsmatrix
 R = toeplitz(x);
 [xx,Rxx]= corrmtx(x,n-1);
 % Rxx ^= xx' * xx;
 
 [VX,lambdaX] = eig(R);
 % ist R positiv definit?
 test = Rxx .* lambdaX;
 
 % Kreuzkorrelationsvektor p berechnen
 [rXD,lags] = xcorr(x,d,'biased');
p = rXD(1:n);
 
 figure(1)
 stem(lags,rXD);title('Kreuzkorrelation rXD') ;
 
 
 % Wiener Lösung -> optimaler Gewichtsvektor im Sinne des MMSE
 w0 = R^(-1) * p;
 w02 = Rxx^(-1) * p;
 
 % Filterung: Faltung des Eingangssignals mit dem Gewichtsvektor(= FIR - Filterkoeffizienten)  
 y_wiener = conv(x,w02);
 %y_wiener2 = conv(x,w0);
 
 % Ausgabe
 t=0:1:n-1;
 figure(2)
 plot(t,d,'b.-',t,x,'r.-',t,y_wiener(n:(2*n)-1),'g.-');
 legend('Nutzsignal','Nutz- und Störsignal','Wiener Lösung')
 pause
 close all;
 


Was die Funktion toeplitz() betrifft, scheint das wohl doch falsch zu sein. Ich habe mich damit schon länger nicht mehr beschäftigt und leider einige Sachen vergessen. Die Autokorrelationsmatrix hat jedoch Toeplitz Struktur, weshalb mir die Funktion in diesem Zusammanhang einfiel. Ob das hier jetzt so alles richtig ist, kann ich auch nicht sagen. Das Ergebnis ist ja nicht gerade berauschend. Ich habe aber ein Buch dazu (mit Matlab Bsp), dass ich allerdings hier nicht zur Hand habe. Ich werde da aber am WE mal reinschauen und sonst die Änderungen posten.
Private Nachricht senden Benutzer-Profile anzeigen
 
cound

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.07.2011, 11:13     Titel:
  Antworten mit Zitat      
hi,

danke erstmal für deine/eure Hilfe, mein Verständnis zu dem ganzen Themanbereich ist schon wesentlich ebsser geworden. Hab mir mittlerweile eingiges angelesen zu dem Thema, hier und da gibts allerdings immer noch Ungereimtheiten.

was ich vorhabe ist für ein ofdm-system die Kanalschätzung mittels eines Wiener Filters zu implementieren.
Die Schätzung der Koeffizienten des Wiener Filters habe ich mittlerweile hinbekommen - was mir nun unklar ist ist die Frage was denn nun diese Koeffizienten genau repräsentieren?
Ich sende ein Signal d[n], empfange x[n] =d[n]+stör[n].
D.h. d[n] geht über den Kanal (Faltung mit der Impulsantwort), wird dort mit Rauschen "beaufschlagt" und kommt an meinem Filtereingang als x[n] an.
Nun berechne ich durch Ausnutzung der statistischen Eigenschaften des Signals mittels Auto-/Kreuzkorrelation die optimalen Koeffizienten des Filters - repräsentieren diese Koeffizienten denn jetzt nun die Impulsantwort des Kanals oder die des Filters oder sonstwas, irgendwie steh ich da auf dem Schlauch? In diverser Literatur hab ich nämlich gelesen das mit dem Koeffizientenvektor nun die Bestimmung der Kanalimpulsantwort möglich wäre.

Das weitere Vorgehen wäre dann so geplant, das für jedes Pilotsymbol das ich sende die Kanalschätzung durchführe und dann jeweils zwischen 2 Piloten die Werte der optimalen Koeffizientenvektoren des Filters interpoliere (für die Subcarrier die zwischen den Piloten liegen) und somit an diesen Stellen auf basis der Schätzung der Piloten eine Schätzung für die restlichen Subcarrier erhalte.
Ist das in die richtige Richtung gedacht?
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 19.07.2011, 12:35     Titel:
  Antworten mit Zitat      
Ich hatte hier noch weiter gebastelt, es dann aber nicht mehr gepostet, da ich noch einen Fehler bei der Berechung von Jmin (= minimaler MSE) habe. Da von deiner Seite kein Feedback mehr kam, habe ich mich dann auch nicht mehr weiter damit beschäftigt. Für das Ergebnis ist dieser Fehler jedoch irrelevant. Jmin (= J(w0) wobei J die Fehlerfunktion ist) ist lediglich ein Maß für die Güte der Filterung.

Um deine Frage bzgl. der Koeffizienten w0 zu beantworten...das ist die Impulsantwort des Filters. Es handelt sich hierbei um ein FIR Filter, dessen Koeff. eben durch die Wiener-Hopf Gleichung berechnet werden. Wenn du dir nun Figur 2 ansiehst, wird dort das Fehlersignal e[n] dargestellt. w0 ist jetzt so berechnet worden, dass e[n] minimal bei dem gegebenem Stör- und Nutzsignal ist (in Bezug der Korrelation der beiden Signale). Oder im mathem. Sinn: Jmin = J(w0) = min J(w). Die Fehlerfunktion J(w) wird minimiert, wobei der MSE nämlich nur von dem Gewichtsvektor w abhängt. Bei w0 = Wiener Lösung stellt sich somit Jmin ein.

Bei der zweiten Frage kann ich dir nicht helfen...ich habe keine Ahnung von Nachrichtentechnik und weiß auch nicht, was ein Pilot ist.

Code:

%clear all;
 SNR=15;
 n = 40;
 adaptionschritte = 1;
 
 % für Sinus Testsignal
 Ta = 1/1000;
 f = 50;                 % 5 Hz
 omega = 2*pi*f ;        % Sinus von 5Hz ==> 5 Schwingungen im   Messfenster
 t = 0:Ta:((n-1)*Ta) ;

 %d = cos(omega*t)' ;
 % Nutzsignal = erwünschtes Signal d[n]
 d = randint(n,1); %pseudo-random trainingssequenz

 % empfangenes signal, awgn kanal
 % Nutz- und Störsignal x[n] = d[n] + stör[n]
 % Störung ist weißes Rauschen
 x = awgn(d,SNR,1);
 temp = x;

 for i=1:adaptionschritte
     %Autokorrelationsmatrix
     % Rxx ^= xx' * xx = E{x[n] * x[n]'};
     [xx,Rxx]= corrmtx(x,n-1);


     %[VX,lambDaX] = eig(R);
     %ist R positiv definit?
     %test = Rxx .* lambDaX;

     % Kreuzkorrelationsvektor p berechnen
     [rDX,lags] = xcorr(d,x,'biased');

     figure(1)
     stem(lags,rDX);title('Kreuzkorrelation rDX') ;
     p = rDX(1:n);

     % Wiener Lösung -> optimaler Gewichtsvektor im Sinne des MMSE
     w0 = Rxx^(-1) * p;

     % Filterung: Faltung des Eingangssignals mit dem Gewichtsvektor(= FIR - Filterkoeffizienten)  
     y_wiener = conv(d,w0);
     x=y_wiener(n:2*n-1);
 end
 
 % Fehler der Schätzung
 e = d - y_wiener(n:2*n-1);
 rEE = cov(e.^2);
 J_w0 = rEE(1)
 
 % Berechnung des minimalen mean-square-errors(MMSE) Jmin
 % Varianz von d[n]
 var_d = var(d)
 cDD = cov(d);
 cdd_0 = cDD(1)
 
 % Achtung: ist wohl nicht korrekt!
 %Jmin = var_d - (p'* Rxx^(-1) * p)
 Jmin = var_d - p'* w0
 
 x = temp;
 % Ausgabe
 t=0:1:n-1;
 t2=0:1:(2*n)-2;
 figure(2)
 subplot(211)
 plot(t,d,'b.-',t,x,'r*-',t,y_wiener(n:2*n-1),'g.-');
 grid on
 legend('Nutzsignal','Nutz- und Störsignal','Wiener Lösung')
 subplot(212)
 plot(t,e,'r','LineWidth',2)
 grid on
 title('Fehler e[n] = d[n] - y[n]')
 pause
 close all;
 
Private Nachricht senden Benutzer-Profile anzeigen
 
cound

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.07.2011, 13:44     Titel:
  Antworten mit Zitat      
Piloten....das sind doch diese Typen in den Flugzeugen oder? Laughing



Ein Pilot ist im Prinzip einfach nur die bekannte Trainingssequenz. Ein OFDM Symbol besteht ja aus mehreren Unterträgern (z.B bei LTE:im Abstand 15 Khz), in bestimmten Abstand werden nun sogenannte Pilotsymbole gesendet, die dem Empfänger bekannt sind und somit zur Kanalschätzung herangezogen werden können. Piloten weisen im allgemeinen auch eine höhere Leistung auf als die zur Datenübertragung genutzten Subcarrier und sind mit einem robusten Modulationsverfahren moduliert (z.B Q-PSK).

Die Idee war nun folgende: da ich ja für die Subcarrier zwischen den Piloten die Kanalschätzung mit dem Wiener Filter nicht durchführen kann, da die gesendeten daten (im Gegensazu zu den Piloten) unbekannt sind, interpoliere ich zwischen 2 aufeinanderfolgenden Piloten (dazwischen bei LTE 5 bzw. 6 Subcarrier, je nachdem welches Cyclic Prefix verwendet wurde) und habe so für jeden Subcarrier den Koeffizientenvektor des Filters an die sich (langsam) ändernden Kanalbedingungen angepasst.
Zum Schluss dann wieder Faltung des auf dem Subcarrier empfangenen Signals und korrespondierendem interpoliertem Koeff.vektor --> Schätzung des gesendeten Signals....

Kann mir irgendjemand sagen ob das in sich schlüssig ist oder ob ich irgendwo was übersehen hab?


Ach und noch kurz was off-topic:
bin noch auf der suche nach guter Literatur und hab eigentlich überall gelesen das mit Abstand beste Werk für Einsteiger ist "Understanding digital signal processing" von Richard G. Lyons. Jemand Erfahrungen damit gemacht? Ist (wie alle Bücher aus der Sparte) nicht ganz billig und
ich will keinen Schnell-Schuss Kauf tätigen den ich dann bereue...
Bei der Interpolierung würd ich jetzt erstmal mit linear starten, wobe es da sicher auch noch Optimierungen gibt.
 
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 - 2025 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.