Lab043: add hardware diagnostics and HackRF comparison tools

This commit is contained in:
LittleSam129
2026-08-21 17:33:57 +03:00
parent f0fa7e8a46
commit 42b0120eea
42 changed files with 8763 additions and 6 deletions

View File

@@ -0,0 +1,205 @@
{
"experiment": "Lab043 HackRF RX gain ladder with one continuous tone",
"started_utc": "2026-08-20T15:51:40.472441Z",
"physical_scheme": "Pluto+ TX -> SMA -> AT30S 30 dB -> HackRF RX; antennas removed",
"method": "one continuous cyclic Pluto tone; separate short HackRF RX sessions per gain point",
"fixed_gain_ladder": [
[
0,
0
],
[
8,
8
],
[
16,
8
],
[
16,
16
],
[
24,
16
],
[
24,
24
]
],
"fixed_thresholds": {
"desirable_tone_over_noise_db": 35.0,
"near_limit_component": 0.9,
"preferred_max_component": 0.75,
"clipped_component": 0.9921875,
"near_limit_fraction_stop": 0.0001,
"nonlinear_harmonic_limit_dbc": -30.0
},
"pluto_preflight": {
"uri": "ip:192.168.2.1",
"context_opened": true,
"phy_name": "ad9361-phy",
"tx_device_name": "cf-ad9361-dds-core-lpc",
"first_tx_channel": "voltage0"
},
"hackrf_preflight": {
"model": "HackRF One",
"serial_number": "000000000000000097c063dc323b97d3",
"firmware_version": "2024.02.1 (API:1.08)",
"libhackrf_version": "2024.02.1 (0.9)",
"hardware_revision": "r9",
"hackrf_info_version": "2024.02.1",
"information_query": "hackrf_info version: 2024.02.1\nlibhackrf version: 2024.02.1 (0.9)\nFound HackRF\nIndex: 0\nSerial number: 000000000000000097c063dc323b97d3\nBoard ID Number: 4 (HackRF One)\nFirmware Version: 2024.02.1 (API:1.08)\nPart ID Number: 0xa000cb3c 0x00744f5a\nHardware Revision: r9\nHardware does not appear to have been manufactured by Great Scott Gadgets.\nHardware supported by installed firmware:\n HackRF One",
"requested_center_frequency_hz": 435000000,
"set_center_frequency_hz": 435000000,
"requested_sample_rate_hz": 2400000.0,
"set_sample_rate_hz": 2400000.0,
"sample_rate_readback_available": false,
"center_frequency_readback_available": false,
"rf_amp_enabled": false,
"lna_gain_db": 0,
"vga_gain_db": 0,
"antenna_bias_enabled": false,
"device_opened_via_libhackrf": true,
"rx_started": true,
"probe_sample_count": 65536,
"probe_dtype": "complex64",
"probe_mean_i": -0.02207362651824951,
"probe_mean_q": 0.023364543914794922,
"probe_rms": 0.032287873327732086,
"probe_peak_magnitude": 0.03314562886953354,
"probe_clipped_component_fraction": 0.0,
"probe_stream": {
"callback_count_total": 2,
"warmup_callback_count": 1,
"accepted_callback_count": 1,
"received_bytes_including_warmup": 524288,
"accepted_bytes": 131072,
"accepted_sample_count": 65536,
"callback_indexes_sequential": true,
"program_queue_missing_callback_count": 0,
"duplicate_full_block_hash_count": 0,
"observed_buffer_lengths": [
262144
],
"observed_valid_lengths": [
262144
],
"stream_started_monotonic": 14833.3008998,
"stream_stopped_monotonic": 14833.4274047,
"stream_wall_seconds": 0.12650489999941783,
"accepted_interval_seconds": 0.05461333333333333,
"mean_callback_stream_sample_rate_hz": 2400000.0,
"expected_callback_bytes": 262144,
"observed_callback_byte_sizes": [
262144
],
"observed_callback_buffer_lengths": [
262144
],
"usb_loss_counter_available": false,
"usb_loss_claim": "N/A: libhackrf callback API не предоставляет счётчик потерь"
}
},
"tx_parameters": {
"requested_center_frequency_hz": 435000000,
"actual_center_frequency_hz": 435000000,
"requested_sample_rate_hz": 2400000,
"actual_sample_rate_hz": 2399998,
"requested_gain_db": -30.0,
"actual_gain_db": -30.0,
"requested_rf_bandwidth_hz": 200000,
"actual_rf_bandwidth_hz": 200000
},
"rx_parameters": {
"requested_center_frequency_hz": 435000000,
"set_center_frequency_hz": 435000000,
"requested_sample_rate_hz": 2400000.0,
"set_sample_rate_hz": 2400000.0,
"sample_rate_readback_available": false,
"center_frequency_readback_available": false,
"rf_amp_enabled": false,
"lna_gain_db": 0,
"vga_gain_db": 0,
"antenna_bias_enabled": false
},
"actual_transmitted_tone_offset_hz": 49999.958333333336,
"rf_amp_enabled": false,
"antenna_bias_enabled": false,
"completed_step_count": 1,
"stop_reason": "перегрузка/близость к пределу/гармоническая нелинейность",
"rows": [
{
"step_index": 0,
"lna_gain_db": 0,
"vga_gain_db": 0,
"gain_configuration": {
"rf_amp_enabled": false,
"antenna_bias_enabled": false,
"lna_gain_db": 0,
"vga_gain_db": 0,
"gain_readback_available": false,
"set_calls_succeeded": true
},
"capture_diagnostics": {
"callback_count_total": 20,
"warmup_callback_count": 1,
"accepted_callback_count": 19,
"received_bytes_including_warmup": 5242880,
"accepted_bytes": 4800000,
"accepted_sample_count": 2400000,
"callback_indexes_sequential": true,
"program_queue_missing_callback_count": 0,
"duplicate_full_block_hash_count": 0,
"observed_buffer_lengths": [
262144
],
"observed_valid_lengths": [
262144
],
"stream_started_monotonic": 14833.9455921,
"stream_stopped_monotonic": 14835.0408997,
"stream_wall_seconds": 1.095307599998705,
"accepted_interval_seconds": 1.015633833332328,
"mean_callback_stream_sample_rate_hz": 2452033.319753656,
"expected_callback_bytes": 262144,
"observed_callback_byte_sizes": [
262144
],
"observed_callback_buffer_lengths": [
262144
],
"usb_loss_counter_available": false,
"usb_loss_claim": "N/A: libhackrf callback API не предоставляет счётчик потерь"
},
"metrics": {
"sample_count": 1800000,
"fft_samples": 262144,
"fft_segment_count": 6,
"fft_resolution_hz": 9.1552734375,
"tone_frequency_hz": 50553.32330951437,
"tone_peak_bin_hz": 50555.419921875,
"tone_power_dbfs": -81.28323863999425,
"noise_floor_dbfs_per_fft_bin": -102.8470903549844,
"tone_over_noise_db": 21.56385171499015,
"mean_amplitude": 0.03218085318803787,
"rms_amplitude": 0.03224262222647667,
"maximum_amplitude": 0.03314562886953354,
"maximum_component": 0.0234375,
"near_limit_component_fraction": 0.0,
"clipped_component_fraction": 0.0,
"dc_mean_i": -0.021994179114699364,
"dc_mean_q": 0.023369232192635536,
"second_harmonic_dbc": -17.033931670944185,
"third_harmonic_dbc": -16.93934642712324,
"harmonic_nonlinearity_detected": true,
"stop_gain_escalation": true,
"stop_reason": "перегрузка/близость к пределу/гармоническая нелинейность"
}
}
],
"preferred_gain": null,
"digital_experiment_authorized": false
}

