aboutsummaryrefslogtreecommitdiffstats
path: root/correlate_with_ref.py
diff options
context:
space:
mode:
authorMatthias P. Braendli <matthias.braendli@mpb.li>2016-07-23 12:39:38 +0200
committerMatthias P. Braendli <matthias.braendli@mpb.li>2016-07-23 12:39:38 +0200
commitc340361c04ab0365284404dc16eaada65d482ea3 (patch)
treec5988d945f964e3c74ff8b88a5573642740b3b84 /correlate_with_ref.py
parent9700ab0038fb3988ea7a95526c4490a4ef1afc60 (diff)
downloadodr-dab-cir-c340361c04ab0365284404dc16eaada65d482ea3.tar.gz
odr-dab-cir-c340361c04ab0365284404dc16eaada65d482ea3.tar.bz2
odr-dab-cir-c340361c04ab0365284404dc16eaada65d482ea3.zip
Fix correlation against phase ref
Also remove the old autocorrelation scripts, not pursuing this approach
Diffstat (limited to 'correlate_with_ref.py')
-rwxr-xr-xcorrelate_with_ref.py66
1 files changed, 52 insertions, 14 deletions
diff --git a/correlate_with_ref.py b/correlate_with_ref.py
index 508206a..de68c9d 100755
--- a/correlate_with_ref.py
+++ b/correlate_with_ref.py
@@ -10,7 +10,7 @@ import sys
if len(sys.argv) != 3:
print("Usage")
- print(" script [f64|u8] <filename>")
+ print(" script [fc64|u8] <filename>")
print(" fc64: file is 32-bit float I + 32-bit float Q")
print(" u8: file is 8-bit unsigned I + 8-bit unsigned Q")
sys.exit(1)
@@ -22,37 +22,75 @@ file_in = sys.argv[2]
if sys.argv[1] == "u8":
channel_out1 = np.fromfile(file_in, np.uint8)
print("Convert u8 IQ to fc64 IQ")
- channel_out2 = channel_out1.reshape(2, len(channel_out1)/2)
+ channel_out2 = channel_out1.reshape(2, int(len(channel_out1)/2))
channel_out3 = channel_out2[0,...] + 1j * channel_out2[1,...]
channel_out = channel_out3.astype(np.complex64) / 256.0 - (0.5+0.5j)
elif sys.argv[1] == "fc64":
channel_out = np.fromfile(file_in, np.complex64)
-channel_out = channel_out[0:channel_out.size/2]
+print(" File contains {} samples ({}ms)".format(
+ len(channel_out), len(channel_out) / 2048000.0))
-print("Reading phase reference")
+# T = 1/2048000 s
+# NULL symbol is 2656 T (about 1.3ms) long.
+T_NULL = 2656
+# Full transmission frame in TM1 is 96ms = 196608 T.
+T_TF = 196608
+print("Reading phase reference")
phase_ref = np.fromfile("phasereference.2048000.fc64.iq", np.complex64)
+# As we do not want to correlate of the whole recording that might be
+# containing several transmission frames, we first look for the null symbol in the
+# first 96ms
+
+print("Searching for NULL symbol")
+
+# Calculate power on blocks of length 2656 over the first 96ms. To gain speed,
+# we move the blocks by 10 samples.
+
+channel_out_power = np.array([np.abs(channel_out[t:t+T_NULL]).sum() for t in range(0, T_TF-T_NULL, 10)])
+
+# Look where the power is smallest, this gives the index where the NULL starts.
+# Because if the subsampling, we need to multiply the index.
+
+t_null = 10 * channel_out_power.argmin()
+
+print(" NULL symbol starts at ix={}".format(t_null))
+
+# The synchronisation channel occupies 5208 T and contains NULL symbol and
+# phase reference symbol. The phase reference symbol is 5208 - 2656 = 2552 T
+# long.
+
+if len(phase_ref) != 2552:
+ print("Warning: phase ref len is {} != 2552".format(len(phase_ref)))
+
+
+# We want to correlate our known phase reference symbol against the received
+# signal, and give us some more margin about the exact position of the NULL
+# symbol.
print("Correlating")
-num_correlations = channel_out.size - phase_ref.size
-print("{} correlations to do...".format(num_correlations))
+# We start a bit earlier than the end of the null symbol
+corr_start_ix = t_null + T_NULL - 50
-correlations = np.array([np.abs(np.corrcoef(channel_out[i:phase_ref.size + i], phase_ref)[0,1]) for i in range(num_correlations)])
+# In TM1, the longest spacing between carrier components one can allow is
+# around 504 T (246us, or74km at speed of light). This gives us a limit
+# on the number of correlations it makes sense to do.
-print("Done")
+max_component_delay = 1000 # T
-numpeaks = 6
-print("The first {} highest peaks are at".format(numpeaks))
-print(" index: amplitude")
-for ind in correlations.argsort()[-numpeaks:][::-1]:
- print(" {:4}: {}".format(ind, correlations[ind]))
+cir = np.array([np.abs(np.corrcoef(channel_out[corr_start_ix + i:corr_start_ix + phase_ref.size + i], phase_ref)[0,1]) for i in range(max_component_delay)])
+
+print("Done")
fig = pp.figure()
ax = fig.add_subplot(111)
-hi = ax.plot(correlations)
+hi = ax.plot(channel_out_power)
+fig = pp.figure()
+ax = fig.add_subplot(111)
+hi = ax.plot(cir)
pp.show()