| 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); |
| 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; |
| 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 |