Перейти к содержанию
    

Определить корректирующую способность BCH кода

2 hours ago, sasamy said:

https://godbolt.org/z/dd55Wjo68

Работает, но вот реализация  оказалась быстрее:

static inline unsigned int modnn1(unsigned int x)
{
 for(;x>=NN;x-=NN)asm volatile ("" ::: "memory");
 return x;
}

modnn1:
	movw	r3, #65534
	cmp	r0, r3
	bxls	lr

	sub	r0, r0, #65280
	sub	r0, r0, #255
	bx	lr

 

Удалось поднять производительность кодера - на 12%, путём замены на суммирование:

static inline unsigned int gf_sub(unsigned int x,unsigned int y)
{
 y=x-y;
 return y+(y>x)*NN; 
}

#define gf_add(x,y) gf_sub(x,NN-(y))

void encode_rs(dtype *data)
{
    dtype *bb=&data[KK];

    gf feedback;

    register int i,j;

    CLEAR(bb,EE);

    for(i=K-1;i>=0;i--)
    {

     feedback=Index_of[data[i]^bb[EE-1]];

     if(feedback!=A0) /* feedback term is non-zero */
     {
      for(j=EE-1;j>0;j--)if(Gg[j]!=A0)bb[j]=bb[j-1]^Alpha_to[ gf_add(Gg[j],feedback) /*modnn(Gg[j]+feedback)*/ ];
                         else         bb[j]=bb[j-1];

      bb[0]=Alpha_to[ gf_add(Gg[0],feedback) /*modnn(Gg[0]+feedback)*/ ];
     }
     else /* feedback term is zero. encoder becomes a single-byte shifter */
     {
      for(j=EE-1;j>0;j--)bb[j]=bb[j-1];
      bb[0]=0;
     }

    }
}

 

Но декодер, плохо поддаётся оптимизации.  Было 14.3 FPS,  стало 14.6

 

2 minutes ago, thermit said:

Вы-то что хотите?

Ускорить работу декодера с 14 FPS , до 16.  Это как минимум.  В идеале - больше, чтобы больше ошибок исправлялось.

14,6 уже есть.

5 minutes ago, thermit said:

Все вычисления только через таблицу.

Слишком хаотичные выборки из таблицы.  Кеш мажет. С увеличением таблицы  - падает производительность.  Это в GF 2^8  всё быстро, так как таблицы небольшие.  Для GF 2^16 таблицы раздуваются.

Пробовал жать RAR-архивом таблицы Index_Of, Alpha_to - практически не сжимаются. Потому что хаоса там предостаточно.

8 minutes ago, repstosw said:
static inline unsigned int gf_sub(unsigned int x,unsigned int y)
{
 y=x-y;
 return y+(y>x)*NN; 
}

Асм даёт вот такое изящество - без условий, от того и быстро работает кодер:

gf_sub:
	subs	r0, r0, r1
	addcc	r0, r0, #65280
	addcc	r0, r0, #255
	bx	lr

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 минуты назад, repstosw сказал:

Работает, но вот реализация  оказалась быстрее:

static inline unsigned int modnn1(unsigned int x)
{
 for(;x>=NN;x-=NN)asm volatile ("" ::: "memory");
 return x;
}

modnn1:
	movw	r3, #65534
	cmp	r0, r3
	bxls	lr

	sub	r0, r0, #65280
	sub	r0, r0, #255
	bx	lr

 

Удалось поднять производительность кодера - на 12%, путём замены на суммирование:

static inline unsigned int gf_sub(unsigned int x,unsigned int y)
{
 y=x-y;
 return y+(y>x)*NN; 
}

#define gf_add(x,y) gf_sub(x,NN-(y))

void encode_rs(dtype *data)
{
    dtype *bb=&data[KK];

    gf feedback;

    register int i,j;

    CLEAR(bb,EE);

    for(i=K-1;i>=0;i--)
    {

     feedback=Index_of[data[i]^bb[EE-1]];

     if(feedback!=A0) /* feedback term is non-zero */
     {
      for(j=EE-1;j>0;j--)if(Gg[j]!=A0)bb[j]=bb[j-1]^Alpha_to[ gf_add(Gg[j],feedback) /*modnn(Gg[j]+feedback)*/ ];
                         else         bb[j]=bb[j-1];

      bb[0]=Alpha_to[ gf_add(Gg[0],feedback) /*modnn(Gg[0]+feedback)*/ ];
     }
     else /* feedback term is zero. encoder becomes a single-byte shifter */
     {
      for(j=EE-1;j>0;j--)bb[j]=bb[j-1];
      bb[0]=0;
     }

    }
}

 

