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

в 14:25, , рубрики: .net, C#, генерация сигналов, машинное обучение, нейронные сети, Радиотехника, распознавание сигналов, согласованная фильтрация, метки: ,

Я недавно опубликовал статью "Распознавание радиотехнических сигналов с помощью нейронных сетей"[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<double> lf2 = new List<double>();
       // частота дискретизации
        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<StoppedEventArgs>(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<WaveInEventArgs>(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 г.

Автор: Zachar_5

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js