0001 function ...
0002 [dataUtc, shortI_A, shortI_B, shortL_A, shortL_B, ...
0003 longI_A, longI_B, longI_B_min, longI_B_max, longL_A, longL_B] = ...
0004 flagRFI_eval(d,preFlag)
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032 nClip = 5;
0033
0034
0035 subLength_A = 25;
0036 subLength_B = 2 * subLength_A;
0037
0038 subStdLength = 250;
0039
0040
0041 subLength2_A = 250;
0042 subLength2_B = 4 * subLength2_A;
0043
0044
0045
0046
0047
0048
0049
0050
0051 dataUtc = d.antenna0.receiver.utc;
0052
0053
0054 d = noiseRemove(d);
0055
0056
0057 dLength = length(d.antenna0.receiver.data);
0058
0059
0060
0061 nSub_B = dLength / subLength_B;
0062 nSubR_B = floor(nSub_B);
0063 nSubR_A = nSubR_B * subLength_B / subLength_A;
0064
0065
0066 nSub2_B = dLength / subLength2_B;
0067 nSubR2_B = floor(nSub2_B);
0068 nSubR2_A = nSubR2_B * subLength2_B / subLength2_A;
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078 sLength_A = 2 ^ ceil(log2(nSubR_A + 2 * 10 * subStdLength));
0079 sBuffStart_A = floor((sLength_A - nSubR_A) / 2);
0080 sBuffEnd_A = ceil((sLength_A - nSubR_A) / 2);
0081
0082 sLength_B = 2 ^ ceil(log2(nSubR_B + 2 * 10 * subStdLength));
0083 sBuffStart_B = floor((sLength_B - nSubR_B) / 2);
0084 sBuffEnd_B = ceil((sLength_B - nSubR_B) / 2);
0085
0086
0087
0088 xKernel_A = (1:sLength_A)' - 1;
0089 gaussKernelStd_A = ...
0090 (exp(-0.5*(xKernel_A / subStdLength).^2) + ...
0091 exp(-0.5*((sLength_A - xKernel_A) / subStdLength).^2)) / ...
0092 (subStdLength*sqrt(2*pi));
0093
0094 xKernel_B = (1:sLength_B)' - 1;
0095 gaussKernelStd_B = ...
0096 (exp(-0.5*(xKernel_B / subStdLength).^2) + ...
0097 exp(-0.5*((sLength_B - xKernel_B) / subStdLength).^2)) / ...
0098 (subStdLength*sqrt(2*pi));
0099
0100
0101 xStd_A = (1:nSubR_A);
0102 xStd_B = (1:nSubR_B);
0103
0104
0105
0106
0107 dataStdNorm_A = zeros(nSubR_A,6);
0108 dataStdNorm_B = zeros(nSubR_B,6);
0109
0110 dataStdVec2_A = zeros(nSubR2_A,6);
0111 dataStdVec2_B = zeros(nSubR2_B,6);
0112
0113
0114
0115
0116 dataRStart = floor((dLength - nSubR_B * subLength_B) / 2) + 1;
0117 dataREnd = dataRStart + nSubR_B * subLength_B - 1;
0118
0119 dataR2Start = floor((dLength - nSubR2_B * subLength2_B) / 2) + 1;
0120 dataR2End = dataR2Start + nSubR2_B * subLength2_B - 1;
0121
0122
0123
0124 preFlagR = max(reshape(preFlag(dataRStart:dataREnd),subLength_B,nSubR_B));
0125
0126
0127
0128
0129
0130 for k=1:6
0131
0132
0133 dataStdVec_A = std(reshape(d.antenna0.receiver.data(dataRStart:dataREnd,k), subLength_A, nSubR_A));
0134 dataStdVec_B = std(reshape(d.antenna0.receiver.data(dataRStart:dataREnd,k), subLength_B, nSubR_B));
0135
0136
0137 if nSub_B > nSubR_B
0138 dataStdVec_A(1) = ...
0139 std(d.antenna0.receiver.data(1:dataRStart+subLength_A-1,k));
0140 dataStdVec_A(end) = ...
0141 std(d.antenna0.receiver.data(dataREnd-subLength_A+1:end,k));
0142
0143 dataStdVec_B(1) = ...
0144 std(d.antenna0.receiver.data(1:dataRStart+subLength_B-1,k));
0145 dataStdVec_B(end) = ...
0146 std(d.antenna0.receiver.data(dataREnd-subLength_B+1:end,k));
0147 end
0148
0149
0150
0151
0152
0153
0154
0155
0156 flagVec_A = stdClip(dataStdVec_A,3,nClip,1);
0157 flagVec_B = stdClip(dataStdVec_B,3,nClip,1);
0158
0159
0160
0161
0162
0163
0164 flagVec_A_t = repmat(preFlagR == 1,floor(subLength_B/subLength_A),1);
0165 flagVec_A = smooth((flagVec_A == 1) | flagVec_A_t(:)',40)' > 0;
0166 flagVec_B = smooth((flagVec_B == 1) | (preFlagR == 1),20)' > 0;
0167
0168
0169
0170 runningMed_A = ...
0171 padSmooth(xStd_A,dataStdVec_A,gaussKernelStd_A,flagVec_A, ...
0172 [sLength_A sBuffStart_A sBuffEnd_A]);
0173 runningMed_B = ...
0174 padSmooth(xStd_B,dataStdVec_B,gaussKernelStd_B,flagVec_B, ...
0175 [sLength_B sBuffStart_B sBuffEnd_B]);
0176
0177
0178
0179
0180
0181 dataStdVec_A = dataStdVec_A - runningMed_A';
0182 dataStdVec_B = dataStdVec_B - runningMed_B';
0183
0184
0185
0186 flagVec_A = stdClip(dataStdVec_A,5,nClip,0);
0187 flagVec_B = stdClip(dataStdVec_B,5,nClip,0);
0188
0189
0190
0191
0192 dataStdNorm_A(:,k) = dataStdVec_A / std(dataStdVec_A(flagVec_A == 0));
0193 dataStdNorm_B(:,k) = dataStdVec_B / std(dataStdVec_B(flagVec_B == 0));
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203 runningMedLong = ...
0204 interp1(((1:length(runningMed_A))' - 0.5) * subLength_A, ...
0205 runningMed_A,(1:dLength),'pchip');
0206
0207
0208
0209 dataStdVec2_A(:,k) = ...
0210 std(detrend(reshape(d.antenna0.receiver.data(dataR2Start:dataR2End,k) ./ ...
0211 runningMedLong(dataR2Start:dataR2End)', ...
0212 subLength2_A, nSubR2_A)));
0213
0214 dataStdVec2_B(:,k) = ...
0215 std(detrend(reshape(d.antenna0.receiver.data(dataR2Start:dataR2End,k) ./ ...
0216 runningMedLong(dataR2Start:dataR2End)', ...
0217 subLength2_B, nSubR2_B)));
0218
0219
0220
0221 flagStdVec2_A = stdClip(dataStdVec2_A(:,k),1,nClip,1);
0222 flagStdVec2_B = stdClip(dataStdVec2_B(:,k),1,nClip,1);
0223
0224 dataStdVec2_A(:,k) = dataStdVec2_A(:,k) - ...
0225 mean(dataStdVec2_A(flagStdVec2_A == 0,k));
0226 dataStdVec2_B(:,k) = dataStdVec2_B(:,k) - ...
0227 mean(dataStdVec2_B(flagStdVec2_B == 0,k));
0228
0229
0230
0231 if nSub2_B > nSubR2_B
0232
0233 dataStdVec2_A(1) = ...
0234 std(detrend(d.antenna0.receiver.data(1:dataR2Start+subLength2_A-1,k) ./ ...
0235 runningMedLong(1:dataR2Start+subLength2_A-1)')) - 1;
0236 dataStdVec2_A(end) = ...
0237 std(detrend(d.antenna0.receiver.data(dataR2End-subLength2_A+1:end,k) ./ ...
0238 runningMedLong(dataR2End-subLength2_A+1:end)')) - 1;
0239
0240 dataStdVec2_B(1) = ...
0241 std(detrend(d.antenna0.receiver.data(1:dataR2Start+subLength2_B-1,k) ./ ...
0242 runningMedLong(1:dataR2Start+subLength2_B-1)')) - 1;
0243 dataStdVec2_B(end) = ...
0244 std(detrend(d.antenna0.receiver.data(dataR2End-subLength2_B+1:end,k) ./ ...
0245 runningMedLong(dataR2End-subLength2_B+1:end)')) - 1;
0246 end
0247 end
0248
0249
0250
0251
0252
0253
0254
0255
0256 dataStdLogic_A = max(min(dataStdNorm_A(:,2:2:4),[],2), ...
0257 min(dataStdNorm_A(:,3:2:5),[],2));
0258
0259 dataStdI_A = mean(dataStdNorm_A(:,1:5:6),2);
0260
0261
0262 dataStdLogic_B = repmat(max(min(dataStdNorm_B(:,2:2:4),[],2), ...
0263 min(dataStdNorm_B(:,3:2:5),[],2))',subLength_B/subLength_A,1);
0264 dataStdLogic_B = dataStdLogic_B(:);
0265
0266 dataStdI_B = repmat(mean(dataStdNorm_B(:,1:5:6),2)', ...
0267 subLength_B/subLength_A,1);
0268 dataStdI_B = dataStdI_B(:);
0269
0270
0271
0272
0273
0274
0275
0276
0277
0278
0279
0280
0281
0282
0283
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293
0294
0295
0296
0297
0298
0299 dataStdI2_A = mean(dataStdVec2_A(:,1:5:6),2);
0300 dataStdLogic2_A = max(sum(dataStdVec2_A(:,2:2:4),2) / 2, ...
0301 sum(dataStdVec2_A(:,3:2:5),2) / 2);
0302
0303 dataStdI2_B = mean(dataStdVec2_B(:,1:5:6),2);
0304 dataStdI2_B_max = max(dataStdVec2_B(:,1:5:6),[],2);
0305 dataStdI2_B_min = min(dataStdVec2_B(:,1:5:6),[],2);
0306
0307 dataStdLogic2_B = max(sum(dataStdVec2_B(:,2:2:4),2) / 2, ...
0308 sum(dataStdVec2_B(:,3:2:5),2) / 2);
0309
0310 dataStdLogic2_B = repmat(dataStdLogic2_B',subLength2_B/subLength2_A,1);
0311 dataStdLogic2_B = dataStdLogic2_B(:);
0312
0313 dataStdI2_B = repmat(dataStdI2_B',subLength2_B/subLength2_A,1);
0314 dataStdI2_B = dataStdI2_B(:);
0315
0316 dataStdI2_B_max = repmat(dataStdI2_B_max',subLength2_B/subLength2_A,1);
0317 dataStdI2_B_max = dataStdI2_B_max(:);
0318 dataStdI2_B_min = repmat(dataStdI2_B_min',subLength2_B/subLength2_A,1);
0319 dataStdI2_B_min = dataStdI2_B_min(:);
0320
0321
0322
0323
0324
0325
0326
0327
0328
0329
0330
0331 dataStdI2_B = max(dataStdI2_B,[],2);
0332
0333
0334
0335
0336
0337
0338
0339
0340
0341
0342
0343
0344
0345
0346
0347
0348
0349
0350
0351
0352
0353
0354
0355
0356
0357
0358
0359
0360
0361 shortI_A = zeros(dLength,1);
0362 shortI_B = zeros(dLength,1);
0363 shortL_A = zeros(dLength,1);
0364 shortL_B = zeros(dLength,1);
0365
0366 longI_A = zeros(dLength,1);
0367 longI_B = zeros(dLength,1);
0368 longI_B_min = zeros(dLength,1);
0369 longI_B_max = zeros(dLength,1);
0370 longL_A = zeros(dLength,1);
0371 longL_B = zeros(dLength,1);
0372
0373
0374
0375
0376
0377
0378 shortI_A(dataRStart:dataREnd) = ...
0379 reshape(repmat(dataStdI_A',subLength_A,1),subLength_A*nSubR_A,1);
0380 shortI_B(dataRStart:dataREnd) = ...
0381 reshape(repmat(dataStdI_B',subLength_A,1),subLength_A*nSubR_A,1);
0382 shortL_A(dataRStart:dataREnd) = ...
0383 reshape(repmat(dataStdLogic_A',subLength_A,1),subLength_A*nSubR_A,1);
0384 shortL_B(dataRStart:dataREnd) = ...
0385 reshape(repmat(dataStdLogic_B',subLength_A,1),subLength_A*nSubR_A,1);
0386
0387 if dataRStart > 1
0388 shortI_A(1:dataRStart-1) = shortI_A(1);
0389 shortI_A(dataREnd+1:end) = shortI_A(end);
0390
0391 shortI_B(1:dataRStart-1) = shortI_B(1);
0392 shortI_B(dataREnd+1:end) = shortI_B(end);
0393
0394 shortL_A(1:dataRStart-1) = shortL_A(1);
0395 shortL_A(dataREnd+1:end) = shortL_A(end);
0396
0397 shortL_B(1:dataRStart-1) = shortL_B(1);
0398 shortL_B(dataREnd+1:end) = shortL_B(end);
0399 end
0400
0401
0402
0403 longI_A(dataR2Start:dataR2End) = ...
0404 reshape(repmat(dataStdI2_A',subLength2_A,1),subLength2_A*nSubR2_A,1);
0405 longI_B(dataR2Start:dataR2End) = ...
0406 reshape(repmat(dataStdI2_B',subLength2_A,1),subLength2_A*nSubR2_A,1);
0407 longI_B_min(dataR2Start:dataR2End) = ...
0408 reshape(repmat(dataStdI2_B_min',subLength2_A,1),subLength2_A*nSubR2_A,1);
0409 longI_B_max(dataR2Start:dataR2End) = ...
0410 reshape(repmat(dataStdI2_B_max',subLength2_A,1),subLength2_A*nSubR2_A,1);
0411 longL_A(dataR2Start:dataR2End) = ...
0412 reshape(repmat(dataStdLogic2_A',subLength2_A,1),subLength2_A*nSubR2_A,1);
0413 longL_B(dataR2Start:dataR2End) = ...
0414 reshape(repmat(dataStdLogic2_B',subLength2_A,1),subLength2_A*nSubR2_A,1);
0415
0416 if dataR2Start > 1
0417 longI_A(1:dataR2Start-1) = longI_A(1);
0418 longI_A(dataR2End+1:end) = longI_A(end);
0419
0420 longI_B(1:dataR2Start-1) = longI_B(1);
0421 longI_B(dataR2End+1:end) = longI_B(end);
0422
0423 longI_B_min(1:dataR2Start-1) = longI_B_min(1);
0424 longI_B_min(dataR2End+1:end) = longI_B_min(end);
0425
0426 longI_B_max(1:dataR2Start-1) = longI_B_max(1);
0427 longI_B_max(dataR2End+1:end) = longI_B_max(end);
0428
0429 longL_A(1:dataR2Start-1) = longL_A(1);
0430 longL_A(dataR2End+1:end) = longL_A(end);
0431
0432 longL_B(1:dataR2Start-1) = longL_B(1);
0433 longL_B(dataR2End+1:end) = longL_B(end);
0434 end
0435
0436
0437
0438
0439
0440
0441
0442
0443
0444
0445
0446
0447
0448
0449
0450
0451
0452
0453
0454
0455
0456
0457
0458
0459
0460
0461
0462
0463
0464
0465
0466
0467
0468 end
0469
0470
0471
0472 function clipVec = stdClip(dataVec,thresh,nClip,medSubtract)
0473
0474
0475 if medSubtract ~= 0
0476 medSubtract = 1;
0477 end
0478
0479
0480 clipVec = zeros(length(dataVec),1);
0481
0482
0483 for l=1:nClip
0484
0485 dataStdStd = std(dataVec(clipVec == 0));
0486 dataStdMed = median(dataVec(clipVec == 0));
0487
0488 clipVec = abs(dataVec - medSubtract * dataStdMed) > ...
0489 thresh * dataStdStd;
0490
0491 end
0492
0493 end
0494
0495
0496 function smoothVec = padSmooth(xVec,dataVec,kernelVec,flagVec,padParams)
0497
0498
0499
0500 dataVecT = interp1(xVec(flagVec == 0), ...
0501 smooth(dataVec(flagVec == 0),ceil(length(dataVec) / 100)), ...
0502 (1:length(dataVec)), 'pchip');
0503
0504 dataVecF = dataVec .* (1 - flagVec) + flagVec .* dataVecT;
0505
0506 if flagVec(1) == 1
0507 noFlagPos = find(flagVec == 0,1,'first');
0508
0509 dataVecF(1:noFlagPos-1) = mean(dataVecF(noFlagPos:noFlagPos+99));
0510 end
0511 if flagVec(end) == 1
0512 noFlagPos = find(flagVec == 0,1,'last');
0513
0514 dataVecF(noFlagPos+1:end) = mean(dataVecF(noFlagPos-99:noFlagPos));
0515 end
0516
0517
0518
0519
0520 dataVecPad = zeros(padParams(1),1);
0521 dataVecPad(1:padParams(2)) = ...
0522 repmat(median(dataVecF(1:10)),padParams(2),1);
0523 dataVecPad(padParams(2)+1:padParams(2)+length(dataVec)) = dataVecF;
0524 dataVecPad(end-padParams(3)+1:end) = ...
0525 repmat(median(dataVecF(end-9:end)),padParams(3),1);
0526
0527
0528 dataVecFilt = real(ifft(fft(dataVecPad).*fft(kernelVec)));
0529
0530
0531 smoothVec = dataVecFilt(padParams(2)+1:end - padParams(3));
0532 end
0533