Но декодер, плохо поддаётся оптимизации.  Было 14.3 FPS,  стало 14.6

 

Ускорить работу декодера с 14 FPS , до 16.  Это как минимум.  В идеале - больше, чтобы больше ошибок исправлялось.

14,6 уже есть.

Рс  обычно в каскаде используется. Со сверточным. Ну или с другим блочным, типа хемминга.  Ну или  советую использовать коды типа турбо. Но сильно перформанса это вам не добавит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/2/2023 at 8:15 PM, repstosw said:

Но декодер, плохо поддаётся оптимизации.  Было 14.3 FPS,  стало 14.6

а сколько это мегабит в секунду ? попробовал симулятор на этом процессоре (t113-s3) в линуксе кодирование + декодирование и мне кажется он значительно больше показывает - порядка 1.340 Mb/s, ваши параметры не знаю - пальцем в небо ткнул исправлять 100 ошибок на 2047 символов

https://github.com/aff3ct/aff3ct

 

Quote

# aff3ct -C "RS" -T 100 -N 2047 -m 1.0 -M 5.0 -s 1.0
# ----------------------------------------------------
# ---- A FAST FORWARD ERROR CORRECTION TOOLBOX >> ----
# ----------------------------------------------------
# Parameters:
# * Simulation ------------------------------------
#    ** Type                   = BFER
#    ** Type of bits           = int32
#    ** Type of reals          = float32
#    ** Date (UTC)             = 1970-01-02 01:30:41
#    ** Git version            = v3.0.2
#    ** Code type (C)          = RS
#    ** Noise range            = 1 -> 5 dB
#    ** Noise type (E)         = EBN0
#    ** Seed                   = 0
#    ** Statistics             = off
#    ** Debug mode             = off
#    ** Inter frame level      = 1
#    ** Multi-threading (t)    = 2 thread(s)
#    ** Coset approach (c)     = no
#    ** Coded monitoring       = no
#    ** Bad frames tracking    = off
#    ** Bad frames replay      = off
#    ** Bit rate               = 0.902296 (1847/2047)
# * Source ----------------------------------------
#    ** Type                   = RAND
#    ** Implementation         = STD
#    ** Info. bits (K_info)    = 20317
# * Codec -----------------------------------------
#    ** Type                   = RS
#    ** Info. bits (K)         = 20317
#    ** Codeword size (N_cw)   = 22517
#    ** Frame size (N)         = 22517
#    ** Code rate              = 0.902296 (1847/2047)
#    ** Symbols Source size    = 1847
#    ** Symbols Codeword size  = 2047
# * Encoder ---------------------------------------
#    ** Type                   = RS
#    ** Systematic             = yes
# * Decoder ---------------------------------------
#    ** Type (D)               = ALGEBRAIC
#    ** Implementation         = STD
#    ** Systematic             = yes
#    ** Galois field order (m) = 11
#    ** Correction power (T)   = 100
# * Modem -----------------------------------------
#    ** Type                   = BPSK
#    ** Implementation         = STD
#    ** Bits per symbol        = 1
#    ** Sigma square           = on
# * Channel ---------------------------------------
#    ** Type                   = AWGN
#    ** Implementation         = STD
#    ** Complex                = off
#    ** Add users              = off
# * Monitor ---------------------------------------
#    ** Lazy reduction         = off
#    ** Frame error count (e)  = 100
#    ** Compute mutual info    = no
# * Terminal --------------------------------------
#    ** Show Sigma             = off
#    ** Enabled                = yes
#    ** Frequency (ms)         = 500
#
# The simulation is running...
# ---------------------||------------------------------------------------------||---------------------
#  Signal Noise Ratio  ||   Bit Error Rate (BER) and Frame Error Rate (FER)    ||  Global throughput  
#         (SNR)        ||                                                      ||  and elapsed time   
# ---------------------||------------------------------------------------------||---------------------
# ----------|----------||----------|----------|----------|----------|----------||----------|----------
#     Es/N0 |    Eb/N0 ||      FRA |       BE |       FE |      BER |      FER ||  SIM_THR |    ET/RT
#      (dB) |     (dB) ||          |          |          |          |          ||   (Mb/s) | (hhmmss)
# ----------|----------||----------|----------|----------|----------|----------||----------|----------
       0.55 |     1.00 ||      101 |   134929 |      101 | 6.58e-02 | 1.00e+00 ||    1.330 | 00h00'01   
       1.55 |     2.00 ||      102 |    94278 |      102 | 4.55e-02 | 1.00e+00 ||    1.344 | 00h00'01   
       2.55 |     3.00 ||      102 |    59862 |      102 | 2.89e-02 | 1.00e+00 ||    1.340 | 00h00'01   
       3.55 |     4.00 ||      102 |    34270 |      102 | 1.65e-02 | 1.00e+00 ||    1.345 | 00h00'01   
       4.55 |     5.00 ||      102 |    17291 |      102 | 8.34e-03 | 1.00e+00 ||    1.344 | 00h00'01   
