Перейти к содержанию
    

Формирование акустического импульса

Допустим есть у нас трубопровод. На некотором расстоянии от одного конца установлен динамик излучающий импульсы. Около динамика, в трубе, установлен микрофон, который эти имульсы записывает. При попытке посылки импульса получаем резкое искажение формы сигнала записанного микрофоном от излучаемого динамиком (появляются хвосты). Происходит это от того, что во время формирования импульса на него накладываются отражения от ближайшего конца трубопровода. Вопрос: существуют ли адаптивные алгоритмы, способные сформировать заданную форму импульса вне зависимости от характера начальных отражений (поскольку динамик может устанавливаться в трубы разной начальной конфигурации)? Основной критерий формирователя - малая длина полученого импульса.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Допустим есть у нас трубопровод. На некотором расстоянии от одного конца установлен динамик излучающий импульсы. Около динамика, в трубе, установлен микрофон, который эти имульсы записывает. При попытке посылки импульса получаем резкое искажение формы сигнала записанного микрофоном от излучаемого динамиком (появляются хвосты). Происходит это от того, что во время формирования импульса на него накладываются отражения от ближайшего конца трубопровода. Вопрос: существуют ли адаптивные алгоритмы, способные сформировать заданную форму импульса вне зависимости от характера начальных отражений (поскольку динамик может устанавливаться в трубы разной начальной конфигурации)? Основной критерий формирователя - малая длина полученого импульса.

Проблема похожа на Echo cancellation (поиск Гуглом дает кучу ссылок). В двух словах сигнал, что подается на динамик взвешивается фильтром и вычитается с выхода микрофона. Коэффициенты фильтра подстраиваются адаптивно, например LMS методом. Для тренировки фильтра нужно излучать шумоподобную последовательность. Вот неплохая книжка.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема похожа на Echo cancellation (поиск Гуглом дает кучу ссылок). В двух словах сигнал, что подается на динамик взвешивается фильтром и вычитается с выхода микрофона. Коэффициенты фильтра подстраиваются адаптивно, например LMS методом. Для тренировки фильтра нужно излучать шумоподобную последовательность. Вот неплохая книжка.

 

Можно адаптивно, но можно и статически. Подаем дельта-функцию на динамик и запоминаем импульсный отклик системы - сигнал с микрофона h. Для борьбы с шумом можно периодически повторять этот щелчок и использовать накопление.

 

Физическая система (без памяти) казуальна, поэтому в уравнение

H - нижнетреугольная матрица из импульсных откликов

 

H * X = Y

 

X - сигнал на динамик

Y - сигнал с микрофона

 

 

h0 0 0 ... 0 0 0

h1 h0 0 ... 0

...........................

...........................

hn .............. h1 h0

 

где hn .............. h1 h0 - импульсный отклик системы

 

Для y0 = { 1 0 0 0 0 0 0 }т,

решить уравнение с нижнетреугольной матрицей легко прямой подстановкой.

 

Если решение неудовлетворительное в смысле устойчивости, то используют решения по минимуму квадратов

 

(Ht * H) * X = Ht * Y

 

 

ЗЫ.

Более того для решений статического типа (статический эквалайзер) существует методы решения даже в случае если Х нельзя задать произвольно (как я задал дельта-функцией) и оно задано заранее внешними условиями как некий произвольный широкополосный сигнал. И для случая когда система не казуальна, а с памятью, как это имеет обычно место при цифровой обработке (матрица отклика не треугольная, а полная).

Если вектора длинные и можно перейти к статистическому усреднению то там получаются уравнения Левинсона-Дурбина с теплицевыми матрицами. Для коротких последовательностей стат-усреднение неадекватно. Для коротких последовательностей лучше использовать быстрый рекурсивный ковариационный метод (минимум квадратов без стат-усреднения), описаный в статье Марпла, работающая программа FIR system identification на С (для комплексных сигналов) прилагается вместе с оригинальной статьей

(в статье приведен быстрый алгоритм решения ковариационных уравнений и соответствующая программа на Фортране, я перевел когда-то на С и проверил, что там нет ошибок и опечаток)

 

