Я недавно опубликовал статью "Распознавание радиотехнических сигналов с помощью нейронных сетей"[1]. И там была довольно длинная и интересная дискуссия по поводу возможности использования для этих целей согласованного фильтра(СФ). Разумеется, использовать согласованные фильтры для той задачи, что решалась, проблематично. Но меня заинтересовал другой вопрос, что лучше использовать при незначительных колебаниях параметров сигнала, нейронные сети(НС) или СФ. В качестве генератора сигнала буду использовать обычный мультивибратор. Подавать сигнал буду через звуковую карту, а далее распознавать с помощью метода описанного в [1] и с помощью согласованного фильтра. Далее ПО сравнит результаты и даст ответ какой метод лучше.
Часть 1. Генератор сигнала
Для того чтобы сравнение было адекватным, будем распознавать РЕАЛЬНЫЙ сигнал. Для его создания нужен генератор. Так же понадобится генератор шума. Сигнал будем генерировать с помощью мультивибратора. И чтобы "не лезли" ВЧ составляющие на выход надо поставить ФНЧ. Питание осуществляется от USB. Диапазон подаваемого напряжения на аудио карту должен быть в пределах 0.001 — 1.5В. А выход с мультивибратора лежит от 0 до 5В. Для ограничения напряжения будем использовать Г-образный делитель. Ниже представлена принципиальная схема генератора.
Делать с нуля я его не стал, т.к. на втором курсе, в рамках хакатона, собирал предусилитель кардиосигнала для съема кардиоинтервалограммы, который отличается только отсутствием ПОС между двумя каскадами. Поэтому я ограничился добавлением этой связи. Вот что в итоге получилось.
Внешний вид:
Во время работы:
В качестве генератора белого шума, я использовал метод 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]
Из-за того что периоды следования импульсов равны как и длительности импульсов, можно использовать вместо набора линий задержек только одну, поставить так называемый рециркулятор с накопителем.[3] В нашем случае идеальный, без потерь. Структурная схема СФ.
Подробнее о структуре и расчетах СФ можете почитать в [2 стр. 415 — 427] и [3 стр. 563 — 598].
При вероятности нахождения там сигнала >0.6 принимается решение, что сигнал зарегистрирован.
Часть 4. ПО для сравнения
Архитектура программа в своей структуре содержит "два флажка",
bool flag1 = false;
bool flag2 = false;
при старте программы они оба неактивны, имеется метод, который каждый раз, как опрашивается окно проверяет активны ли флажки, если активен первый флажок зачисляется 1 балл согласованным фильтрам. Если же второй, то балл зачисляется нейронной сети. В любом случае все параметры возвращаются в исходное положение.
Итог
Было проведено 20 экспериментов, в которых использовался, согласованный фильтр настроенный на исследуемый сигнал, ОСШ = 0.4, результат: 16:4 в пользу СФ. После чего была изменена длительность сигнала на 5%, результат: 2:18 в пользу НС. Из этого можно сделать вывод, что при ИЗВЕСТНЫХ параметрах СФ работает намного лучше чем ИНС, но когда параметры не известны, или могут варьироваться, целесообразней использовать ИНС.
Литература:
- Распознавание радиотехнических сигналов с помощью нейронных сетей.
- Баскаков С.И. Радиотехнические цепи и сигналы. М.: Высшая школа, 2-е издание.
- Гоноровский И.С. Радиотехнические цепи и сигналы. М.: Дрофа, 5-е издание. 2006 г.
segment
Может быть стоило более подробно рассказать? Больше похоже на выдержку из какой-то статьи в университетский научный журнал, особенно со всеми этими ссылками на литературу.
Zachar_5
К прежней статье тоже самое писали, да я раньше писал в университетские журналы, и как по другому оформлять публикации не знаю, какие подробности Вас интересуют?
iCpu
segment
Например вместо «Подробнее о структуре и расчетах СФ можете почитать в» можно было бы рассказать на простом языке с примерами, расчетами и объяснениями. На мой взгляд, вместо ссылок на книги необходимо приводить целиком объяснение что, почему и откуда взято. Где сами результаты экспериметов, таблицы, графики?
A1ien
А разве вы использововали «согласованный фильтр»? Для простого сигнала, насколько я помню такого термина не вводят, так для обычного прямоугольного радиоимпульса соглавованным является простейший полосовой фильтр со спектральной характеристикой максимально соответствующей спектру прямоугольного радиоимпульса — sin(x)/x. Понятие согласованного фильра вводится для сложных сигналов, у которы база B>>1. Суть в том что отклик на выходе соглаванного фильтра повторяет автокореляционную функцию сигнала, что существенно повышает соотношение сигнал/шум. Интересно было бы посмотреть на такие эксперименты, например сравнение нейронной сети для распознания сигналов на основе М-последовательностей.
Zachar_5
Нет вводят, тут я скинул статью в Википедии, где говорится о согласованном фильтре для прямоугольного сигнала.
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 стр.
A1ien
Сам термин может и есть, но по сути — фильтр тривиален. Вообще да, согласованный фильтр — это фильтр который для заданного типа сигнала, обеспечивает на выходе максимальное соотношение сигнал/шум.
deniskreshikhin
Согласованный фильтр можно построить и для сигналов с варьируемыми параметрами, просто надо будет согласовывать со всей системой в целом, а не конкретно с импульсом.
Вообще для стационарных процессов линейные фильтры всегда будут показывать лучшие результаты чем нелинейные, такова природа стационарных процессов.
Т.е. если у вас сигнал и помеха являются стационарными процессами, всегда можно построить линейный фильтр который обойдет любую ИНС (если она сама не повторяет линейный фильтр).
Zachar_5
На счет согласования со всей системой, мы на лекциях не проходили, да и в книгах не находил, Вы есть в ВК? Было бы интересно с Вами пообщаться.
deniskreshikhin
Да беспроблем, пишите https://vk.com/kreshikhin
aamonster
Не хотелось бы обижать, но статья вызывает некоторое недоумение:
Zachar_5
Я пытался ответить на вопрос, можно ли задачу поставленную тут(https://habrahabr.ru/post/318832) решить лучше с помощью СФ. Оказалось что нет. А почему аппаратный генератор меандра, все просто, реальный сигнал сам себя не повторяет, и мне было интересно как на это отреагирует СФ. Например амплитуда сигнала менялась во время теста 9 раза в среднем на 0.7%(именно тогда и проигрывал СФ).
aamonster
Так имело смысл изучать реальный сигнал, чтобы построить более точную модель. Именно изучать, а не сразу пытаться на нём что-то сравнивать.
Причём вам нужна и модель шума (а для обучения нейронной сети — образцы… много образцов), т.е. шум тоже надо брать реальный. А то завтра у вас переобученная НС будет детектировать, к примеру, импульсные помехи как сигнал.
Для простоты можно задаться всего несколькими параметрами для сигнала:
Частота, возможное отклонение частоты (между экспериментами — например, уход частоты генератора из-за изменения температуры), возможное кратковременное отклонение (в течение импульса, который надо детектировать — например, джиттер)
То же для амплитуды.
Если пользоваться СФ — эти данные сразу изменят его параметры (придётся урезать "время наблюдения сигнала"). Причём после изменения фильтра окажется, что вместо треугольной огибающей он выдаёт на импульсе меандра трапециевидную — которую можно подать на другой фильтр (или просто померить по ней длину импульса, чтобы узнать, что это наш меандр, а не просто маленький кусочек из помех)
erwins22
Если ли кто не в курсе, то человеческое ухо распознает сигналы в 6 раз лучше чем теоретический предел для линейной модели. так что утверждение что лучше использовать линейную модель с параметрами полученными из аналитики (оптимальными) заблуждение.