# End of the simulation.

 

 

тоже самое но исправлять 200 шибок 0.66 Mb/s

Quote

# aff3ct -C "RS" -T 200 -N 2047 -m 1.0 -M 5.0 -s 1.0
# ----------------------------------------------------
# ---- A FAST FORWARD ERROR CORRECTION TOOLBOX >> ----
# ----------------------------------------------------
# Parameters:
# * Simulation ------------------------------------
#    ** Type                   = BFER
#    ** Type of bits           = int32
#    ** Type of reals          = float32
#    ** Date (UTC)             = 1970-01-02 02:25:00
#    ** Git version            = v3.0.2
#    ** Code type (C)          = RS
#    ** Noise range            = 1 -> 5 dB
#    ** Noise type (E)         = EBN0
#    ** Seed                   = 0
#    ** Statistics             = off
#    ** Debug mode             = off
#    ** Inter frame level      = 1
#    ** Multi-threading (t)    = 2 thread(s)
#    ** Coset approach (c)     = no
#    ** Coded monitoring       = no
#    ** Bad frames tracking    = off
#    ** Bad frames replay      = off
#    ** Bit rate               = 0.804592 (1647/2047)
# * Source ----------------------------------------
#    ** Type                   = RAND
#    ** Implementation         = STD
#    ** Info. bits (K_info)    = 18117
# * Codec -----------------------------------------
#    ** Type                   = RS
#    ** Info. bits (K)         = 18117
#    ** Codeword size (N_cw)   = 22517
#    ** Frame size (N)         = 22517
#    ** Code rate              = 0.804592 (1647/2047)
#    ** Symbols Source size    = 1647
#    ** Symbols Codeword size  = 2047
# * Encoder ---------------------------------------
#    ** Type                   = RS
#    ** Systematic             = yes
# * Decoder ---------------------------------------
#    ** Type (D)               = ALGEBRAIC
#    ** Implementation         = STD
#    ** Systematic             = yes
#    ** Galois field order (m) = 11
#    ** Correction power (T)   = 200
# * Modem -----------------------------------------
#    ** Type                   = BPSK
#    ** Implementation         = STD
#    ** Bits per symbol        = 1
#    ** Sigma square           = on
# * Channel ---------------------------------------
#    ** Type                   = AWGN
#    ** Implementation         = STD
#    ** Complex                = off
#    ** Add users              = off
# * Monitor ---------------------------------------
#    ** Lazy reduction         = off
#    ** Frame error count (e)  = 100
#    ** Compute mutual info    = no
# * Terminal --------------------------------------
#    ** Show Sigma             = off
#    ** Enabled                = yes
#    ** Frequency (ms)         = 500
#
# The simulation is running...
# ---------------------||------------------------------------------------------||---------------------
#  Signal Noise Ratio  ||   Bit Error Rate (BER) and Frame Error Rate (FER)    ||  Global throughput  
#         (SNR)        ||                                                      ||  and elapsed time   
# ---------------------||------------------------------------------------------||---------------------
# ----------|----------||----------|----------|----------|----------|----------||----------|----------
#     Es/N0 |    Eb/N0 ||      FRA |       BE |       FE |      BER |      FER ||  SIM_THR |    ET/RT
#      (dB) |     (dB) ||          |          |          |          |          ||   (Mb/s) | (hhmmss)
# ----------|----------||----------|----------|----------|----------|----------||----------|----------
       0.06 |     1.00 ||      102 |   142719 |      102 | 7.72e-02 | 1.00e+00 ||    0.663 | 00h00'02   
       1.06 |     2.00 ||      102 |   101748 |      102 | 5.51e-02 | 1.00e+00 ||    0.663 | 00h00'02   
       2.06 |     3.00 ||      102 |    67254 |      102 | 3.64e-02 | 1.00e+00 ||    0.663 | 00h00'02   
       3.06 |     4.00 ||      102 |    40828 |      102 | 2.21e-02 | 1.00e+00 ||    0.663 | 00h00'02   
       4.06 |     5.00 ||      102 |    21950 |      102 | 1.19e-02 | 1.00e+00 ||    0.663 | 00h00'02   
