|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
#include <rtl-sdr.h> #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <math.h> #define FREQ_HZ 444000000 #define SAMPLE_RATE 2048000 #define GAIN_TENTHS_DB 496 #define BUFFER_SIZE 16384 int main(void) { rtlsdr_dev_t *dev = NULL; int r, n_read; r = rtlsdr_open(&dev, 0); if (r < 0) { fprintf(stderr, "Error al abrir RTL-SDR\n"); return 1; } rtlsdr_set_center_freq(dev, FREQ_HZ); rtlsdr_set_sample_rate(dev, SAMPLE_RATE); rtlsdr_set_tuner_gain_mode(dev, 1); rtlsdr_set_tuner_gain(dev, GAIN_TENTHS_DB); rtlsdr_reset_buffer(dev); printf("Escuchando en %d Hz...\n", FREQ_HZ); printf("Calibrando ruido de fondo...\n"); uint8_t buffer[BUFFER_SIZE]; long baseline_sum = 0; int calibration_rounds = 40; for (int round = 0; round < calibration_rounds; round++) { r = rtlsdr_read_sync(dev, buffer, sizeof(buffer), &n_read); if (r < 0 || n_read <= 0) { fprintf(stderr, "Error durante la calibración\n"); rtlsdr_close(dev); return 1; } long sum = 0; for (int i = 0; i + 1 < n_read; i += 2) { float I = ((float)buffer[i]) - 127.5f; float Q = ((float)buffer[i + 1]) - 127.5f; sum += (long)sqrtf(I * I + Q * Q); } int avg = (int)(sum / (n_read / 2)); baseline_sum += avg; } int baseline = (int)(baseline_sum / calibration_rounds); int threshold = baseline + 12; printf("Ruido base: %d\n", baseline); printf("Umbral: %d\n", threshold); printf("Esperando señal...\n\n"); int last_detected = 0; int stable_count = 0; while (1) { r = rtlsdr_read_sync(dev, buffer, sizeof(buffer), &n_read); if (r < 0 || n_read <= 0) { fprintf(stderr, "Error leyendo del RTL-SDR\n"); break; } long sum = 0; for (int i = 0; i + 1 < n_read; i += 2) { float I = ((float)buffer[i]) - 127.5f; float Q = ((float)buffer[i + 1]) - 127.5f; sum += (long)sqrtf(I * I + Q * Q); } int level = (int)(sum / (n_read / 2)); int detected = (level > threshold) ? 1 : 0; if (detected == last_detected) { stable_count++; } else { stable_count = 0; } if (stable_count >= 3) { if (detected) { printf("SEÑAL DETECTADA | nivel=%d | umbral=%d\n", level, threshold); } else { printf("sin señal | nivel=%d | umbral=%d\n", level, threshold); } fflush(stdout); stable_count = 0; } last_detected = detected; } rtlsdr_close(dev); return 0; } |

