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

Сигнал время от времени инвертируется в приемнике

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

Исходные данные 1:

Bdig[itmr - 1] "111111001101010011001001001000001100010011000001110011101100111011011001110

00101001000001101000011000101110100101100010111000100110000011100000011010100110

1

00111101000100100000110100001100111100100000110100111100100111010011110101001100

0

10111001101110001010010000011010011110101111101000111011010110010010010000011010

0

11001000001101000011001111110011011100111111011101110110001100000000100000010011

1

10100011001000100010011010010110111010011110010011101001111010100110001011100110

1

11011001001011100010000011110111001000001101010011000101110010111101001111010100

1

10011111101011111001111110011010010000011010000110011111100110011000101001000001

1

01001111010000110100101100000111010111110000010010000011010111110010011100010011

0

01110110011110010000011010100110011110010000011010011110011111100111111000010110

1

11011100010111001110110010011100010100101100001000001100101111001111110101001100

1

11111010010110011111100010100100000110101110010000011010100110001011100101111010

1

01110111011100100111001010001000001100110111001111110011011100010111001110110101

0

00010000011001111110000101101001011000001110000101100000111010100110110011101011

1

11000001110001011101010011010011110100010010000011001001001000001101000011000101

1

10100101100010111000100110000011100010111010100110100111101000100100000001010001

1

01101011000001110100001100100111010011110110011101011111000001110001011101010011

0

10011110100010010000011010111001000001100011011000001110010101100110000101001001

0

11100010000011110011110011001101010111010110110001011100001011001110110110011100

0

10100100000110100111100100111001101110101111100111111001100110110010010000000101

1

01001000001101000011000101110100101100010111001000110011111100010011011001001000

0

01100110111000101110101101100010011010101001000001110110011100001111101000010110

1

111010111110100111110010" string

Принятые данные 1:

res_rec "111111001101010011001001001000001100010011000001110011101100111011011001110

00101001000001101000011000101110100101100010111000100110000011100000011010100110

1

00111101000100100000110100001100111100100000110100111100100111010011110101001100

0

10111001101110001010010000011010011110101111101000111011010110010010010000011010

0

11001000001101000011001111110011011100111111011101110110001100000000100000010011

1

10100011001000100010011010010110111010011110010011101001111010100110001011100110

1

11011001001011100010000011110111001000001101010011000101110010111101001111010100

1

10011111101011111001111110011010010000011010000110011111100110011000101001000001

1

01001111010000110100101100000111010111110000010010000011010111110010011100010011

0

01110110011110010000011010100110011110010000011010011110011111100111111000010110

1

11011100010111001110110010011100010100101100001000001100101111001111110101001100

1

11111010010110011111100010100100000110101110010000011010100110001011100101111010

1

01110111011100100111001010001000001100110111001111110011011100010111001110110101

0

00010000011001111110000101101001011000001110000101100000111010100110110011101011

1

11000001110001011101010011010011110100010010000011001001001000001101000011000101

1

10100101100010111000100110000011100010111010100110100111101000100100000001010001

1

01101011000001110100001100100111010011110110011101011111000001110001011101010011

0

10011110100010010000011010111001000001100011011000001110010101100110000101001001

0

11100010000011110011110011001101010111010110110001011100001011001110110110011100

0

10100100000110100111100100111001101110101111100111111001100110110010010000000101

1

01001000001101000011000101110100101100010111001000110011111100010011011001001000

0

01100110111000101110101101100010011010101001000001110110011100001111101000010110

1

111010111110100111110010" string

Отправленные данные 2:

Bdig[itmr - 1] "001011011110001111101001111001100010000011000100110001011100110011000001110

00000110101001101001111010001001000001100000111010111110101001100111111001101110

0

00011101010011001001110111101100010111010011110010111100100100101100001000001100

1

00111001000001000001101010011000001110010111101011011000101001000001100110111001

1

11110101101100111011001111001000001100111011000001110000101100110011000000110001

0

01100000111010100110110000010000011010111001000001101001111001111110100111100010

1

11000100110011101100010111001101001000001100111111001011110011101100010100101110

0

01000001111010011000101110011001100010111000111110100101100000111000110110011101

1

01100111001010001000001101010011010010101000111100100011010010110001011100011111

0

01001110100111101010011010010110011111101011111011001110010100010000011001011110

0