# End of the simulation.

 

исправлять 300 ошибок 0.39 Mb/s

Quote

# aff3ct -C "RS" -T 300 -N 2047 -m 1.0 -M 5.0 -s 1.0
# ----------------------------------------------------
# ---- A FAST FORWARD ERROR CORRECTION TOOLBOX >> ----
# ----------------------------------------------------
# Parameters:
# * Simulation ------------------------------------
#    ** Type                   = BFER
#    ** Type of bits           = int32
#    ** Type of reals          = float32
#    ** Date (UTC)             = 1970-01-02 02:22:40
#    ** Git version            = v3.0.2
#    ** Code type (C)          = RS
#    ** Noise range            = 1 -> 5 dB
#    ** Noise type (E)         = EBN0
#    ** Seed                   = 0
#    ** Statistics             = off
#    ** Debug mode             = off
#    ** Inter frame level      = 1
#    ** Multi-threading (t)    = 2 thread(s)
#    ** Coset approach (c)     = no
#    ** Coded monitoring       = no
#    ** Bad frames tracking    = off
#    ** Bad frames replay      = off
#    ** Bit rate               = 0.706888 (1447/2047)
# * Source ----------------------------------------
#    ** Type                   = RAND
#    ** Implementation         = STD
#    ** Info. bits (K_info)    = 15917
# * Codec -----------------------------------------
#    ** Type                   = RS
#    ** Info. bits (K)         = 15917
#    ** Codeword size (N_cw)   = 22517
#    ** Frame size (N)         = 22517
#    ** Code rate              = 0.706888 (1447/2047)
#    ** Symbols Source size    = 1447
#    ** Symbols Codeword size  = 2047
# * Encoder ---------------------------------------
#    ** Type                   = RS
#    ** Systematic             = yes
# * Decoder ---------------------------------------
#    ** Type (D)               = ALGEBRAIC
#    ** Implementation         = STD
#    ** Systematic             = yes
#    ** Galois field order (m) = 11
#    ** Correction power (T)   = 300
# * Modem -----------------------------------------
#    ** Type                   = BPSK
#    ** Implementation         = STD
#    ** Bits per symbol        = 1
#    ** Sigma square           = on
# * Channel ---------------------------------------
#    ** Type                   = AWGN
#    ** Implementation         = STD
#    ** Complex                = off
#    ** Add users              = off
# * Monitor ---------------------------------------
#    ** Lazy reduction         = off
#    ** Frame error count (e)  = 100
#    ** Compute mutual info    = no
# * Terminal --------------------------------------
#    ** Show Sigma             = off
#    ** Enabled                = yes
#    ** Frequency (ms)         = 500
#
# The simulation is running...
# ---------------------||------------------------------------------------------||---------------------
#  Signal Noise Ratio  ||   Bit Error Rate (BER) and Frame Error Rate (FER)    ||  Global throughput  
#         (SNR)        ||                                                      ||  and elapsed time   
# ---------------------||------------------------------------------------------||---------------------
# ----------|----------||----------|----------|----------|----------|----------||----------|----------
#     Es/N0 |    Eb/N0 ||      FRA |       BE |       FE |      BER |      FER ||  SIM_THR |    ET/RT
#      (dB) |     (dB) ||          |          |          |          |          ||   (Mb/s) | (hhmmss)
# ----------|----------||----------|----------|----------|----------|----------||----------|----------
      -0.51 |     1.00 ||      101 |   146269 |      101 | 9.10e-02 | 1.00e+00 ||    0.394 | 00h00'04   
       0.49 |     2.00 ||      102 |   108893 |      102 | 6.71e-02 | 1.00e+00 ||    0.397 | 00h00'04   
       1.49 |     3.00 ||      102 |    75191 |      102 | 4.63e-02 | 1.00e+00 ||    0.397 | 00h00'04   
       2.49 |     4.00 ||      102 |    48286 |      102 | 2.97e-02 | 1.00e+00 ||    0.397 | 00h00'04   
       3.49 |     5.00 ||      102 |    28165 |      102 | 1.73e-02 | 1.00e+00 ||    0.397 | 00h00'04   
