Fixed some bugs where I was treating sample data as an integer. Allows use with UHD without multiplying everything up by 64K. =)

Also changed the reference level printout to show dB instead of sample value. This seems more useful. 0dB is full scale.
This commit is contained in:
Nick Foster 2010-09-20 11:09:59 -07:00
parent 13c5acca52
commit 7727b7c902
9 changed files with 16 additions and 13 deletions

View File

@ -39,7 +39,7 @@ int air_modes_framer::work(int noutput_items,
int size = noutput_items - d_check_width; //need to be able to look ahead a full frame int size = noutput_items - d_check_width; //need to be able to look ahead a full frame
int reference_level = 0; float reference_level = 0;
framer_packet_type packet_attrib; framer_packet_type packet_attrib;
for(int i = 0; i < size; i++) { for(int i = 0; i < size; i++) {
@ -67,7 +67,7 @@ int air_modes_framer::work(int noutput_items,
//NOTE: you can change the default here to be short packet, and then check for a long packet. don't know which way is better. //NOTE: you can change the default here to be short packet, and then check for a long packet. don't know which way is better.
for(int j = (65 * d_samples_per_symbol); j < (70 * d_samples_per_symbol); j += d_samples_per_symbol) { for(int j = (65 * d_samples_per_symbol); j < (70 * d_samples_per_symbol); j += d_samples_per_symbol) {
int t_max = (bit_energy(&inraw[i+j], d_samples_per_chip) > bit_energy(&inraw[i+j+d_samples_per_chip], d_samples_per_chip)) ? bit_energy(&inraw[i+j], d_samples_per_chip) : bit_energy(&inraw[i+j+d_samples_per_chip], d_samples_per_chip); float t_max = (bit_energy(&inraw[i+j], d_samples_per_chip) > bit_energy(&inraw[i+j+d_samples_per_chip], d_samples_per_chip)) ? bit_energy(&inraw[i+j], d_samples_per_chip) : bit_energy(&inraw[i+j+d_samples_per_chip], d_samples_per_chip);
if(t_max < (reference_level / 2)) packet_attrib = Short_Packet; if(t_max < (reference_level / 2)) packet_attrib = Short_Packet;
} }

View File

@ -39,7 +39,7 @@ int air_modes_preamble::work(int noutput_items,
int size = noutput_items - d_check_width; int size = noutput_items - d_check_width;
int pulse_offsets[4]; int pulse_offsets[4];
int bit_energies[4]; float bit_energies[4];
for(int i = d_samples_per_chip; i < size; i++) { for(int i = d_samples_per_chip; i < size; i++) {
float pulse_threshold = bit_energy(&inavg[i], d_samples_per_chip) * d_threshold; float pulse_threshold = bit_energy(&inavg[i], d_samples_per_chip) * d_threshold;

View File

@ -90,7 +90,7 @@ int air_modes_slicer::work(int noutput_items,
// confidence = bool(int(firstchip_inref) + int(secondchip_inref)); //one and only one chip in the reference zone // confidence = bool(int(firstchip_inref) + int(secondchip_inref)); //one and only one chip in the reference zone
//below is the Lincoln Labs slicer. it may produce greater bit errors. supposedly it is more resistant to mode A/C FRUIT. //below is the Lincoln Labs slicer. it may produce greater bit errors. supposedly it is more resistant to mode A/C FRUIT.
//see http://adsb.tc.faa.gov/WG3_Meetings/Meeting8/Squitter-Lon.pdf
if(firstchip_inref && !secondchip_inref) { if(firstchip_inref && !secondchip_inref) {
slice = 1; slice = 1;
confidence = 1; confidence = 1;

View File

@ -3,6 +3,7 @@
#betcha this would be faster if you used a table for mode C #betcha this would be faster if you used a table for mode C
#you could strip out D1 since it's never used, that leaves 11 bits (table is 2048 entries) #you could strip out D1 since it's never used, that leaves 11 bits (table is 2048 entries)
#on the other hand doing it this way is educational for others
def decode_alt(alt, bit13): def decode_alt(alt, bit13):
if alt & 0x40 and bit13 is True: if alt & 0x40 and bit13 is True:
return "METRIC ERROR" return "METRIC ERROR"

Binary file not shown.

View File

@ -2,12 +2,15 @@
#from string import split, join #from string import split, join
#from math import pi, floor, cos, acos #from math import pi, floor, cos, acos
import math, time import math, time
#this implements CPR position decoding. local only for now. #this implements CPR position decoding.
latz = 15 latz = 15
nbits = 17 nbits = 17
my_lat = 37.76225 #update these later! #my_lat = 37.76225 #update these later!
my_lon = -122.44254 #my_lon = -122.44254
#ER
my_lat = 37.40889176297184
my_lon = -122.07765340805054
def nz(ctype): def nz(ctype):
@ -229,8 +232,8 @@ def range_bearing(loc_a, loc_b):
avg_lat = (a_lat + b_lat) / 2.0 avg_lat = (a_lat + b_lat) / 2.0
R1 = earth_radius_mi*(1.0-esquared)/pow((1.0-esquared*pow(math.sin(avg_lat),2)),1.5) R1 = earth_radius_mi*(1.0-esquared)/pow((1.0-esquared*pow(math.sin(avg_lat),2)),1.5)
R2 = earth_radius_mi/math.sqrt(1.0-esquared*pow(math.sin(avg_lat),2)) R2 = earth_radius_mi/math.sqrt(1.0-esquared*pow(math.sin(avg_lat),2))
distance_North = R1*delta_lat distance_North = R1*delta_lat

Binary file not shown.

View File

@ -33,7 +33,7 @@ def modes_print(message):
else: else:
output = "No handler for message type " + str(msgtype) + " from " + str(ecc) output = "No handler for message type " + str(msgtype) + " from " + str(ecc)
output = "(%.0f) " % float(reference) + output output = "(%.0f) " % (10.0*math.log10(float(reference))) + output
return output return output

View File

@ -33,7 +33,7 @@ The following are optional command line parameters:
-R SUBDEV Daughter board specification, defaults to first found -R SUBDEV Daughter board specification, defaults to first found
-f FREQ USRP receive frequency (1090 MHz Default) -f FREQ USRP receive frequency (1090 MHz Default)
-g GAIN Daughterboard gain setting. Defaults to mid-range. -g GAIN Daughterboard gain setting. Defaults to mid-range.
-d DECIM USRP decimation rate -r RATE USRP sample rate
-t THRESH Receiver valid pulse threshold -t THRESH Receiver valid pulse threshold
-a Output all frames. Defaults only output frames -a Output all frames. Defaults only output frames
@ -80,7 +80,6 @@ class adsb_rx_block (gr.top_block):
if options.output_all : if options.output_all :
pass_all = 1 pass_all = 1
self.gain = gr.multiply_const_cc(1000000)
self.demod = gr.complex_to_mag() self.demod = gr.complex_to_mag()
self.avg = gr.moving_average_ff(100, 1.0/100, 400); self.avg = gr.moving_average_ff(100, 1.0/100, 400);
self.preamble = air.modes_preamble(rate, options.threshold) self.preamble = air.modes_preamble(rate, options.threshold)
@ -95,7 +94,7 @@ class adsb_rx_block (gr.top_block):
# else: # else:
self.filt = self.u self.filt = self.u
self.connect(self.filt, self.gain, self.demod) self.connect(self.filt, self.demod)
self.connect(self.demod, self.avg) self.connect(self.demod, self.avg)
self.connect(self.demod, (self.preamble, 0)) self.connect(self.demod, (self.preamble, 0))
self.connect(self.avg, (self.preamble, 1)) self.connect(self.avg, (self.preamble, 1))