Commit | Line | Data |
---|---|---|
1eeb62fb AIL |
1 | function [rPhaseEq, phiests] = phaseNoiseCorr(r, M, blocksize) |
2 | %% phase noise correction | |
3 | phiests = zeros(1, length(r)); | |
4 | rPhaseEq = zeros(1, length(r)); | |
5 | for l = 1:blocksize:length(r) | |
6 | block = r(l : min(l + blocksize - 1, length(r))); | |
7 | ||
8 | sum_M = sum(block .^ M); | |
5e9be3c4 AIL |
9 | %% if phase of 0 symbol is 0, use: |
10 | phi_est = angle(sum_M) / M; | |
11 | %% if phase of 0 symbol is pi/M, use: | |
12 | %% phi_est = angle(-sum_M) / M; | |
1eeb62fb AIL |
13 | |
14 | if l > 1 | |
15 | %% phase unwrapping | |
16 | phi_prev = phiests(l - 1); | |
17 | m = floor(0.5 + (phi_prev - phi_est) * M / (2 * pi)); | |
18 | phi_est = phi_est + m * 2 * pi / M; | |
19 | end | |
20 | ||
21 | phiests(l:min(l+blocksize-1, length(r))) = phi_est * ones(1, min(blocksize, length(r) - l+1)); | |
22 | ||
23 | block = block .* exp(j * -phi_est); | |
24 | rPhaseEq(l : min(l + blocksize-1, length(r))) = block; | |
25 | end | |
26 | end |