# End of the simulation.

 

 

Изменено пользователем sasamy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, sasamy said:

а сколько это мегабит в секунду ? попробовал симулятор на этом процессоре (t113-s3) в линуксе кодирование + декодирование и мне кажется он значительно больше показывает - порядка 1.340 Mb/s, ваши параметры не знаю - пальцем в небо ткнул исправлять 100 ошибок на 2047 символов

Параметры такие:

M=16 (GF 2^16)  -- степень полинома (Galois field order)

NN = 65535 -- общая длина блока в 16-битных символах

EE = 584 -- размер блока проверочных символов

K = 2392 -- размер блока полезных символов (отличается от KK = NN - EE )

image.thumb.png.d578d99360878a14fca87e8e750a6d83.png

Оптимизированный мод даёт на T113-s3 (1200 МГц) такие показатели -

причём время декодирования здесь в случае, когда число ошибок максимально и декодер может восстановить пакет (число ошибок = половина от числа проверочных символов).

Ясен фиг, что если ошибок будет меньше - декодирование пойдёт быстрее.

T113-s3...
FEC
T113-s3 CPU ===> Encode: 35.68 FPS   Decode: 14.60 FPS
T113-s3 CPU ===> Encode: 35.71 FPS   Decode: 14.60 FPS
T113-s3 CPU ===> Encode: 35.70 FPS   Decode: 14.60 FPS
T113-s3 CPU ===> Encode: 35.70 FPS   Decode: 14.62 FPS
T113-s3 CPU ===> Encode: 35.70 FPS   Decode: 14.61 FPS
T113-s3 CPU ===> Encode: 35.71 FPS   Decode: 14.60 FPS
T113-s3 CPU ===> Encode: 35.70 FPS   Decode: 14.63 FPS
T113-s3 CPU ===> Encode: 35.70 FPS   Decode: 14.61 FPS
T113-s3 CPU ===> Encode: 35.68 FPS   Decode: 14.60 FPS
T113-s3 CPU ===> Encode: 35.69 FPS   Decode: 14.64 FPS
T113-s3 CPU ===> Encode: 35.72 FPS   Decode: 14.62 FPS
T113-s3 CPU ===> Encode: 35.70 FPS   Decode: 14.63 FPS
T113-s3 CPU ===> Encode: 35.71 FPS   Decode: 14.60 FPS

 

Воркбенч с кодеком приложил:   rs_fec.zip

Суть моей оптимизации - ускорение поиска Ченя:  упрощены вычисления, на промежутке [ K  .. KK - 1 ], где находятся нули в блоке (не используются):

Spoiler
 /*
     * Find roots of the error+erasure locator polynomial. By Chien
     * Search
     */
    COPY(&reg[1],&lambda[1],EE);

    count = 0;		/* Number of roots of lambda(x) */
 
for (i = NN-1; i >= KK; i--) //Parity
{
        q = 1;

        for (j = deg_lambda; j > 0; j--)
            if (reg[j] != A0 )
            {
             reg[j]= /*gf_add(reg[j],j)*/ modnn1(reg[j]+j) ;
             q ^= Alpha_to[reg[j]];
            }

//          if(q)continue;
        if (!q) {
            /* store root (index-form) and error location number */
            root[count] =NN-i;
//          loc[count] = i;    //позиции ошибочных байт
  //        count++;
            if(++count==deg_lambda)break;
        }

}