Интересно, что все электроники знают или слышали о Левинсоне-Дурбине, но почти никто не знает о быстром алгоритме для ковариационных уравнений - этому не учат в школе. А вот геофизики во всю используют.

 

 

Преимущества адаптивного решения задачи идентификации системы в его способности адаптироваться

к медленным изменениям системы. Последовательными приближениями решается та же самая система нормальных уравнений.

Понятно и адаптивные и статические методы работают только для ЛИНЕЙНЫХ систем. Поэтому самый важный вопрос - это адекватность математической модели "трубы"

marple_covar.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за советы - буду пробовать. Смотрел еcho cancellation еще раньше - там все более по телефонии - известный сигнал от абонента воспроизводится динамиком и попадает в микрофон вместе с полезным сигналом, и мне как-то не приходило в голову модифицировать такие алгоритмы. В моем случае же сигнал искажается за счет отражений от неизвестной конфигурации трубы (она конечно известна, но не хотелось бы каждую трубу описывать аналитически). Задача практическая - надо чтобы в любую трубу можно было "запустить" хотя бы приблизительно одинаковые по форме импульсы. Система думаю линейная - поскольку импульсы при пролете сквозь трубу формы своей ощутимо не изменяют. (В трубе стоят два микрофона - один около динамика, другой - на другом конце. При "выстреле" импульса 1-й микрофон фиксирует его измененную форму - второй - то же через время пролета в трубе.)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...

В моем случае же сигнал искажается за счет отражений от неизвестной конфигурации трубы (она конечно известна, но не хотелось бы каждую трубу описывать аналитически). Задача практическая - надо чтобы в любую трубу можно было "запустить" хотя бы приблизительно одинаковые по форме импульсы.

Не надо, конечно, аналитически трубу описывать. Динамик же излучает известный сигнал. Вам предлагается измерить тем или иным способом импульсную характеристику(ИХ) системы вход динамика - выход микрофона. И далее тем или иным способом использовать эту оценку ИХ. Если требуется сформировать импульс заданной формы, то можно рассчитать корректирующий фильтр. И этот фильтр включить перед динамиком ( или после микрофона). ИХ пропущенная через этот фильтр должна давать сигнал нужной формы. Вообще это не эхо кацлер получается а корректор. Вот кстати как фильтр посчитать http://electronix.ru/forum/index.php?showtopic=54523#

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за советы - буду пробовать. Смотрел еcho cancellation еще раньше - там все более по телефонии - известный сигнал от абонента воспроизводится динамиком и попадает в микрофон вместе с полезным сигналом, и мне как-то не приходило в голову модифицировать такие алгоритмы. В моем случае же сигнал искажается за счет отражений от неизвестной конфигурации трубы (она конечно известна, но не хотелось бы каждую трубу описывать аналитически). Задача практическая - надо чтобы в любую трубу можно было "запустить" хотя бы приблизительно одинаковые по форме импульсы. Система думаю линейная - поскольку импульсы при пролете сквозь трубу формы своей ощутимо не изменяют. (В трубе стоят два микрофона - один около динамика, другой - на другом конце. При "выстреле" импульса 1-й микрофон фиксирует его измененную форму - второй - то же через время пролета в трубе.)

 

Это Вы предполагаете, что линейна. А что если жидкость вязкая?

Есть и ещё один вопрос. У вас есть исполнительный элемент - поршень (формально описываемый вектор входного сигнала Х соответствует чему-то вроде ускорению или может координате этого поршня) и два микрофона (вектор выхода Y включает в себя сигнал от обоих и при естественной дискретизации в два раза длинней X по размерности)

 

Вы сразу получаете переопределённую систему уравнений H*X = Y которую можно решить только в смысле минимума квадратов невязки Min (H*X-Y)*(H*X-Y) Откуда сразу получаются нормальные уравнения хоть для h, хоть для X, в зависимости от того что Вы считаете переменной, а что известно

H или Х