11111100010000100000111011011111010011101011001011010011001000100000110000101101

1

00111001100001000001101000011010010110010011100111011010001110101000010000011010

1

11001000001111001111110011111100111111001000100000110101110010000000110001001110

0

10011011000110011001000001100011111001111110001001101010100101110001000001110101

1

11001111110001000010000000110101001011011100001011001001110101001100111111010111

1

10110011100101000100000001010001101011111010011110001011100011111001111001000000

0

11001100110010001000001101001011000001110110101100111011011001110010000010000011

0

01011110011111100110111000010110010011100111011000001110000111100100111001001001

0

10010010110000100000110100001100111111011100110101001100111111001101110101010010

0

00011001001110100111101000011001111110011001101100011011010110101011100000011010

1

00110100111101000100100000001100110010000011010010110000011101101011001110110110

0

11100100000100000110100101100010111000111110010011101001111010100110100101100000

1

001000000010100011010010" string

Принятые данные 2:

Bsc[itmr-1] "110100100001110000010110000110011101111100111011001110100011001100111110001

11111001010110010110000101110110111110011111000101000001010110011000000110010001

1

11100010101100110110001000010011101000101100001101000011011011010011110111110011

0

11000110111110111110010101100111110001101000010100100111010110111110011001000110

0

00001010010011000100110000110111110011000100111110001111010011001100111111001110

1

10011111000101011001001111101111100101000110111110010110000110000001011000011101

0

00111011001100010011101000110010110111110011000000110100001100010011101011010001

1

10111110000101100111010001100110011101000111000001011010011111000111001001100010

0

10011000110101110111110010101100101101010111000011011100101101001110100011100000

1

10110001011000010101100101101001100000010100000100110001101011101111100110100001

1

00000011101111011111000100100000101100010100110100101100110111011111001111010010

0

11000110011110111110010111100101101001101100011000100101110001010111101111100101

0

00110111110000110000001100000011000000110111011111001010001101111111001110110001

1

01100100111001100110111110011100000110000001110110010101011010001110111110001010

0

00110000001110111101111111001010110100100011110100110110001010110011000000101000

0

01001100011010111011111110101110010100000101100001110100011100000110000110111111

1

00110011001101110111110010110100111110001001010011000100100110001101111101111100

1

10100001100000011001000111101001101100011000100111110001111000011011000110110110

1

01101101001111011111001011110011000000100011001010110011000000110010001010101101

1

11100110110001011000010111100110000001100110010011100100101001010100011111100101

0

11001011000010111011011111110011001101111100101101001111100010010100110001001001

1

00011011111011111001011010011101000111000001101100010110000101011001011010011111

0

110111111101011100101101" string

Отправленные данные 3

Bdig[itmr - 1] "110101011101001111010011110010111100100111001010001011000010000011001100110

00001110101001100100111001110110100111100101111001001110010100010110000100000110

0

00111100100111000110110100101101100100101001001011000010000011010000110001011101

0

01011000101110010111100110011000000110111101100000111000101110011011101100111000

1

01001000001101010111010000110100101100000111010111110011001101000111000000110111

0

11100100111001101110010010010000011010011110010011100110111010111110011111100110

0

11000001110011011100100100100000111100101111010111110011001011000010000011101100

1

11000011111010000101100001000001110001111101001111001100010111000100000111000101

1

01010111001011110101111101100100100000101100110010000011001110110001011101010000

1

11011001000001101011111001101110001011101001111010100110011110010000011000010110

1

01011100101111010111110110010010000011111110001000001100100111010011110100001100

1

11111001100110110001101101011001111110101111100000111001100110010010010000011000

0

11110010011100011011010010110101010010000000110100001011100000000000000000000000

0

00000000000000000000000000000000000000000000000000000000000000000000000000000000

0

00000000000000000000000000000000000000000000000000000000000000000000000000000000

0

00000000000000000000000000000000000000000000000000000000000000000000000000000000

0

00000000000000000000000000000000000000000000000000000000000000000000000000000000

0

00000000000000000000000000000000000000000000000000000000000000000000000000000000

0

00000000000000000000000000000000000000000000000000000000000000000000000000000000

0

00000000000000000000000000000000000000000000000000000000000000000000000000000000

0

00000000000000000000000000000000000000000000000000000000000000000000000000000000

0

