Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2015, 12:29   #1
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию Сопоставляю сигналы - есть инверсия

Выношу на общую критику. Будем блоки обозначать в [], а сигналы просто символами. У меня такая схема:
Цитата:
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 я получил лишь второе слагаемое инвертированное. Я не проверял именно эти числа, говорю просто образно, что если суммарное сообщение длинное, оно разбивается, обрабатывается кусками, а на приеме тоже обрабатывается кусками, но в итоге склеивается и дает результирующее сообщение.
Krasi вне форума Ответить с цитированием
Старый 26.11.2015, 12:48   #2
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Могу добавить. Я сделал, чтобы блок 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;
        }

Последний раз редактировалось Krasi; 26.11.2015 в 12:51.
Krasi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Инверсия массива. morsss Помощь студентам 6 22.01.2014 10:38
Инверсия массива Dima-War Общие вопросы C/C++ 3 30.10.2012 22:13
Инверсия в масиве user10 Паскаль, Turbo Pascal, PascalABC.NET 2 18.04.2011 00:19
Снова Инверсия) Lag Общие вопросы C/C++ 2 10.05.2010 21:31
Инверсия Witaliy Общие вопросы Delphi 2 12.05.2008 19:23