Сравнение методов распознавания сигналов. Нейронные сети против согласованного фильтра

Я недавно опубликовал статью «Распознавание радиотехнических сигналов с помощью нейронных сетей»[1]. И там была довольно длинная и интересная дискуссия по поводу возможности использования для этих целей согласованного фильтра (СФ). Разумеется, использовать согласованные фильтры для той задачи, что решалась, проблематично. Но меня заинтересовал другой вопрос, что лучше использовать при незначительных колебаниях параметров сигнала, нейронные сети (НС) или СФ. В качестве генератора сигнала буду использовать обычный мультивибратор. Подавать сигнал буду через звуковую карту, а далее распознавать с помощью метода описанного в [1] и с помощью согласованного фильтра. Далее ПО сравнит результаты и даст ответ какой метод лучше.



Часть 1. Генератор сигнала


Для того чтобы сравнение было адекватным, будем распознавать РЕАЛЬНЫЙ сигнал. Для его создания нужен генератор. Так же понадобится генератор шума. Сигнал будем генерировать с помощью мультивибратора. И чтобы «не лезли» ВЧ составляющие на выход надо поставить ФНЧ. Питание осуществляется от USB. Диапазон подаваемого напряжения на аудио карту должен быть в пределах 0.001 — 1.5В. А выход с мультивибратора лежит от 0 до 5В. Для ограничения напряжения будем использовать Г-образный делитель. Ниже представлена принципиальная схема генератора.
image


Делать с нуля я его не стал, т.к. на втором курсе, в рамках хакатона, собирал предусилитель кардиосигнала для съема кардиоинтервалограммы, который отличается только отсутствием ПОС между двумя каскадами. Поэтому я ограничился добавлением этой связи. Вот что в итоге получилось.


Внешний вид:
image


Во время работы:
image


В качестве генератора белого шума, я использовал метод randNorm из своей мат. библиотеки AI.MathMod для языка C#.


Часть 2. Прием сигнала


Для приема и записи сигнала я использовал библиотеку NAudio для языка C#. Далее надо создать для записи сигнала. В начале подключаем пространства имен.


using System;
using System.Collections.Generic;
using NAudio.Wave;
using AI.MathMod.AdditionalFunctions;
using AI.MathMod;

Объявляем глобальные переменные:


         // WaveIn - поток для записи
        WaveIn waveIn;
        //Блок сигнала
        List lf2 = new List();
       // частота дискретизации
        double fd = 500,
       //Время записи 
       timeRec = 5;
      //Записанный сигнал
      Vector signal = new Vector();

      // отсчеты по амплитуде
      public Vector Signal
      {
          get{return signal;}
      }

       // Отсчеты по времени
      public Vector Time
      {
          get{return MathFunc.GenerateTheSequence(0,signal.N);}
      }

