Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Детектирование "нелинейных" звуковых чирпов в аудио потоке.
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
tmtlib
Подскажите, чем определять синусоидальный сигнал с нелинейно растущей частотой? Есть шумы и эхо. Спектрограмма БПФ по времени даёт весьма размазанную картину, так как частота растёт быстро, амплитуда падает в шум, т.е. БПФ с большим окном попросту не подходит для таких писков. В спектрограмме конечно что-то видно, но алгоритмически это выделять уже сложно - и нужна память на хранение спектрограммы. На частоте дискретизации 22.5кГц в контроллер влазит примерно 2048 отсчёта (упаковываю по два 8-битных отстчёта в одну 16-битную ячейку памяти).
bahurin
Капитан очевидность утверждает, что надо выделить изменения частоты сигнала от номинальной частоты. Для этого можно поставить частотный детектор и на выходе будет зависимость мгновенной частоты сигнала от времени
SPACUM
Цитата(tmtlib @ Aug 1 2011, 14:37) *
Подскажите, чем определять синусоидальный сигнал с нелинейно растущей частотой?

А что Вы называете определять? Может быть отличать от сигналов с линейно растущей частотой? Или с нелинейно убывающей?
Возьмем короткий синусоидальный импульс. Сначала частоты не было, потом она нелинейно! возросла до определенной, потом нелинейно! исчезла.
Это надо определять?
Опишите Ваши сигналы и от чего их надо отличить. Может помочь ответ на вопрос зачем?
sup-sup
Цитата(tmtlib @ Aug 1 2011, 13:37) *
Подскажите, чем определять синусоидальный сигнал с нелинейно растущей частотой? Есть шумы и эхо. Спектрограмма БПФ по времени даёт весьма размазанную картину, так как частота растёт быстро, амплитуда падает в шум, т.е. БПФ с большим окном попросту не подходит для таких писков. В спектрограмме конечно что-то видно, но алгоритмически это выделять уже сложно - и нужна память на хранение спектрограммы. На частоте дискретизации 22.5кГц в контроллер влазит примерно 2048 отсчёта (упаковываю по два 8-битных отстчёта в одну 16-битную ячейку памяти).

Я бы сделал с помощью оптимальной фильтрации. То есть, нужно взять ожидаемый сигнал и его ортогональное дополнение. Загрузить это в FIR. И работать с приемлемой децимацией (чтобы ресурса хватило и пик корреляции не прозевать). То есть делать свертку сигнала с действительной и мнимой частью ядра и векторно складывать. Получим огибающую, у которой будет хороший пик при приеме сигнала, на который настроен фильтр.
tmtlib
Не ожидал такого количества ответов. Ну и наводящие вопросы тоже весьма помогли.
Цитата
. То есть, нужно взять ожидаемый сигнал и его ортогональное дополнение. Загрузить это в FIR. И работать с приемлемой децимацией (чтобы ресурса хватило и пик корреляции не прозевать).

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

Я тут думал как это проще сделать, и вот придумал ещё один метод. Ниже опишу идею, может кому пригодится.

1. Берём спектр БПФ, смотрим где примерно шумы.
2. Преобразуем амплитуды спектра в "бинарные" значения: 0, если амплитуда меньше шумов и 1 - если больше.
3. Упаковываем 16 отсчётов спектра в 1 16-битное слово (экономия памяти).
4. Ведём запись такой упакованной спектрограммы. Например, спектрограмма 32 измерений по 512 частотным "бинам" будет занимать 32*512/16=1024 слова.

Теперь имеется нечто вроде чёрно-белой картинки спектрограммы размером 32*512, которая занимает 2048 байт (1024 слова) Без упаковки это 32768 байт (16384 слова). Далее:

5. Строю гистограмму по каждой строке текущей спектрограммы простым сложением HIST[i] = SPECTROGRAM[i,0]+SPECTROGRAM[i,1]+...+SPECTROGRAM[i,31]. i=0..511. Получается такой график: если частота не меняется, на гистограмме начинает расти пик и достигает значения 32 (т.е. равен длине "окна" спектрограммы). Если частота начинает меняться, например возрастать, то правый склон пика начинает подниматься, а сам пик постепенно уходит в ноль.

Вот здесь на картинке показан пример: частота начала расти вверх. Второй пик справа - это какая-то помеха самого компьютерного звукового входа.

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

p.s. всем спасибо за ответы, fir тоже посмотрю. Что применить ещё не решил
SPACUM
Цитата(tmtlib @ Aug 3 2011, 07:48) *
1. Берём спектр БПФ, смотрим где примерно шумы.

1.Вообще надо сравнивать не с шумами, а с средним шума и желаемого значения спектра.
2.БПФ хорош для суммы синусоид, если сигнал имеет определенную форму и границы во времени, то корреляционные методы типа согласованного фильтра однозначно надежнее.
tmtlib
ну что же, стоит признать, что мой метод оказался бредом, хотя и не полнейшим. Та маленькая картинка сверху - это гистограмма, а не спектр. Спектр выглядит намного хуже - всё в шумах.

Теперь подумываю над предложением sup-sup засунуть эталон в FIR фильтр и натравить его на децимированный сигнал.

p.s. Всем спасибо, сделать открытие в области ЦОС мне пока не удалось fman.gif

У меня ещё вопрос! Я хочу выбрать эталон, с которым потом будет проводиться корреляция. Но при этом в звуковом сигнале присутствует многократное эхо, из-за чего синусоиды этого звука перемешались. Будет ли в этом случае у меня работать корреляция? Я ещё могу представить как это будет работать на "аналитическом" чирпе, нечто вроде ДПФ для одной частоты. Но здесь свёртка с такой фиговиной. Я конечно попробую, потом отпишу о результатах...
sup-sup
Цитата(tmtlib @ Aug 3 2011, 12:11) *
.. и натравить его на децимированный сигнал.
.. многократное эхо

Я предложил децимацию после свертки сигнала с комплексным эталоном. То есть, получить огибающую, с шагом в N выборок. Шаг децимации зависит от максимальной частоты спектра огибающей.
tmtlib
Цитата(sup-sup @ Aug 3 2011, 13:59) *
Я предложил децимацию после свертки сигнала с комплексным эталоном. То есть, получить огибающую, с шагом в N выборок. Шаг децимации зависит от максимальной частоты спектра огибающей.

ok. А я думал для ускорения свёртки.....
sup-sup
Цитата(tmtlib @ Aug 3 2011, 13:16) *
ok. А я думал для ускорения свёртки.....

И еще, нужно не забыть про комплексное дополнение для ядра фильтра - можно сделать через преобразование Гильберта.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.