Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Построить график громкости звука от времени
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Xenia
Со цифровой обработкой звука раньше дела не имела, поэтому боюсь изобретать велосипед там, где проблема давно решена. Потому и обращаюсь за советом к тем, кто со звуком раньше работал.

Есть в наличии WAV-файл, содержащий звуковую запись. Сигнал, если его построить на графике, выглядит примерно так:



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

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

Пыталась сделать ее выпуклой, пропустив через самодельный фильтр, который каждую "провалившуюся" точку, находящуюся ниже, чем средняя между ее соседями (слева и справа), заменяет на это среднее. Но, к сожалению, такой фильтр не привел к видимому изменению сигнала, хотя я его гоняла 10 раз подряд.

Находить торчащие вверх вершины и строить по ним полином - слишком трудоёмко по вычислениям (в моём WAV-файле около 11 млн. точек).

Чувствую, что решение должно быть какое-то простое, но более ничего приличного придумать не смогла.
Совет годится без объяснения - хотя бы поскажите термины, которые я могла бы поискать в интернете. А так я даже не соображу, как эту задачу назвать можно. Даже тем, как эту тему назвала, недовольна - громкость это все-таки чуть другое, чем то, что я ищу. Мне скорее нужна текущая мощность сигнала (пусть не мгновенная, а хотя бы с минимальным шагом, который бы превышал период звука).
Tanya
Цитата(Xenia @ Mar 14 2013, 03:51) *
Чувствую, что решение должно быть какое-то простое, но более ничего приличного придумать не смогла.
Совет годится без объяснения - хотя бы поскажите термины, которые я могла бы поискать в интернете. А так я даже не соображу, как эту задачу назвать можно. Даже тем, как эту тему назвала, недовольна - громкость это все-таки чуть другое, чем то, что я ищу. Мне скорее нужна текущая мощность сигнала (пусть не мгновенная, а хотя бы с минимальным шагом, который бы превышал период звука).

Со звуком не работаю. Я их издаю и принимаю.
Вам нужен средний квадрат, именуемый еще разными словами.
Езжайте в Монте-Карло, если не хотите (не можете) честно зарабатывать деньги.
ViKo
Цитата(Xenia @ Mar 14 2013, 02:51) *
(в моём WAV-файле около 11 млн. точек).

Выбирайте из 100 (?) точек одну, самую "громкую". Дальше - из следующих 100.
Типа... пикового детектора.
MrYuran
В детекторном приемнике ещё емкость стоит sm.gif
Правильно, фильтр.
Только у фильтра есть т.н. постоянная времени, вот её и нужно сделать больше расстояний между пиками.
Или другими словами, нужно сделать ФНЧ, который не будет пропускать частоту модуляции.
V_G
Ну так в обычном амплитудном детекторе после диода ставят ФНЧ. Вам конкретно надо посчитать частоту среза, чтобы реальные звуковые частоты не путать с огибающей. Если на входе - голосовой сигнал с микрофона, то построение ФНЧ простое, т.к. спектр голоса начинается где-то с 300 Гц. Если на входе - современная музыка с обилием НЧ и ударных, то придется давить в ФНЧ все, что выше 20 Гц.
ViKo
Проще - выбрать максимум из стольких точек сигнала, сколько их "утаптывается" в один столбик на картинке.
P.S. пиковый детектор бывает со сбросом. sm.gif
P.P.S. Со звуком не работаю, даже радио выключаю. Со звуком я отдыхаю. sm.gif
zzzzzzzz
Цитата(ViKo @ Mar 14 2013, 08:30) *
Проще - выбрать максимум из стольких точек сигнала, сколько их "утаптывается" в один столбик на картинке.
...

Лучше немного не так:
1. В потоке отсчетов убрать все минусы - модуль, ||. Это выпрямление, если говорить о физической реализации.
2. Брать интеграл по группе отсчетов. Это будет ФНЧ. Количество отсчетов определяется необходимой "подробностью" огибающей.