00000000000000000000000000000000000000000000000000000000000000000000000000000000

0

000000000000000000000000" string

Принятые данные 3

Bsc[itmr-1] "110101011101001111010011110010111100100111001010001011000010000011001100110

00001110101001100100111001110110100111100101111001001110010100010110000100000110

0

00111100100111000110110100101101100100101001001011000010000011010000110001011101

0

01011000101110010111100110011000000110111101100000111000101110011011101100111000

1

01001000001101010111010000110100101100000111010111110011001101000111000000110111

0

11100100111001101110010010010000011010011110010011100110111010111110011111100110

0

11000001110011011100100100100000111100101111010111110011001011000010000011101100

1

11000011111010000101100001000001110001111101001111001100010111000100000111000101

1

01010111001011110101111101100100100000101100110010000011001110110001011101010000

1

11011001000001101011111001101110001011101001111010100110011110010000011000010110

1

01011100101111010111110110010010000011111110001000001100100111010011110100001100

1

11111001100110110001101101011001111110101111100000111001100110010010010000011000

0

11110010011100011011010010110101010010000000110100001011100000000000000000000000

0

00000000000000000000000000000000000000000000000000000000000000000000000000000000

0

00000000000000000000000000000000000000000000000000000000000000000000000000000000

0

00000000000000000000000000000000000000000000000000000000000000000000000000000000

0

00000000000000000000000000000000000000000000000000000000000000000000000000000000

0

00000000000000000000000000000000000000000000000000000000000000000000000000000000

0

00000000000000000000000000000000000000000000000000000000000000000000000000000000

0

00000000000000000000000000000000000000000000000000000000000000000000000000000000

0

00000000000000000000000000000000000000000000000000000000000000000000000000000000

0

00000000000000000000000000000000000000000000000000000000000000000000000000000000

0

000000000000000000000000" string

 

Проблема произошла только на 2 такте. Биты просто инвертировались! У меня есть БПФ. Если это может быть из-за него, поясните, пожалуйста? Если не может, то что это такое? Из-за чего примерно такие ошибки могут возникать? Заметьте, все данные передаются, приходит то количество бит, которое нужно, но в одном из циклов они просто ни с того ни с сего инвертируются!

 

Немного разобрался, проблема в кодере-декодере. У меня опорный "предыдущий" бит всегда 0, а во второй посылке он должен быть 1, поэтому декодирование происходит с точностью да наоборот. А как его проще фиксировать? Сохранять в глобальную переменную последний принятый бит?

 

Выношу на общую критику. Будем блоки обозначать в [], а сигналы просто символами. У меня такая схема:

Bdig->[Скремблер]->Bsc->[Дифференциальный кодер]->difcod->[8-PSK-демод]->Ipart и Qpart->

Bsc<-[ДеСкремблер]<-DemData<-[Дифференциальный Декодер]<-DemDifData<-[8-PSK-демод]<-Ipart и Qpart<-

 

Раньше схема работала. Но в ходе отладки я что-то поменял. и вообще, скорее проблема в том, что я сначала написал что-то не так, но чудом оно работало. А сейчас дало о себе знать.

Начал сопоставлять сигналы, сгенерированные такой системой, и понял, что difcod = DemDifData, но Вsc инверсно по отношению к DemData.

 

Сначала я подумал, что это из-за сравнения с '0' в блоке дифференциального кодирования-декодирования, но потом понял, что все посложнее. В программе я использую лишь функции difcoding(string X) и difdec(string X).

 

Вот они:

string difcoding(string X)
        {
            int c1 = 0; int[] cout = new int[X.Length]; int count = 0;
            string Y = "";

            for (int i = 0; i < X.Length; i++)
            {
                if (c1 - X[i] == 0) cout[i] = 0;
                else if (c1 - X[i] == 1) cout[i] = 1;
                else if (c1 - X[i] == -1) cout[i] = 1;
                else { }
                c1 = X[i];
                Y += cout[i];
                count++;
            }
            
            return Y;
        }

 

string difdec(string X)
        {
            char c1 = '0'; char cout = '0'; int count = 0;
            string Y = "";

            foreach (char c in X)
            {
                if (c == '1') { if (c1 == '0') cout = '1'; else if (c1 == '1') cout = '0'; }
                else if (c == '0') cout = c1;
                c1 = cout;
                Y = Y + cout;
                count++;
            }

            //Y = "001000100101111110010011";       //Проверка
            //Y = X;                 //Для перехода от фазовой модуляции к фазоразностной
            return Y;
        }

 