И метод для начала записи (взято от сюда: «http://www.cyberforum.ru/csharp-beginners/thread520949.html»):


void Start(){
            try
        {

            waveIn = new WaveIn();
            //Дефолтное устройство для записи (если оно имеется)
            waveIn.DeviceNumber = 0;
           //Прикрепляем к событию DataAvailable обработчик, возникающий при наличии записываемых данных
            waveIn.DataAvailable += waveIn_DataAvailable;
            //Прикрепляем обработчик завершения записи
            waveIn.RecordingStopped += new EventHandler(waveIn_RecordingStopped);
            //Формат wav-файла - принимает параметры - частоту дискретизации и количество каналов(здесь mono)
            waveIn.WaveFormat = new WaveFormat(fd,16,1);
            //Начало записи
            waveIn.StartRecording();
            }
            catch{}
         }

Сама запись:


//Получение данных из входного буфера 
        void waveIn_DataAvailable(object sender, WaveInEventArgs e)
        {

            if (this.InvokeRequired)
            {
                this.BeginInvoke(new EventHandler(waveIn_DataAvailable), sender, e);
            }
            else
            {
                lf2.Clear();

                for (var i = 0; i < e.Buffer.Length; i += 2) {
                    double sample = BitConverter.ToInt16(e.Buffer, i) / 32768.0;
                    lf2.Add(sample);
                }
                   signal.Add(lf2.ToArray());

                  if(signal.N>=(timeRec*fd)) Stop(); // Завершение записи
            }
        }

Часть 3. Согласованный фильтр


Теперь надо создать модель согласованного фильтра. СФ состоит из согласованного фильтра для одиночного импульса (СФОИ), линий задержки (ЛЗ) и сумматора. СФОИ для прямоугольного импульса состоит из интегратора, ЛЗ, инвертора и сумматора. Ниже представлена структурная схема.[2]
image


Из-за того что периоды следования импульсов равны как и длительности импульсов, можно использовать вместо набора линий задержек только одну, поставить так называемый рециркулятор с накопителем.[3] В нашем случае идеальный, без потерь. Структурная схема СФ.
image
Подробнее о структуре и расчетах СФ можете почитать в [2 стр. 415 — 427] и [3 стр. 563 — 598].


При вероятности нахождения там сигнала >0.6 принимается решение, что сигнал зарегистрирован.


Часть 4. ПО для сравнения


Архитектура программа в своей структуре содержит «два флажка»,


     bool flag1 = false;
     bool flag2 = false;

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


Итог


Было проведено 20 экспериментов, в которых использовался, согласованный фильтр настроенный на исследуемый сигнал, ОСШ = 0.4, результат: 16:4 в пользу СФ. После чего была изменена длительность сигнала на 5%, результат: 2:18 в пользу НС. Из этого можно сделать вывод, что при ИЗВЕСТНЫХ параметрах СФ работает намного лучше чем ИНС, но когда параметры не известны, или могут варьироваться, целесообразней использовать ИНС.


Литература:


  1. Распознавание радиотехнических сигналов с помощью нейронных сетей.
    (https://habrahabr.ru/post/318832)
  2. Баскаков С.И. Радиотехнические цепи и сигналы. М.: Высшая школа, 2-е издание.
  3. Гоноровский И.С. Радиотехнические цепи и сигналы. М.: Дрофа, 5-е издание. 2006 г.

Комментарии (9)

  • 14 января 2017 в 17:42

    0

    Может быть стоило более подробно рассказать? Больше похоже на выдержку из какой-то статьи в университетский научный журнал, особенно со всеми этими ссылками на литературу.
    • 14 января 2017 в 17:56

      0

      К прежней статье тоже самое писали, да я раньше писал в университетские журналы, и как по другому оформлять публикации не знаю, какие подробности Вас интересуют?

      • 14 января 2017 в 18:10

        0

        Убрать банальщину
        Архитектура программа в своей структуре содержит «два флажка»,
             bool flag1 = false;
             bool flag2 = false;
        

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



        И добавить тестовый код, входные данные и вывод приложений.
      • 14 января 2017 в 18:22

        0

        Например вместо «Подробнее о структуре и расчетах СФ можете почитать в» можно было бы рассказать на простом языке с примерами, расчетами и объяснениями. На мой взгляд, вместо ссылок на книги необходимо приводить целиком объяснение что, почему и откуда взято. Где сами результаты экспериметов, таблицы, графики?
  • 14 января 2017 в 20:40

    0

    А разве вы использововали «согласованный фильтр»? Для простого сигнала, насколько я помню такого термина не вводят, так для обычного прямоугольного радиоимпульса соглавованным является простейший полосовой фильтр со спектральной характеристикой максимально соответствующей спектру прямоугольного радиоимпульса — sin (x)/x. Понятие согласованного фильра вводится для сложных сигналов, у которы база B>>1. Суть в том что отклик на выходе соглаванного фильтра повторяет автокореляционную функцию сигнала, что существенно повышает соотношение сигнал/шум. Интересно было бы посмотреть на такие эксперименты, например сравнение нейронной сети для распознания сигналов на основе М-последовательностей.
    • 14 января 2017 в 20:53

      0

      Нет вводят, тут я скинул статью в Википедии, где говорится о согласованном фильтре для прямоугольного сигнала.


      https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D0%B3%D0%BB%D0%B0%D1%81%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80


      Так же о нем написано у Баскакова на 425 стр.

  • 14 января 2017 в 20:48 (комментарий был изменён)

    0

    Из этого можно сделать вывод, что при ИЗВЕСТНЫХ параметрах СФ работает намного лучше чем ИНС, но когда параметры не известны, или могут варьироваться, целесообразней использовать ИНС.

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


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


    Т.е. если у вас сигнал и помеха являются стационарными процессами, всегда можно построить линейный фильтр который обойдет любую ИНС (если она сама не повторяет линейный фильтр).

    • 14 января 2017 в 20:56

      0

      На счет согласования со всей системой, мы на лекциях не проходили, да и в книгах не находил, Вы есть в ВК? Было бы интересно с Вами пообщаться.

      • 14 января 2017 в 21:11

        0

        Да беспроблем, пишите https://vk.com/kreshikhin

© Habrahabr.ru