Полагаю, что вам нужен всё-таки не пиковый детектор, а интегратор.
Похожую задачу решают "распознаватели" речи. В итоге, например, можно довольно большие "куски" фонограммы описывать простой интерполяционной функцией и сравнивать её с фонемной из "банка" (корреляция).
Я этого сам не делал пока. Так, мысли вслух - может пригодится.
Если я угадал, то ещё мысля - параллельно, для выбранного участка интегрирования, определять функцию основной несущей частоты (простым подсчетом пересечений нуля) и добавить эту функцию в коррелятор с фонемой из "банка". Должна повыситься точность распознавания.
AlexandrY
Цитата(Xenia @ Mar 14 2013, 01:51) *
Пыталась сделать ее выпуклой, пропустив через самодельный фильтр, который каждую "провалившуюся" точку, находящуюся ниже, чем средняя между ее соседями (слева и справа), заменяет на это среднее. Но, к сожалению, такой фильтр не привел к видимому изменению сигнала, хотя я его гоняла 10 раз подряд.

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


Так нужна обработка сигнала или обработка графика?

Если обработка графика чтоб красивая гладкая огибающая была, то надо учитывать масштаб представления графика на экране, как я думаю.
Т.е. надо для начала узнать сколько точек реально на экранном представлении графика помещается.
А потом медианным фильтром пройтись по положительным полупериодам, так чтобы получить необходимое количество точек графика.
А потом уже сгладить экспоненциальным фильтром.
Xenia
Вы все надо мной пожалуйства не смейтесь sm.gif, но на самом деле мне частоту пульса надо узнать из данных ФКГ (ФоноКардиоГраммы), которая записывается с микрофона:



Прямое FFT этого сигнала дает слишком пеструю картину. Конечно, нужная частота в той куче есть, однако там она отнюдь не самая большая по амплитуде. А если бы я той частоты заранее не знала, то, скорее всего, выбрать нужную из FFT-спектра не смогла.

Вот и решила с горя сперва "почистить" исходные данные, чтобы спектр получился почетче. Линейный фильтр НЧ здесь не помощник, т.к. фильтрация такого рода банально сводится к примитивным операциям над FFT-спектром. А вот пиковый детектор (который мне уже успели посоветовать) - совсем другое дело. Очень возможно, что он окажется полезен.

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

А мне хочется где-нибудь привязаться, чтобы эти кадры засинхронизироваться, чтобы их в последствии можно было накладывать друг на друга. А в итоге вытащить идельный/средний/типичный кадр, в котором меньше всего посторонних шумов.
ViKo
Разве самая низкая частота в спектре кардиограммы не есть частота пульса? Или частота дыхания влияет? Или ... биопроцессы в других органах?
fontp
QUOTE (Xenia @ Mar 14 2013, 14:48) *
Проблема здесь в том, что "вигли" в разных сердечных сокращениях по фазе обычно не совпадают. Т.е. огибающая вспроизводится хорошо, но шум внутри нее дергается по разному. Поэтому корреляция таких сигналов (при наложении друг на друга) получается случайной: хорошо совпадут по фазе - получится большой, а не совпадут - получится малой. Грубо говоря, если в первом ударе пульса веретено образует синусоида, а во втором ударе - косинусоида, но корреляция получится нулевой.
А мне хочется где-нибудь привязаться, чтобы эти кадры засинхронизироваться, чтобы их в последствии можно было накладывать друг на друга. А в итоге вытащий идельный/средний/типичный кадр, в котором меньше всего посторонних шумов.


Так и сделайте огибающую, а от нее уже Фурье.
Квадратичным детектором - это мгновенная мощность
Xenia
Цитата(ViKo @ Mar 14 2013, 15:56) *
Разве самая низкая частота в спектре кардиограммы не есть частота пульса? Или частота дыхания влияет? Или ... биопроцессы в других органах?


К сожалению нет. FFT показывает и меньшие частоты тоже.

А на счет биопроцессов вы прямо провидец. Вся бяка в том, что микрофон в данном случае ставится не на грудь напротив сердца, а на ... живот. Живот роженицы или будущей матери на последних сроках беременности. И требуется выделить ФКГ плода от ФКГ материи и прочего пердежа в ее кишках sm.gif. Но если этот пердёж асинхронен к сердечному ритму, и на этом основании довольно легко отфильтровывается, то ФКГ сердца матери довольно сильно мешает.

А тут я в обычной ФКГ (где микрофон на грудь ставится) разобраться не могу, т.к. FFT у него слишком сложная.
TSerg
Вам верно посоветовали - амплитудная демодуляция ( исходя из представленного графика )