Вопрос раскрыт максимально, поэтому я думаю, ответ где-то рядом. Но в данный момент для меня это мистика. Просто представьте, подаем на difcoding "110001001", а на выходе difdec получаем "001110110". Но заметьте, у меня сообщение изначально было "110001001" + "110001001" + "110001001", допустим. На выходе difdec я получил лишь второе слагаемое инвертированное. Я не проверял именно эти числа, говорю просто образно, что если суммарное сообщение длинное, оно разбивается, обрабатывается кусками, а на приеме тоже обрабатывается кусками, но в итоге склеивается и дает результирующее сообщение.

 

Могу добавить. Я сделал, чтобы блок difcoding и difcod выдавали последние значения обработанных ими битов. Тогда в первом цикле все классно. Но у меня всего 3 оригинальных посылки, а потом снова все начинается с посылки 1, и так по кругу. И на 2 кругу снова инверсия... Ну логика-то где? Я хочу , чтобы каждый раз кодирование происходило относительно 0. Почему программа сейчас не согласна со мной. Как вообще может возникать инверсия?! *Магия*

 

 

string difcoding(string X, int c1, out int c2)
        {
            int[] cout = new int[X.Length]; int count = 0;
            string Y = "";

            for (int i = 0; i < X.Length; i++)
            {
                if (c1 - X[i] == 0) cout[i] = 0;
                else if (c1 - X[i] == 1) cout[i] = 1;
                else if (c1 - X[i] == -1) cout[i] = 1;
                else { }
                c1 = X[i];
                Y += cout[i];
                count++; 
            }
            c2 = c1;
            return Y;
        }

string difdec(string X, char c1, out char c2)
        {
            char cout = '0'; int count = 0;
            string Y = "";

            foreach (char c in X)
            {
                if (c == '1') { if (c1 == '0') cout = '1'; else if (c1 == '1') cout = '0'; }
                else if (c == '0') cout = c1;
                c1 = cout;
                Y = Y + cout;
                count++;
            }

            //Y = "001000100101111110010011";       //Проверка
            //Y = X;                 //Для перехода от фазовой модуляции к фазоразностной
            c2 = c1;
            return Y;
        }

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

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


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

"Почему программа сейчас не согласна со мной. Как вообще может возникать инверсия?!"

По мотивам мультфильма "Крот и жевательная резинка" - http://www.baby-news.net/mults/mult1357.html

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


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

А серьезно? Давайте на более простом уровне. Есть система, состоящая из передатчика и приемника, смотрю сигналы.

Я беру за основу факт, что без разницы, как генерируются сигналы в передатчике, но также они должны быть обработаны в приемнике, чтобы восстановить сигнал.

Вот я принимаю сигнал, сгенерированный в передатчике, приемником и смотрю - ну конечно же он такой же на самом первом шаге приема, когда сигнал еще только передан через тракт. Далее смотрю результат демодуляции - отлично, сигналы полностью совпадают. То есть сигнал уже не фазоманипулированный, но еще не прошел фазо-разностное декодирование. И вот после фазо-разностного декодирования и пошла ошибка. То сообщение не инвертируется, то инвертируется. Весело, то есть, логически, неправильно работает именно декодер.

Но вы посмотрите! Где он неправильно работает?! Если кодер кодирует все поступающие данные относительно 0, то декодер эти же данные декодирует, начиная с 0 (это коэффициент c1). Что-то случилось у меня с воображением, но я не могу понять, как может кодер инвертировать код?! А в другом цикле работы не инвертировать его.

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


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

Фазо разностное кодирование подразумевает, что текущая фаза является некой функцией от массива предыдущих конечной длины плюс/минус (оба варианта подходят, главное не путать, если в передатчике минус в приемнике поюс и наоборот) мгновенная фаза. В теории все классно, на практике, из-за разных дефектов функция может биться и результат становится неправильным.

Если в симуляторе дефекты выключены и обработка идеальна, то у вас где то ошибка дающая дефект типа Доплера или наложения. Смотрите указатели на массивы. Тут нужна точность. Промах на одну позицию и результат будет каким угодно. Инверсия еще не самый худший вариант.

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

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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