Porównaj commity

...

3 Commity

Autor SHA1 Wiadomość Data
Wojciech Kaczmarski 4c88abf31f typo fix 2024-01-14 18:07:23 +01:00
Wojciech Kaczmarski 47dae3c230 added soft bit (de)randomizer too 2024-01-14 18:05:07 +01:00
Wojciech Kaczmarski f657d03527 wrapped up symbol slicing function 2024-01-14 17:55:17 +01:00
5 zmienionych plików z 82 dodań i 46 usunięć

Wyświetl plik

@ -103,6 +103,10 @@ void soft_XOR(uint16_t* out, const uint16_t* a, const uint16_t* b, const uint8_t
extern const uint8_t rand_seq[46];
void randomize_bits(uint8_t inp[SYM_PER_PLD*2]);
void randomize_soft_bits(uint16_t inp[SYM_PER_PLD*2]);
// M17 C library - lib/phy/slice.c
void slice_symbols(uint16_t out[2*SYM_PER_PLD], const float inp[SYM_PER_PLD]);
// M17 C library - lib/math/rrc.c
//sample RRC filter for 48kHz sample rate

Wyświetl plik

@ -1,5 +1,5 @@
//-------------------------------
// M17 C library - phy/interleave.h
// M17 C library - phy/interleave.c
//
// Wojciech Kaczmarski, SP5WWP
// M17 Project, 28 December 2023

Wyświetl plik

@ -1,5 +1,5 @@
//--------------------------------------------------------------------
// M17 C library - phy/randomize.h
// M17 C library - phy/randomize.c
//
// Wojciech Kaczmarski, SP5WWP
// M17 Project, 29 December 2023
@ -31,3 +31,19 @@ void randomize_bits(uint8_t inp[SYM_PER_PLD*2])
}
}
}
/**
* @brief Randomize type-4 soft bits.
*
* @param inp Input 368 soft type-4 bits.
*/
void randomize_soft_bits(uint16_t inp[SYM_PER_PLD*2])
{
for(uint16_t i=0; i<SYM_PER_PLD*2; i++)
{
if((rand_seq[i/8]>>(7-(i%8)))&1) //flip bit if '1'
{
inp[i]=soft_bit_NOT(inp[i]);
}
}
}

Wyświetl plik

@ -0,0 +1,57 @@
//-------------------------------
// M17 C library - phy/slice.c
//
// Wojciech Kaczmarski, SP5WWP
// M17 Project, 14 January 2024
//-------------------------------
#include <m17/m17.h>
/**
* @brief Slice payload symbols into soft dibits.
* Input (RRC filtered baseband sampled at symbol centers)
* should be already normalized to {-3, -1, +1 +3}.
* @param out Soft valued dibits (type-4).
* @param inp Array of 184 floats (1 sample per symbol).
*/
void slice_symbols(uint16_t out[2*SYM_PER_PLD], const float inp[SYM_PER_PLD])
{
for(uint8_t i=0; i<SYM_PER_PLD; i++)
{
//bit 0
if(inp[i]>=symbol_list[3])
{
out[i*2+1]=0xFFFF;
}
else if(inp[i]>=symbol_list[2])
{
out[i*2+1]=-(float)0xFFFF/(symbol_list[3]-symbol_list[2])*symbol_list[2]+inp[i]*(float)0xFFFF/(symbol_list[3]-symbol_list[2]);
}
else if(inp[i]>=symbol_list[1])
{
out[i*2+1]=0x0000;
}
else if(inp[i]>=symbol_list[0])
{
out[i*2+1]=(float)0xFFFF/(symbol_list[1]-symbol_list[0])*symbol_list[1]-inp[i]*(float)0xFFFF/(symbol_list[1]-symbol_list[0]);
}
else
{
out[i*2+1]=0xFFFF;
}
//bit 1
if(inp[i]>=symbol_list[2])
{
out[i*2]=0x0000;
}
else if(inp[i]>=symbol_list[1])
{
out[i*2]=0x7FFF-inp[i]*(float)0xFFFF/(symbol_list[2]-symbol_list[1]);
}
else
{
out[i*2]=0xFFFF;
}
}
}

Wyświetl plik

@ -78,52 +78,11 @@ int main(void)
if(pushed==SYM_PER_PLD)
{
//common operations for all frame types
//decode symbols to soft dibits
for(uint8_t i=0; i<SYM_PER_PLD; i++)
{
//bit 0
if(pld[i]>=symbol_list[3])
{
soft_bit[i*2+1]=0xFFFF;
}
else if(pld[i]>=symbol_list[2])
{
soft_bit[i*2+1]=-(float)0xFFFF/(symbol_list[3]-symbol_list[2])*symbol_list[2]+pld[i]*(float)0xFFFF/(symbol_list[3]-symbol_list[2]);
}
else if(pld[i]>=symbol_list[1])
{
soft_bit[i*2+1]=0x0000;
}
else if(pld[i]>=symbol_list[0])
{
soft_bit[i*2+1]=(float)0xFFFF/(symbol_list[1]-symbol_list[0])*symbol_list[1]-pld[i]*(float)0xFFFF/(symbol_list[1]-symbol_list[0]);
}
else
{
soft_bit[i*2+1]=0xFFFF;
}
//bit 1
if(pld[i]>=symbol_list[2])
{
soft_bit[i*2]=0x0000;
}
else if(pld[i]>=symbol_list[1])
{
soft_bit[i*2]=0x7FFF-pld[i]*(float)0xFFFF/(symbol_list[2]-symbol_list[1]);
}
else
{
soft_bit[i*2]=0xFFFF;
}
}
//slice symbols to soft dibits
slice_symbols(soft_bit, pld);
//derandomize
for(uint16_t i=0; i<SYM_PER_PLD*2; i++)
{
if((rand_seq[i/8]>>(7-(i%8)))&1) //soft NOT. flip soft bit if "1"
soft_bit[i]=soft_bit_NOT(soft_bit[i]);
}
randomize_soft_bits(soft_bit);
//deinterleave
reorder_soft_bits(d_soft_bit, soft_bit);