in [DSP]

Prev: Hilbert Transform Phase
Next: What is Bit Spread?
From: firepluswater on 16 Apr 2010 01:46 Ok so, i'm confusing myself somewhere and its driving myself crazy. I have written matlab implementations of MMSE (wiener) and LMS (gradient method .. h = h(n-1) + mu*dE/dh) to minimize the following equation: ( s[n] - yhat[n] )^2 where s[n] is the original 'sent' message and yhat[n]=conv(Hhat,y[n]) where y[n] is the signal received at the transmitter (with noise/channel effects). That is, my code calculates the 'inverse channel' (Hhat) in the LS sense. Both my implementations work really well on real input / real channel systems. However, they dont work nearly as well if my input is complex (like a QAM signal) or if my channel is complex. I would say the output is correctly equalized about 40% of the time. (I am generating random length 30 complex channel filters each iteration with random 'multipath' delays). In the LMS case I know it isnt a problem with my step size..because my output after equalization isn't 'blowing up' and if I use the channel to equalize the data it sort of looks like the original sent signal s[n]. My error vector seems to behave weird though. When the equalizer first starts the error shoots up (duh!). After a couple iterations the error falls down and starts to converge, then 50-100 iterations later it will "spike-up" (never larger than the first spike) start to converge...spike up again...start to converge...and repeats this process. Most of the literature I can find only talks about LMS/MSSE in a 'channel identification' sense. That is, using the received signal y[n] to come up with a filter h[n] such that conv(h[n],s[n]) = y[n]. My code works very well if I try to 'identify the channel' (on real and complex data) but doesnt work to well if I try to calculate the 'inverse channel'. Is this because my implementations in MMSE and LMS are FIR filters and the channel i need to equalize is IIR so I lack enough taps, or is there some properties of MMSE/LMS (that I can't find) that doesnt work well in terms of equalization? Thanks FPW
From: Steve Pope on 16 Apr 2010 01:53 firepluswater <ampierce (a)n_o_s_p_a_m.gmail.com> wrote:>Ok so, i'm confusing myself somewhere and its driving myself crazy. >I have written matlab implementations of MMSE (wiener) and LMS (gradient >method .. h = h(n-1) + mu*dE/dh) to minimize the following equation: >( s[n] - yhat[n] )^2 >where s[n] is the original 'sent' message and yhat[n]=conv(Hhat,y[n]) where >y[n] is the signal received at the transmitter (with noise/channel >effects). That is, my code calculates the 'inverse channel' (Hhat) in the >LS sense. The last equation above looks backwards ... in your model you (usually) want to first convolve the transmitted signal with the linear channel, and then add receiver noise. There are exceptions to this, such as some of the response being after the receiver front end (say IF or BB filters), but generally in the baseline case you want to add the noise after the channel response. I do not know what switching the order does to your equalizer but it can't be good... the peaks in your transfer function Hhat are now amplifying the noise! Steve
From: firepluswater on 16 Apr 2010 02:02 Steve: Right, I see what your saying about my equation, and thats what i'm wondering...is my approach to the problem wrong? Essentially what I am trying to solve is: (s[n] - conv(Hhat[n],conv(s[n],H[n])+N[n]) )^2 So, I am trying to find a filter Hhat[n] that i can convolve with my received signal ( S(f)*H(f)+N(f) ) to get S[n]....Isn't this how equalization is suppose to work? or is the purpose of LMS/MMSE to give me the channel that the original signal WENT thru and not the INVERSE channel to convert my y[n] to my sent message s[n]
From: Vladimir Vassilevsky on 16 Apr 2010 09:34 firepluswater wrote: > Ok so, i'm confusing myself somewhere and its driving myself crazy. > > I have written matlab implementations of MMSE (wiener) and LMS (gradient > method .. h = h(n-1) + mu*dE/dh) to minimize the following equation: > Both my implementations work really well on real input / real channel > systems. However, they dont work nearly as well if my input is complex > (like a QAM signal) or if my channel is complex. I would say the output is > correctly equalized about 40% of the time. (I am generating random length > 30 complex channel filters each iteration with random 'multipath' delays). > Unless you put special restrictions, this will generate extremely evil channels, especially in the complex case. > My code works very > well if I try to 'identify the channel' (on real and complex data) but > doesnt work to well if I try to calculate the 'inverse channel'. Aha. It is a lot easier to become as bad as evil, then to undo the evil by good. Think of eigenvalue spread. > Is this because my implementations in MMSE and LMS are FIR filters and the > channel i need to equalize is IIR so I lack enough taps, or is there some > properties of MMSE/LMS (that I can't find) that doesnt work well in terms > of equalization? You can improve the situation by adding more taps, but this opens you for convergence problems and numerical difficulties also. Vladimir Vassilevsky DSP and Mixed Signal Design Consultant http://www.abvolt.com
From: firepluswater on 16 Apr 2010 10:24
Ah I see... I completely overlooked the eigenvalue spread. So how are these equalizers used in the real world since not all channels are 'pretty'? What kind of special restrictions can u put on the equalizer to make it more robust to any channel? From the books/papers I was looking at I was under the assumption that these methods would work for any channel... Bummer... It's never as easy as you think it is :p |