Делал по всякому, если примитивно, в качестве примера:

procedure Filter_AMD_NLPF_LPF;
var
i: integer;
Ya, Y, Yi, A: TFloat;
begin
Yi := 0;
for i := 0 to High(arY) do begin
// выпрямление
Ya := abs(arY[i]);
// нелинейный ФНЧ-I
if Yi < Ya then A := 0.05
else A := 0.003;
Y := A * Ya + (1 - A) * Yi;
Yi := Y;
// линейный ФНЧ-I
arYF[i] := LPF.Next(Y);
end;
end;



P.S.
Что касается Вашей задачи в целом, то система должна быть двухканальной: один канал на сердце матери, второй на живот. Из сигнала "живота" вычитать сигнал сердца матери.
Ну это так, на пальцах.
zzzzzzzz
А что это за генерёж такой у вас в сигнале?
Правильная микрофонная система так работать не должна.
Или это измерение проводится в среде, наполненной посторонними, более высокочастотными шумами?
Если же это специально введенная несущая (по каким-то техническим соображениям), то нужно задрать вверх её частоту, а потом избавиться, отфильтровать.
TSerg
> А что это за генерёж такой у вас в сигнале?

Это мать очень быстро дышитsm.gif
fontp
QUOTE (TSerg @ Mar 14 2013, 15:20) *
Вам верно посоветовали - амплитудная демодуляция ( исходя из представленного графика )

Что касается Вашей задачи в целом, то система должна быть двухканальной: один канал на сердце матери, второй на живот. Из сигнала "живота" вычитать сигнал сердца матери.
Ну это так, на пальцах.


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

PS. Это всё, если шум позволяет
TSerg
>Вычитать сигнал сердца матери лучше

Приведенный пример детектирования и задача в целом - не связаны.
Разумеется, надо проводить обработку "ближе ко входу".
Alex11
Прислали бы образчик сигнала. Если есть два канала - лучше. Поскольку есть опыт обработки звука, может чего и подскажу, но надо поиграть с реальным файлом.
Xenia
Цитата(Alex11 @ Mar 15 2013, 02:33) *
Прислали бы образчик сигнала. Если есть два канала - лучше. Поскольку есть опыт обработки звука, может чего и подскажу, но надо поиграть с реальным файлом.


Послала вам в местную личку линк на WAV-файл. Длина 24 М.
ViKo
Усреднять отдельные кадры спектра? Тогда все несинхронное размажется, а пульс останется.
polyakovav
Фонокардиографией вплотную заниматься не приходилось, а ЭКГ-мониторы делали. Там главное - методика. Очень много мешающих факторов, особенно в фоно. Поэтому сейчас фонокардиограмму почти не используют, перешли на УЗ допплер.
Есть методичка для студентов-медиков, в ней коротко описана методика диагностики, частоты сердечных тонов и т.п., ну и литература в конце ;-)

Нажмите для просмотра прикрепленного файла

А обнаруживать, имхо, лучше вейвлетами.

Частоты тонов зависят от физических характеристик сердца, значит у матери и плода должны заметно отличаться. Кроме того, ЧСС у плода обычно раза в полтора-два выше, чем у матери.
На водопадной вейвлет-диаграмме должно быть хорошо видно разницу (теоретическиsm.gif
Alex11
Xenia, ловите ответ в личке.
Make_Pic
Цитата(polyakovav @ Mar 15 2013, 15:21) *
Фонокардиографией вплотную заниматься не приходилось, а ЭКГ-мониторы делали. Там главное - методика. Очень много мешающих факторов, особенно в фоно. Поэтому сейчас фонокардиограмму почти не используют, перешли на УЗ допплер.
Есть методичка для студентов-медиков, в ней коротко описана методика диагностики, частоты сердечных тонов и т.п., ну и литература в конце ;-)

Нажмите для просмотра прикрепленного файла

А обнаруживать, имхо, лучше вейвлетами.

Частоты тонов зависят от физических характеристик сердца, значит у матери и плода должны заметно отличаться. Кроме того, ЧСС у плода обычно раза в полтора-два выше, чем у матери.
На водопадной вейвлет-диаграмме должно быть хорошо видно разницу (теоретическиsm.gif

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