FT8CN/ft8CN/app/src/main/cpp/ft8/decode.h

122 wiersze
7.4 KiB
C
Czysty Wina Historia

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#ifndef _INCLUDE_DECODE_H_
#define _INCLUDE_DECODE_H_
#include <stdint.h>
#include <stdbool.h>
#include "constants.h"
#include "../fft/kiss_fft.h"
#include "../common/debug.h"
/// Input structure to ft8_find_sync() function. This structure describes stored waterfall data over the whole message slot.
/// Fields time_osr and freq_osr specify additional oversampling rate for time and frequency resolution.
/// If time_osr=1, FFT magnitude data is collected once for every symbol transmitted, i.e. every 1/6.25 = 0.16 seconds.
/// Values time_osr > 1 mean each symbol is further subdivided in time.
/// If freq_osr=1, each bin in the FFT magnitude data corresponds to 6.25 Hz, which is the tone spacing.
/// Values freq_osr > 1 mean the tone spacing is further subdivided by FFT analysis.
/// ft8_find_sync函数的输入结构。这种结构描述了整个消息槽中存储的瀑布数据。
/// time_osr和freq_osr字段指定时间和频率分辨率的额外过采样率。
/// 如果time_osr=1则针对每个传输的符号收集一次FFT幅度数据即每1/6.25=0.16秒收集一次。FSK符号的时间长度是0.16秒。
/// 如果time_osr>1表示每个符号在时间上进一步过采样。
/// 如果freq_osr=1FFT幅度数据中的每个单元对应于6.25 Hz这是音调间隔FSK的符号时长
/// 如果freq_osr>1意味着通过FFT分析进一步对音调间隔过采样。
typedef struct
{
int max_blocks; ///< mag阵列中分配的块符号数。number of blocks (symbols) allocated in the mag array
int num_blocks; ///< mag阵列中存储的块符号编号时域序列号。number of blocks (symbols) stored in the mag array
//num_bins = 12000 * 0.16 / 2 = 960
int num_bins; ///< 以6.25 Hz为单位的FFT箱数量960。number of FFT bins in terms of 6.25 Hz
int time_osr; ///< 时间过采样率时间细分数。number of time subdivisions
int freq_osr; ///< 频率过采样率频率细分数。number of frequency subdivisions
uint8_t* mag; ///< FFT的magnitudes量级存储。FFT magnitudes stored as uint8_t[blocks][time_osr][freq_osr][num_bins]
int block_stride; ///< 块的步态没搞懂。Helper value = time_osr * freq_osr * num_bins
ftx_protocol_t protocol; ///< 协议。Indicate if using FT4 or FT8
float* mag2;///用于存储准确信号量的数组,这是个平方值,真正的值需要开方,为了速度,就不开方了,等后续再计算。
} waterfall_t;
/// Output structure of ft8_find_sync() and input structure of ft8_decode().
/// Holds the position of potential start of a message in time and frequency.
// 此结构是ft8_find_sync()的输出结构ft8_decode()的输入
// 在时间和频率上,保持消息的潜在起始位置。
typedef struct
{
int16_t score; ///< score 候选分数非负数分数越高表示可能性越大。Candidate score (non-negative number; higher score means higher likelihood)
int16_t time_offset; ///< 时间段索引。Index of the time block
int16_t freq_offset; ///< 频率段索引。Index of the frequency bin
uint8_t time_sub; ///< 所用时间细分的索引。Index of the time subdivision used
uint8_t freq_sub; ///< 所用频率细分的索引。Index of the frequency subdivision used
int snr;//信噪比
} candidate_t;
/// Structure that holds the decoded message
typedef struct {
uint32_t hash22;
uint32_t hash12;
uint32_t hash10;
} hashCode;
// 保存已解码消息的结构
typedef struct
{
//2022-05-13增加i3和n3
uint8_t i3;
uint8_t n3;
// TODO: check again that this size is enough
//char text[25]; ///< 纯文本Plain text原文是25
char text[48]; ///<但在在unpack.c中unpack77函数的最大可能是14+14+19=
uint16_t hash; ///用于对消息hash防止消息重复< Hash value to be used in hash table and quick checking for duplicates
//2022-05-26新增以下内容
char call_to[14];//被呼叫的呼号
char call_de[14];//发起的呼号
char extra[19];//扩展内容
//---TODO-------------
char maidenGrid[5];//梅登海德
int report;//信号报告
hashCode call_to_hash;//22位长度的哈希码
hashCode call_de_hash;//22位长度的哈希码
//TO HASH , FROM HASH
uint8_t a91[FTX_LDPC_K_BYTES];//用于生成减法代码的数据
} message_t;
/// Structure that contains the status of various steps during decoding of a message
/// 包含消息解码过程中各个步骤的状态的结构
typedef struct
{
int ldpc_errors; ///< 解码期间的LDPC稀疏校验矩阵错误数。Number of LDPC errors during decoding
uint16_t crc_extracted; ///< 从消息中恢复的CRC值。CRC value recovered from the message
uint16_t crc_calculated; ///< 在有效负载上计算的CRC值。CRC value calculated over the payload
int unpack_status; ///< 解包例程的返回值。Return value of the unpack routine
} decode_status_t;
/// Localize top N candidates in frequency and time according to their sync strength (looking at Costas symbols)
/// 根据同步强度查看Costas符号在频率和时间上对前N名候选人进行本地化。
/// We treat and organize the candidate list as a min-heap (empty initially).
/// 我们将候选列表视为一个最小堆(最初为空)。
/// @param[in] power 在消息槽期间收集的瀑布数据。Waterfall data collected during message slot
/// @param[in] sync_pattern 同步模式。Synchronization pattern
/// @param[in] num_candidates 最大候选数量堆数组大小。Number of maximum candidates (size of heap array)
/// @param[in,out] heap 候选项类型的数组分配了num个候选项。Array of candidate_t type entries (with num_candidates allocated entries)
/// @param[in] min_score 删减不太可能的候选项所允许的最低分数可以为零没有效果。Minimal score allowed for pruning unlikely candidates (can be zero for no effect)
/// @return 堆中填写的候选人数。Number of candidates filled in the heap
int ft8_find_sync(const waterfall_t* power, int num_candidates, candidate_t heap[], int min_score);
/// Attempt to decode a message candidate. Extracts the bit probabilities, runs LDPC decoder, checks CRC and unpacks the message in plain text.
/// 尝试解码候选消息。提取比特概率运行LDPC解码器检查CRC并将消息解压为纯文本。
/// @param[in] power 在消息槽期间收集的瀑布数据。Waterfall data collected during message slot
/// @param[in] cand 要解码的候选人。Candidate to decode
/// @param[out] message 将接收解码消息的message_t结构。message_t structure that will receive the decoded message
/// @param[in] max_iterations 允许的最大LDPC迭代次数数字越小解码速度越快但精度越低。Maximum allowed LDPC iterations (lower number means faster decode, but less precise)
/// @param[out] status decode_status_t结构该结构将填充各种解码步骤的状态。decode_status_t structure that will be filled with the status of various decoding steps
/// @return 如果解码成功则为True否则为false查看状态了解详细信息。True if the decoding was successful, false otherwise (check status for details)
bool ft8_decode(waterfall_t* power, candidate_t* cand, message_t* message, int max_iterations, decode_status_t* status);
#endif // _INCLUDE_DECODE_H_