Pull to refresh

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

.NET *C# *Machine learning *

Я недавно опубликовал статью "Распознавание радиотехнических сигналов с помощью нейронных сетей"[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)/fd;}
      }

И метод для начала записи (взято отсюда):


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


Так же накопитель дает увеличение ОСШ в $\sqrt m$ раз, где m количество импульсов в пачке. Из-за дороговизны и сложности реализации ЛЗ, в реальных задачах все чаще используют метод с цифровым накоплением. Тогда вероятность ложной тревоги и верного обнаружения задаются следующими соотношениями:


$\\P_F = \sum^m_{i=1} P^i_{F_0} \cdot C_m^i (1-P_{F_0})^{m-i} \\P_D = \sum^m_{i=1} P^i_{D_0} \cdot C_m^i (1-P_{D_0})^{m-i}$


Структура накопителя(все коеф. "а" = 1):
image


Схематично работа накопителя представлена ниже:
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. Распознавание радиотехнических сигналов с помощью нейронных сетей.
  2. Баскаков С.И. Радиотехнические цепи и сигналы. М.: Высшая школа, 2-е издание.
  3. Гоноровский И.С. Радиотехнические цепи и сигналы. М.: Дрофа, 5-е издание. 2006 г.
Tags:
Hubs:
Total votes 22: ↑20 and ↓2 +18
Views 16K
Comments Comments 17