for(j=deg_lambda;j>0;j--)if(reg[j]!=A0)reg[j]= /*gf_add(reg[j],nool[j])*/ modnnF(reg[j]+(j*(KK-K))) /*modnn1(reg[j]+nool[j])*/ ; //!!!

for (i = K-1; i >= 0 ; i--) //Data
{
        q = 1;

        for (j = deg_lambda; j > 0; j--)
            if (reg[j] != A0)
            {
             reg[j]= /*gf_add(reg[j],j)*/ modnn1(reg[j]+j) ;
             q ^= Alpha_to[reg[j]] ;
            }

//          if(q)continue;
        if (!q) {
            /* store root (index-form) and error location number */
            root[count] =NN-i;
//          loc[count] = i;    //позиции ошибочных байт
//          count++;
            if(++count==deg_lambda)break;
        }
}

 

 

1 hour ago, sasamy said:

исправлять 300 ошибок 0.39 Mb/s

Galois field order = 11.   Нечестно!   У меня 16 : как раз чтобы 2 байта компактно разместить в один символ.

И ошибок по-больше.

Параметры блока напиcал в предыдущем посте.

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/3/2023 at 1:15 PM, repstosw said:

Galois field order = 11.   Нечестно!   У меня 16 : как раз чтобы 2 байта компактно разместить в один символ.

16 не получается симулировать система аварийно завершает симулятор, да и зачем если он такой тормозной :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/3/2023 at 3:24 AM, thermit said:

Рс  обычно в каскаде используется. Со сверточным.

Слишком дорогое удовольствие - сверточный кодер.  CR = 1/2, 1/3, 1/6.

Я могу позволить выделить на проверочные символы не более 1/4. (25%) от всего фрейма.

Имплементация сверточного кодера с CR  3/4 ,  4/5,  5/6,  7/8  - существует?   На сях.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, repstosw сказал:

Слишком дорогое удовольствие - сверточный кодер.  CR = 1/2, 1/3, 1/6.

Я могу позволить выделить на проверочные символы не более 1/4. (25%) от всего фрейма.

Имплементация сверточного кодера с CR  3/4 ,  4/5,  5/6,  7/8  - существует?   На сях.

3/4 и все такое получаются из 1/4 через выкалывание. Реализации существуют. Надо в хухеле поискать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23 hours ago, thermit said:

3/4 и все такое получаются из 1/4 через выкалывание. Реализации существуют. Надо в хухеле поискать.

"Прикольный" ответ.  Предполагалось, что задавший вопрос излазил весь интернет в поисках нужного, и не найдя, задал вопрос здесь.

Плюс декодирование Витерби: каким образом восстанавливается то, что выкололи или чем замещается?

Вопрос имплементации свёрточника 3/4 на Си остаётся в силе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, repstosw сказал:

"Прикольный" ответ.  Предполагалось, что задавший вопрос излазил весь интернет в поисках нужного, и не найдя, задал вопрос здесь.

Плюс декодирование Витерби: каким образом восстанавливается то, что выкололи или чем замещается?

Вопрос имплементации свёрточника 3/4 на Си остаётся в силе.

Мне своим кодом делиться не хочется. Уж извините. А выкалывание делается так: на передающей стороне на 3 входных бита получаем 12 на выходе кодера. 8 бит выкидываются.  Получаем 3/4. На приемной стороне недостающие биты заполняются 0. Корректирующие свойства такого кода не очень.  Ну и http://www.eccpage.com. Очень полезный.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, thermit said:

А выкалывание делается так: на передающей стороне на 3 входных бита получаем 12 на выходе кодера. 8 бит выкидываются.  Получаем 3/4. На приемной стороне недостающие биты заполняются 0.

Исчерпывающе. Попробую из 1/2 сделать 3/4.

1 hour ago, thermit said:

Ну и http://www.eccpage.com. Очень полезный.

Неплохо. Правда Generic всё - придется оптимизировать.

 

Немного удалось поднять скорость кодера RS на нужных мне параметрах (2976 символов сообщения + 584 проверочных, GF 2^16). 

