SubGhz: frequency analyzer combined frequency detection method (#1321)

Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
Skorpionm 2022-06-21 17:30:30 +04:00 committed by GitHub
parent f060d005f4
commit dab1313a3b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 49 additions and 25 deletions

View File

@ -67,7 +67,8 @@ static uint32_t subghz_frequency_analyzer_worker_expRunningAverageAdaptive(
static int32_t subghz_frequency_analyzer_worker_thread(void* context) { static int32_t subghz_frequency_analyzer_worker_thread(void* context) {
SubGhzFrequencyAnalyzerWorker* instance = context; SubGhzFrequencyAnalyzerWorker* instance = context;
FrequencyRSSI frequency_rssi = {.frequency = 0, .rssi = 0}; FrequencyRSSI frequency_rssi = {
.frequency_coarse = 0, .rssi_coarse = 0, .frequency_fine = 0, .rssi_fine = 0};
float rssi = 0; float rssi = 0;
uint32_t frequency = 0; uint32_t frequency = 0;
CC1101Status status; CC1101Status status;
@ -105,7 +106,8 @@ static int32_t subghz_frequency_analyzer_worker_thread(void* context) {
float rssi_avg = 0; float rssi_avg = 0;
size_t rssi_avg_samples = 0; size_t rssi_avg_samples = 0;
frequency_rssi.rssi = -127.0f; frequency_rssi.rssi_coarse = -127.0f;
frequency_rssi.rssi_fine = -127.0f;
furi_hal_subghz_idle(); furi_hal_subghz_idle();
subghz_frequency_analyzer_worker_load_registers(subghz_preset_ook_650khz); subghz_frequency_analyzer_worker_load_registers(subghz_preset_ook_650khz);
@ -137,9 +139,9 @@ static int32_t subghz_frequency_analyzer_worker_thread(void* context) {
if(rssi < rssi_min) rssi_min = rssi; if(rssi < rssi_min) rssi_min = rssi;
if(frequency_rssi.rssi < rssi) { if(frequency_rssi.rssi_coarse < rssi) {
frequency_rssi.rssi = rssi; frequency_rssi.rssi_coarse = rssi;
frequency_rssi.frequency = frequency; frequency_rssi.frequency_coarse = frequency;
} }
} }
} }
@ -148,20 +150,17 @@ static int32_t subghz_frequency_analyzer_worker_thread(void* context) {
TAG, TAG,
"RSSI: avg %f, max %f at %u, min %f", "RSSI: avg %f, max %f at %u, min %f",
(double)(rssi_avg / rssi_avg_samples), (double)(rssi_avg / rssi_avg_samples),
(double)frequency_rssi.rssi, (double)frequency_rssi.rssi_coarse,
frequency_rssi.frequency, frequency_rssi.frequency_coarse,
(double)rssi_min); (double)rssi_min);
// Second stage: fine scan // Second stage: fine scan
if(frequency_rssi.rssi > SUBGHZ_FREQUENCY_ANALYZER_THRESHOLD) { if(frequency_rssi.rssi_coarse > SUBGHZ_FREQUENCY_ANALYZER_THRESHOLD) {
FURI_LOG_D(TAG, "~:%u:%f", frequency_rssi.frequency, (double)frequency_rssi.rssi);
frequency_rssi.rssi = -127.0;
furi_hal_subghz_idle(); furi_hal_subghz_idle();
subghz_frequency_analyzer_worker_load_registers(subghz_preset_ook_58khz); subghz_frequency_analyzer_worker_load_registers(subghz_preset_ook_58khz);
//-0.3 ... 433.92 ... +0.3 step 10KHz //for example -0.3 ... 433.92 ... +0.3 step 20KHz
for(uint32_t i = frequency_rssi.frequency - 300000; for(uint32_t i = frequency_rssi.frequency_coarse - 300000;
i < frequency_rssi.frequency + 300000; i < frequency_rssi.frequency_coarse + 300000;
i += 20000) { i += 20000) {
if(furi_hal_subghz_is_frequency_valid(i)) { if(furi_hal_subghz_is_frequency_valid(i)) {
furi_hal_spi_acquire(&furi_hal_spi_bus_handle_subghz); furi_hal_spi_acquire(&furi_hal_spi_bus_handle_subghz);
@ -183,28 +182,51 @@ static int32_t subghz_frequency_analyzer_worker_thread(void* context) {
FURI_LOG_T(TAG, "#:%u:%f", frequency, (double)rssi); FURI_LOG_T(TAG, "#:%u:%f", frequency, (double)rssi);
if(frequency_rssi.rssi < rssi) { if(frequency_rssi.rssi_fine < rssi) {
frequency_rssi.rssi = rssi; frequency_rssi.rssi_fine = rssi;
frequency_rssi.frequency = frequency; frequency_rssi.frequency_fine = frequency;
} }
} }
} }
} }
// Deliver results // Deliver results fine
if(frequency_rssi.rssi > SUBGHZ_FREQUENCY_ANALYZER_THRESHOLD) { if(frequency_rssi.rssi_fine > SUBGHZ_FREQUENCY_ANALYZER_THRESHOLD) {
FURI_LOG_D(TAG, "=:%u:%f", frequency_rssi.frequency, (double)frequency_rssi.rssi); FURI_LOG_D(
TAG, "=:%u:%f", frequency_rssi.frequency_fine, (double)frequency_rssi.rssi_fine);
instance->sample_hold_counter = 20; instance->sample_hold_counter = 20;
if(instance->filVal) { if(instance->filVal) {
frequency_rssi.frequency = frequency_rssi.frequency_fine =
subghz_frequency_analyzer_worker_expRunningAverageAdaptive( subghz_frequency_analyzer_worker_expRunningAverageAdaptive(
instance, frequency_rssi.frequency); instance, frequency_rssi.frequency_fine);
} }
// Deliver callback // Deliver callback
if(instance->pair_callback) { if(instance->pair_callback) {
instance->pair_callback( instance->pair_callback(
instance->context, frequency_rssi.frequency, frequency_rssi.rssi); instance->context, frequency_rssi.frequency_fine, frequency_rssi.rssi_fine);
}
} else if( // Deliver results coarse
(frequency_rssi.rssi_coarse > SUBGHZ_FREQUENCY_ANALYZER_THRESHOLD) &&
(instance->sample_hold_counter < 10)) {
FURI_LOG_D(
TAG,
"~:%u:%f",
frequency_rssi.frequency_coarse,
(double)frequency_rssi.rssi_coarse);
instance->sample_hold_counter = 20;
if(instance->filVal) {
frequency_rssi.frequency_coarse =
subghz_frequency_analyzer_worker_expRunningAverageAdaptive(
instance, frequency_rssi.frequency_coarse);
}
// Deliver callback
if(instance->pair_callback) {
instance->pair_callback(
instance->context,
frequency_rssi.frequency_coarse,
frequency_rssi.rssi_coarse);
} }
} else { } else {
if(instance->sample_hold_counter > 0) { if(instance->sample_hold_counter > 0) {

View File

@ -9,8 +9,10 @@ typedef void (
*SubGhzFrequencyAnalyzerWorkerPairCallback)(void* context, uint32_t frequency, float rssi); *SubGhzFrequencyAnalyzerWorkerPairCallback)(void* context, uint32_t frequency, float rssi);
typedef struct { typedef struct {
uint32_t frequency; uint32_t frequency_coarse;
float rssi; float rssi_coarse;
uint32_t frequency_fine;
float rssi_fine;
} FrequencyRSSI; } FrequencyRSSI;
/** Allocate SubGhzFrequencyAnalyzerWorker /** Allocate SubGhzFrequencyAnalyzerWorker