View File

@@ -0,0 +1,416 @@
{
"experiment": "Lab043 HackRF RX gain ladder with one continuous tone",
"started_utc": "2026-08-20T16:14:24.031539Z",
"physical_scheme": "Pluto+ TX -> SMA -> AT30S 30 dB -> HackRF RX; antennas removed",
"method": "one continuous cyclic Pluto tone; separate short HackRF RX sessions per gain point",
"fixed_gain_ladder": [
[
0,
0
],
[
8,
8
],
[
16,
8
],
[
16,
16
],
[
24,
16
],
[
24,
24
]
],
"fixed_thresholds": {
"desirable_tone_over_noise_db": 35.0,
"near_limit_component": 0.9,
"preferred_max_component": 0.75,
"clipped_component": 0.9921875,
"near_limit_fraction_stop": 0.0001,
"nonlinear_harmonic_limit_dbc": -30.0,
"harmonic_detection_margin_db": 10.0,
"harmonic_search_half_width_hz": 2000.0,
"harmonic_noise_outer_half_width_hz": 10000.0
},
"pluto_preflight": {
"uri": "ip:192.168.2.1",
"context_opened": true,
"phy_name": "ad9361-phy",
"tx_device_name": "cf-ad9361-dds-core-lpc",
"first_tx_channel": "voltage0"
},
"hackrf_preflight": {
"model": "HackRF One",
"serial_number": "000000000000000097c063dc323b97d3",
"firmware_version": "2024.02.1 (API:1.08)",
"libhackrf_version": "2024.02.1 (0.9)",
"hardware_revision": "r9",
"hackrf_info_version": "2024.02.1",
"information_query": "hackrf_info version: 2024.02.1\nlibhackrf version: 2024.02.1 (0.9)\nFound HackRF\nIndex: 0\nSerial number: 000000000000000097c063dc323b97d3\nBoard ID Number: 4 (HackRF One)\nFirmware Version: 2024.02.1 (API:1.08)\nPart ID Number: 0xa000cb3c 0x00744f5a\nHardware Revision: r9\nHardware does not appear to have been manufactured by Great Scott Gadgets.\nHardware supported by installed firmware:\n HackRF One",
"requested_center_frequency_hz": 435000000,
"set_center_frequency_hz": 435000000,
"requested_sample_rate_hz": 2400000.0,
"set_sample_rate_hz": 2400000.0,
"sample_rate_readback_available": false,
"center_frequency_readback_available": false,
"rf_amp_enabled": false,
"lna_gain_db": 0,
"vga_gain_db": 0,
"antenna_bias_enabled": false,
"device_opened_via_libhackrf": true,
"rx_started": true,
"probe_sample_count": 65536,
"probe_dtype": "complex64",
"probe_mean_i": -0.02216637134552002,
"probe_mean_q": 0.023369193077087402,
"probe_rms": 0.032346732914447784,
"probe_peak_magnitude": 0.03314562886953354,
"probe_clipped_component_fraction": 0.0,
"probe_stream": {
"callback_count_total": 2,
"warmup_callback_count": 1,
"accepted_callback_count": 1,
"received_bytes_including_warmup": 524288,
"accepted_bytes": 131072,
"accepted_sample_count": 65536,
"callback_indexes_sequential": true,
"program_queue_missing_callback_count": 0,
"duplicate_full_block_hash_count": 0,
"observed_buffer_lengths": [
262144
],
"observed_valid_lengths": [
262144
],
"stream_started_monotonic": 16196.8526212,
"stream_stopped_monotonic": 16196.9628548,
"stream_wall_seconds": 0.11023360000035609,
"accepted_interval_seconds": 0.05461333333333333,
"mean_callback_stream_sample_rate_hz": 2400000.0,
"expected_callback_bytes": 262144,
"observed_callback_byte_sizes": [
262144
],
"observed_callback_buffer_lengths": [
262144
],
"usb_loss_counter_available": false,
"usb_loss_claim": "N/A: libhackrf callback API не предоставляет счётчик потерь"
}
},
"tx_parameters": {
"requested_center_frequency_hz": 435000000,
"actual_center_frequency_hz": 435000000,
"requested_sample_rate_hz": 2400000,
"actual_sample_rate_hz": 2399998,
"requested_gain_db": -30.0,
"actual_gain_db": -30.0,
"requested_rf_bandwidth_hz": 200000,
"actual_rf_bandwidth_hz": 200000
},
"rx_parameters": {
"requested_center_frequency_hz": 435000000,
"set_center_frequency_hz": 435000000,
"requested_sample_rate_hz": 2400000.0,
"set_sample_rate_hz": 2400000.0,
"sample_rate_readback_available": false,
"center_frequency_readback_available": false,
"rf_amp_enabled": false,
"lna_gain_db": 0,
"vga_gain_db": 0,
"antenna_bias_enabled": false
},
"actual_transmitted_tone_offset_hz": 49999.958333333336,
"rf_amp_enabled": false,
"antenna_bias_enabled": false,
"completed_step_count": 3,
"stop_reason": "перегрузка/близость к пределу/гармоническая нелинейность",
"rows": [
{
"step_index": 0,
"lna_gain_db": 0,
"vga_gain_db": 0,
"gain_configuration": {
"rf_amp_enabled": false,
"antenna_bias_enabled": false,
"lna_gain_db": 0,
"vga_gain_db": 0,
"gain_readback_available": false,
"set_calls_succeeded": true
},
"capture_diagnostics": {
"callback_count_total": 20,
"warmup_callback_count": 1,
"accepted_callback_count": 19,
"received_bytes_including_warmup": 5242880,
"accepted_bytes": 4800000,
"accepted_sample_count": 2400000,
"callback_indexes_sequential": true,
"program_queue_missing_callback_count": 0,
"duplicate_full_block_hash_count": 0,
"observed_buffer_lengths": [
262144
],
"observed_valid_lengths": [
262144
],
"stream_started_monotonic": 16197.5058473,
"stream_stopped_monotonic": 16198.599203,
"stream_wall_seconds": 1.0933556999989378,
"accepted_interval_seconds": 1.0374631333339555,
"mean_callback_stream_sample_rate_hz": 2400439.996356343,
"expected_callback_bytes": 262144,
"observed_callback_byte_sizes": [
262144
],
"observed_callback_buffer_lengths": [
262144
],
"usb_loss_counter_available": false,
"usb_loss_claim": "N/A: libhackrf callback API не предоставляет счётчик потерь"
},
"metrics": {
"sample_count": 1800000,
"fft_samples": 262144,
"fft_segment_count": 6,
"fft_resolution_hz": 9.1552734375,
"tone_frequency_hz": 50555.09081574355,
"tone_peak_bin_hz": 50555.419921875,
"tone_power_dbfs": -79.8521010939479,
"noise_floor_dbfs_per_fft_bin": -102.22903287394465,
"tone_over_noise_db": 22.376931779996752,
"mean_amplitude": 0.03206367790699005,
"rms_amplitude": 0.032130662351846695,
"maximum_amplitude": 0.03493856266140938,
"maximum_component": 0.03125,
"near_limit_component_fraction": 0.0,
"clipped_component_fraction": 0.0,
"dc_mean_i": -0.02178940176963806,
"dc_mean_q": 0.023389514535665512,
"second_harmonic": {
"order": 2,
"expected_frequency_hz": 101110.1816314871,
"peak_frequency_hz": 103042.6025390625,
"peak_power_dbfs": -97.16303551095399,
"local_noise_floor_dbfs_per_fft_bin": -102.3624373861,
"above_local_noise_db": 5.199401875146009,
"relative_to_fundamental_db": -17.310934417006095,
"credible": false,
"nonlinear": false
},
"third_harmonic": {
"order": 3,
"expected_frequency_hz": 151665.27244723076,
"peak_frequency_hz": 151263.427734375,
"peak_power_dbfs": -97.44245378672434,
"local_noise_floor_dbfs_per_fft_bin": -102.34809348021747,
"above_local_noise_db": 4.905639693493129,
"relative_to_fundamental_db": -17.59035269277645,
"credible": false,
"nonlinear": false
},
"second_harmonic_dbc": -17.310934417006095,
"third_harmonic_dbc": -17.59035269277645,
"harmonic_nonlinearity_detected": false,
"stop_gain_escalation": false,
"stop_reason": ""
}
},
{
"step_index": 1,
"lna_gain_db": 8,
"vga_gain_db": 8,
"gain_configuration": {
"rf_amp_enabled": false,
"antenna_bias_enabled": false,
"lna_gain_db": 8,
"vga_gain_db": 8,
"gain_readback_available": false,
"set_calls_succeeded": true
},
"capture_diagnostics": {
"callback_count_total": 15,
"warmup_callback_count": 1,
"accepted_callback_count": 14,
"received_bytes_including_warmup": 3932160,
"accepted_bytes": 3600000,
"accepted_sample_count": 1800000,
"callback_indexes_sequential": true,
"program_queue_missing_callback_count": 0,
"duplicate_full_block_hash_count": 0,
"observed_buffer_lengths": [
262144
],
"observed_valid_lengths": [
262144
],
"stream_started_monotonic": 16198.9768347,
"stream_stopped_monotonic": 16199.7983054,
"stream_wall_seconds": 0.8214706999988266,
"accepted_interval_seconds": 0.7651954333319796,
"mean_callback_stream_sample_rate_hz": 2398090.6315784073,
"expected_callback_bytes": 262144,
"observed_callback_byte_sizes": [
262144
],
"observed_callback_buffer_lengths": [
262144
],
"usb_loss_counter_available": false,
"usb_loss_claim": "N/A: libhackrf callback API не предоставляет счётчик потерь"
},
"metrics": {
"sample_count": 1800000,
"fft_samples": 262144,
"fft_segment_count": 6,
"fft_resolution_hz": 9.1552734375,
"tone_frequency_hz": 50555.29344158161,
"tone_peak_bin_hz": 50555.419921875,
"tone_power_dbfs": -75.07841275653543,
"noise_floor_dbfs_per_fft_bin": -105.14911967255102,
"tone_over_noise_db": 30.070706916015595,
"mean_amplitude": 0.03427855297923088,
"rms_amplitude": 0.03433648869395256,
"maximum_amplitude": 0.04207159951329231,
"maximum_component": 0.0390625,
"near_limit_component_fraction": 0.0,
"clipped_component_fraction": 0.0,
"dc_mean_i": -0.015552565455436707,
"dc_mean_q": 0.030518028885126114,
"second_harmonic": {
"order": 2,
"expected_frequency_hz": 101110.58688316331,
"peak_frequency_hz": 101110.83984375,
"peak_power_dbfs": -96.46551235195447,
"local_noise_floor_dbfs_per_fft_bin": -105.04563379125153,
"above_local_noise_db": 8.58012143929706,
"relative_to_fundamental_db": -21.387099595419045,
"credible": false,
"nonlinear": false
},
"third_harmonic": {
"order": 3,
"expected_frequency_hz": 151665.88032474485,
"peak_frequency_hz": 150769.04296875,
"peak_power_dbfs": -100.56316044640394,
"local_noise_floor_dbfs_per_fft_bin": -105.10576449464062,
"above_local_noise_db": 4.542604048236683,
"relative_to_fundamental_db": -25.484747689868513,
"credible": false,
"nonlinear": false
},
"second_harmonic_dbc": -21.387099595419045,
"third_harmonic_dbc": -25.484747689868513,
"harmonic_nonlinearity_detected": false,
"stop_gain_escalation": false,
"stop_reason": ""
}
},
{
"step_index": 2,
"lna_gain_db": 16,
"vga_gain_db": 8,
"gain_configuration": {
"rf_amp_enabled": false,
"antenna_bias_enabled": false,
"lna_gain_db": 16,
"vga_gain_db": 8,
"gain_readback_available": false,
"set_calls_succeeded": true
},
"capture_diagnostics": {
"callback_count_total": 15,
"warmup_callback_count": 1,
"accepted_callback_count": 14,
"received_bytes_including_warmup": 3932160,
"accepted_bytes": 3600000,
"accepted_sample_count": 1800000,
"callback_indexes_sequential": true,
"program_queue_missing_callback_count": 0,
"duplicate_full_block_hash_count": 0,
"observed_buffer_lengths": [
262144
],
"observed_valid_lengths": [
262144
],
"stream_started_monotonic": 16200.181376,
"stream_stopped_monotonic": 16201.0025195,
"stream_wall_seconds": 0.8211434999993799,
"accepted_interval_seconds": 0.7650824333337428,
"mean_callback_stream_sample_rate_hz": 2398444.8211733233,
"expected_callback_bytes": 262144,
"observed_callback_byte_sizes": [
262144
],
"observed_callback_buffer_lengths": [
262144
],
"usb_loss_counter_available": false,
"usb_loss_claim": "N/A: libhackrf callback API не предоставляет счётчик потерь"
},
"metrics": {
"sample_count": 1800000,
"fft_samples": 262144,
"fft_segment_count": 6,
"fft_resolution_hz": 9.1552734375,
"tone_frequency_hz": 50555.418595322284,
"tone_peak_bin_hz": 50555.419921875,
"tone_power_dbfs": -65.25476329876575,
"noise_floor_dbfs_per_fft_bin": -103.39135933360873,
"tone_over_noise_db": 38.13659603484298,
"mean_amplitude": 0.033912722021341324,
"rms_amplitude": 0.0339985117316246,
"maximum_amplitude": 0.04207159951329231,
"maximum_component": 0.0390625,
"near_limit_component_fraction": 0.0,
"clipped_component_fraction": 0.0,
"dc_mean_i": -0.015441679395735264,
"dc_mean_q": 0.030141202732920647,
"second_harmonic": {
"order": 2,
"expected_frequency_hz": 101110.83719064458,
"peak_frequency_hz": 101110.83984375,
"peak_power_dbfs": -83.20641938155373,
"local_noise_floor_dbfs_per_fft_bin": -103.4224986210237,
"above_local_noise_db": 20.216079239469977,
"relative_to_fundamental_db": -17.951656082787977,
"credible": true,
"nonlinear": true
},
"third_harmonic": {
"order": 3,
"expected_frequency_hz": 151666.25578596676,
"peak_frequency_hz": 153103.6376953125,
"peak_power_dbfs": -98.4311096772575,
"local_noise_floor_dbfs_per_fft_bin": -103.40473622499643,
"above_local_noise_db": 4.973626547738931,
"relative_to_fundamental_db": -33.17634637849174,
"credible": false,
"nonlinear": false
},
"second_harmonic_dbc": -17.951656082787977,
"third_harmonic_dbc": -33.17634637849174,
"harmonic_nonlinearity_detected": true,
"stop_gain_escalation": true,
"stop_reason": "перегрузка/близость к пределу/гармоническая нелинейность"
}
}
],
"preferred_gain": {
"step_index": 1,
"lna_gain_db": 8,
"vga_gain_db": 8,
"tone_over_noise_db": 30.070706916015595,
"desirable_margin_reached": false
},
"digital_experiment_authorized": false
}