На Allwinner T113-s3 (ARM A7, 1200 МГц) кодирование было 32 FPS, стало 39.  Изначально вообще было 6 FPS (без укорочения циклов до длины полезной части сообщения)

С декодированием  всё хуже,  самые ресурсоёмкие места:  поиск синдромов и Чень.  Второй уже ускорен, с первым не получается.

Поиск синдромов:

//Alpha_to - статический массив
//modnn - остаток от деления на 65535.
//K - число символов сообщения
//EE - число проверочных символов
//KK - число сивмволов сообщения + нули
  
    for(i=0;i<K+EE;i++)recd[i]=Index_of[data[i]]; /* data[] is in polynomial form, copy and convert to index form */

    /* first form the syndromes; i.e., evaluate recd(x) at roots of g(x)
     * namely @**(B0+i), i = 0, ... ,(EE-1)
     */

    syn_error=0;

    for(i=0;i<EE;i++)
    {
     tmp=0;

     unsigned int w[2]={0,i*KK};
     gf *v[2]={&recd[0],&recd[K]};
     int n[2]={K,EE};

     while(n[0]--)
     {
      if(*v[0]!=A0)tmp^=Alpha_to[modnnF(*v[0]+w[0])];
      v[0]++;
      w[0]+=i;
     }

     while(n[1]--)
     {
      if(*v[1]!=A0)tmp^=Alpha_to[modnnF(*v[1]+w[1])];
      v[1]++;
      w[1]+=i;
     }

     syn_error|=tmp;	   /* set flag if non-zero syndrome => error */

     s[i+1]=Index_of[tmp]; /* store syndrome in index form  */
    }

    if(!syn_error)
    {
        /*
         * if syndrome is zero, data[] is a codeword and there are no
         * errors to correct. So return data[] unmodified
         */
     printf("Syndrome OK!\n");
     return 0;

 

Было: 14,3 FPS, стало 14,7 FPS (изначально было 2,3 FPS).  Что можно ещё придумать с кодом выше?

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разве что убрать объявление переменных внутри цикла ну и избавится от +1 при индексировании. Принципиально тут ничего оптимизировать нельзя.

Изменено пользователем thermit

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/6/2023 at 2:48 AM, thermit said:

Принципиально тут ничего оптимизировать нельзя.

Сейчас смотрю в сторону преобразований Винограда и Китайскую теорему об остатках.   Есть научные выкладки на сайте nasa.gov , что в алгоритме поиска синдромов  можно сократить вычисления.

Пришлось курить линейную алгебру, вспоминать матрицы, вектора и операции над ними.

 

Пока работаю в поле GF(2^4) - это  всего 16 элементов: 0..15

Собственно вопрос, как определить третий и пятый корни ?  Порождающий полином:  1 + x + x^3.   Поле GF(16)   GF(2^4)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 hours ago, repstosw said:

Собственно вопрос, как определить третий и пятый корни ?  Порождающий полином:  1 + x + x^3.   Поле GF(16)   GF(2^4)

Вопрос решён.

Сделал имплементацию 3-точечного преобразования на Си - для GF(2^4): цикл нахождения синдромов длиной 15 итераций сжался до длины 5 итераций.

Результат сравнил с результатами по старому методу.

https://ipnpr.jpl.nasa.gov/progress_report/42-43/43Q.PDF

Значит, аналогично можно сделать и для GF(2^16).

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ещё одна статья, как быстро считать синдромы, применяя много-ступенчатое преобразование: https://ipnpr.jpl.nasa.gov/progress_report2/42-52/52J.PDF

И ещё https://ipnpr.jpl.nasa.gov/progress_report2/42-54/54K.PDF

Сделал 4-х ступенчатые преобразования для:

GF(2^16):  3*5*17*257 и  GF(2^12): 5*7*9*13

Выигрыш в скорости нахождения синдромов ошибок с помощью разложений - колоссален.

Теперь слабым местом  стал поиск Ченя.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/13/2023 at 11:24 AM, repstosw said:

Теперь слабым местом  стал поиск Ченя.

Оптимизировал и его.  Результат:   

 

Декодирование ускорено в 2.6 раз, кодирование - в 1.8 раз (по сравнению с исходным вариантом, для Cortex-A7).

https://github.com/rep-stosw/reed-solomon

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...