1 function [x, y] = pdm_adaptiveCMA(rx, ry)
7 %% hxx: real indices -K, ..., 0, ..., K. K = floor(taps/2)
8 %% MATLAB indices 1 1+K taps
9 %% initialize hxx, hxx[0] = 1, hxx[k] = hxx[-k] = 0
10 hxx(ceil(taps/2)) = 1;
11 hxy(ceil(taps/2)) = 1;
12 hyx(ceil(taps/2)) = 1;
13 hyy(ceil(taps/2)) = 1;
16 numSymbs = length(rx);
18 %% Check average energy of symbols
19 rx = rx / sqrt(mean(abs(rx) .^ 2));
20 ry = ry / sqrt(mean(abs(ry) .^ 2));
22 x = zeros(numSymbs, 1);
23 y = zeros(numSymbs, 1);
29 if it <= (taps - 1) / 2;
30 xp = [zeros((taps - 1) / 2 - it + 1, 1); rx(1:it + (taps - 1) / 2)];
31 yp = [zeros((taps - 1) / 2 - it + 1, 1); ry(1:it + (taps - 1) / 2)];
32 elseif it + (taps - 1) / 2 > numSymbs
33 xp = [rx(it - (taps - 1) / 2 : end); zeros(it + (taps - 1) / 2 - numSymbs, 1)];
34 yp = [ry(it - (taps - 1) / 2 : end); zeros(it + (taps - 1) / 2 - numSymbs, 1)];
36 xp = rx(it - (taps - 1) / 2 : it + (taps - 1) / 2);
37 yp = ry(it - (taps - 1) / 2 : it + (taps - 1) / 2);
40 xout = sum(hxx .* xp) + sum(hxy .* yp);
41 yout = sum(hyx .* xp) + sum(hyy .* yp);
42 ex = 1 - abs(xout) ^ 2;
43 ey = 1 - abs(yout) ^ 2;
46 convergeCount = convergeCount + 1;
50 if ~converged && convergeCount >= 10
58 hxx = hxx + mu * ex * xout * conj(xp);
59 hxy = hxy + mu * ex * xout * conj(yp);
60 hyx = hyx + mu * ey * yout * conj(xp);
61 hyy = hyy + mu * ey * yout * conj(yp);
64 if sum(abs(hxx - hyx)) < 0.01 && sum(abs(hxy - hyy)) < 0.01
65 hxx = 0.5 * (hxx + flipud(conj(hyy)));
66 hyy = conj(flipud(hxx));
67 hxy = 0.5 * (hxy - conj(flipud(hyx)));
68 hyx = -conj(flipud(hxy));