Хорошо, получили Х (если известно H или напротив получили h, если известно Х). Но вы скорее всего физически не сможете его реализовать, поскольку ускорение Х подчиняется уравнениям движения. Например идеальную дельта-функцию Вы не сможете реализовать никак, тем более её производные. Значит в исходную систему уравнений нужно дописывать ограничения на движение, например что на всех высоких частотах движение поршня равно нулю, как его не толкай. Хотя если поршень - это линейный исполнительный элемент - его отклик в жидкости на приложенное напряжение лучше сразу загнать в неизвестный отклик H (сделать Х напряжением, подаваемым на привод) и то что он плохо двигается будет сидеть в уравнениях, которые получаются в результате опыта. Нормальные уравнения

 

(Ht*H) * X = Ht*Y cделаются некорректными и нужно будет делать им регуляризацию

 

[(Ht*H) + e*I] * X = Ht*Y

 

Вопрос адекватности и вменяемости модели как раз самый важный ;) Математику можно всяко навести

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

угу, только предполагаю... поскольку пока у меня воздух в трубе а не жидкость. С жидкостью пока подождем. пробуем пока с маткадовским "систем идентификейшн тулбокс" - для 2х периодов Sin все ок - а чуть сложнее сигнал - все идет вразнос (неустойчивость типа). Поршень у меня... наверно динамик, и два микрофона имеются.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

fontp

Пробовали запихнуть в Вашу программу наши сигналы - тот, что подается на динамик, и записанный в начале трубы, причем в качестве входного пробовали шум, кусок синусоиды и еще несколько вариантов. Проблема в том, что отклик достаточно длинный - пару тысяч отсчетов, так что при небольшом количестве отсчетов ИХ фильтра естественно ничего не получается, а побольше его сделать проблематично - даже для тестовых данных (случайный сигнал на входе и свернутый со случайной ИХ) длиной 10200 и порядком фильтра 1000 fir_covar возвращает код ошибки (-1,-2), а коэффициенты считаются только до 544-го (остальные нули). Чтоб считались все коэффициенты и не было ошибки, нужно, чтобы количество отсчетов сигнала и отклика было раз в 100 больше порядка фильтра (для тестового сигнала, для наших так и не получилось ничего). В то же время из статьи можно понять, что вроде достаточно данных всего в 2 раза больше порядка. То ли есть какие-то нюансы в реализации алгоритма, то ли я идею неправильно понимаю?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

fontp

Пробовали запихнуть в Вашу программу наши сигналы - тот, что подается на динамик, и записанный в начале трубы, причем в качестве входного пробовали шум, кусок синусоиды и еще несколько вариантов. Проблема в том, что отклик достаточно длинный - пару тысяч отсчетов, так что при небольшом количестве отсчетов ИХ фильтра естественно ничего не получается, а побольше его сделать проблематично - даже для тестовых данных (случайный сигнал на входе и свернутый со случайной ИХ) длиной 10200 и порядком фильтра 1000 fir_covar возвращает код ошибки (-1,-2), а коэффициенты считаются только до 544-го (остальные нули).

 

Куда Вам столько много? Это подгонка. Порядок нужно ограничивать в вызове функции.

 

Обычно порядок увеличивают только до тех пор пока ошибка уменьшается резко. Обычно ошибка снижается сначала более резко, а потом менее резко. На перегибе останавливаются :-)

Дальше - это всё подгонка под шум. Так моделируются FIR-системы, есть там специальная даже стат-наука по выбору порядка.

 

"Моя программа" это всего лишь быстрый алгоритм решения ковариационных уравнений. Можете выписать нормальные уравнения и решать их любой другой программой для решения линейных систем уравнений. При обычной точности вычислений возможно решать системы порядка несколько десятков, особенно если они недостаточно хорошо обусловлены

 

 

Это всё ещё без учета того, что вам вообще-то нужен скорее обратный фильтр, чем прямой. Т.е. Ваша задача больше похожа на эквалайзер, чем на эхоподавитель, причем не нужно стремиться к идеальной форме (дельта-функции), поскольку у Вас реакция запаздывающая и идеальную компенсацию получить нельзя. Мне кажется так

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А в каких пакетах кроме Матлаба есть нечто похожее на System Identification?

 

Советую попробовать блочный FDAF

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...