Wiener Filter : Kreuzkorrelationsmatrix aus 2 Vektoren
cound
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 06.07.2011, 12:55
Titel: Wiener Filter : Kreuzkorrelationsmatrix aus 2 Vektoren
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.
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?
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])
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)
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
tue ich aber leider nicht, das ganze ergibt eine Matrix (bzw wenn ich es "andersrum" transponiere das Skalarprodukt.
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
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:
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:
clearall;
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);
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.
cound
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 19.07.2011, 11:13
Titel:
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?
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.
Piloten....das sind doch diese Typen in den Flugzeugen oder?
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.
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.