|
Построить график громкости звука от времени |
|
|
|
Mar 13 2013, 23:51
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Со цифровой обработкой звука раньше дела не имела, поэтому боюсь изобретать велосипед там, где проблема давно решена. Потому и обращаюсь за советом к тем, кто со звуком раньше работал. Есть в наличии WAV-файл, содержащий звуковую запись. Сигнал, если его построить на графике, выглядит примерно так:  Т.е. наличествует сигнал веретёнообразнозной формы, от которого мне нужна огибающая (сверху или снизу - без разницы). Под огибающей я имею ввиду линию, проходящую по границе белого и черного (см. рисунок). При этом я отдаю себе отчет в том, что график предварительно придется сжать в горизонтальном направлении на столько, чтобы провалы до нуля в нем исчезли, а линии от соседнх периодов слились вместе (с учетом дискретности построения) - т.е. именно то, что уже произошло на приведенном мною графике. Самое простое, что приходит в голову - аналогия с детекторным приемником  - либо обрезать нижнюю часть (один диод), либо получить абсолютную величину (диодный мост). Впрочем, и возведение в квадрат мне тоже годится. Но и после этого фигура по-прежнему черным-черна, поскольку продолжает дрожать между амплитудным значением и нулём. Пыталась сделать ее выпуклой, пропустив через самодельный фильтр, который каждую "провалившуюся" точку, находящуюся ниже, чем средняя между ее соседями (слева и справа), заменяет на это среднее. Но, к сожалению, такой фильтр не привел к видимому изменению сигнала, хотя я его гоняла 10 раз подряд. Находить торчащие вверх вершины и строить по ним полином - слишком трудоёмко по вычислениям (в моём WAV-файле около 11 млн. точек). Чувствую, что решение должно быть какое-то простое, но более ничего приличного придумать не смогла. Совет годится без объяснения - хотя бы поскажите термины, которые я могла бы поискать в интернете. А так я даже не соображу, как эту задачу назвать можно. Даже тем, как эту тему назвала, недовольна - громкость это все-таки чуть другое, чем то, что я ищу. Мне скорее нужна текущая мощность сигнала (пусть не мгновенная, а хотя бы с минимальным шагом, который бы превышал период звука).
|
|
|
|
|
Mar 14 2013, 03:28
|
Гуру
     
Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883

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

Профессионал
    
Группа: Свой
Сообщений: 1 724
Регистрация: 1-05-05
Из: Нью Крыжопыль
Пользователь №: 4 641

|
Цитата(ViKo @ Mar 14 2013, 08:30)  Проще - выбрать максимум из стольких точек сигнала, сколько их "утаптывается" в один столбик на картинке. ... Лучше немного не так: 1. В потоке отсчетов убрать все минусы - модуль, ||. Это выпрямление, если говорить о физической реализации. 2. Брать интеграл по группе отсчетов. Это будет ФНЧ. Количество отсчетов определяется необходимой "подробностью" огибающей. Полагаю, что вам нужен всё-таки не пиковый детектор, а интегратор. Похожую задачу решают "распознаватели" речи. В итоге, например, можно довольно большие "куски" фонограммы описывать простой интерполяционной функцией и сравнивать её с фонемной из "банка" (корреляция). Я этого сам не делал пока. Так, мысли вслух - может пригодится. Если я угадал, то ещё мысля - параллельно, для выбранного участка интегрирования, определять функцию основной несущей частоты (простым подсчетом пересечений нуля) и добавить эту функцию в коррелятор с фонемой из "банка". Должна повыситься точность распознавания.
|
|
|
|
|
Mar 14 2013, 08:01
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Цитата(Xenia @ Mar 14 2013, 01:51)  Пыталась сделать ее выпуклой, пропустив через самодельный фильтр, который каждую "провалившуюся" точку, находящуюся ниже, чем средняя между ее соседями (слева и справа), заменяет на это среднее. Но, к сожалению, такой фильтр не привел к видимому изменению сигнала, хотя я его гоняла 10 раз подряд.
Мне скорее нужна текущая мощность сигнала (пусть не мгновенная, а хотя бы с минимальным шагом, который бы превышал период звука). Так нужна обработка сигнала или обработка графика? Если обработка графика чтоб красивая гладкая огибающая была, то надо учитывать масштаб представления графика на экране, как я думаю. Т.е. надо для начала узнать сколько точек реально на экранном представлении графика помещается. А потом медианным фильтром пройтись по положительным полупериодам, так чтобы получить необходимое количество точек графика. А потом уже сгладить экспоненциальным фильтром.
|
|
|
|
|
Mar 14 2013, 11:48
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Вы все надо мной пожалуйства не смейтесь  , но на самом деле мне частоту пульса надо узнать из данных ФКГ (ФоноКардиоГраммы), которая записывается с микрофона:  Прямое FFT этого сигнала дает слишком пеструю картину. Конечно, нужная частота в той куче есть, однако там она отнюдь не самая большая по амплитуде. А если бы я той частоты заранее не знала, то, скорее всего, выбрать нужную из FFT-спектра не смогла. Вот и решила с горя сперва "почистить" исходные данные, чтобы спектр получился почетче. Линейный фильтр НЧ здесь не помощник, т.к. фильтрация такого рода банально сводится к примитивным операциям над FFT-спектром. А вот пиковый детектор (который мне уже успели посоветовать) - совсем другое дело. Очень возможно, что он окажется полезен. Проблема здесь в том, что "вигли" в разных сердечных сокращениях по фазе обычно не совпадают. Т.е. огибающая вспроизводится хорошо, но шум внутри нее дергается по разному. Поэтому корреляция таких сигналов (при наложении друг на друга) получается случайной: хорошо совпадут по фазе - получится большой, а не совпадут - получится малой. Грубо говоря, если в первом ударе пульса веретено образует синусоида, а во втором ударе - косинусоида, но корреляция получится нулевой. А мне хочется где-нибудь привязаться, чтобы эти кадры засинхронизироваться, чтобы их в последствии можно было накладывать друг на друга. А в итоге вытащить идельный/средний/типичный кадр, в котором меньше всего посторонних шумов.
|
|
|
|
|
Mar 14 2013, 12:05
|

Эксперт
    
Группа: Свой
Сообщений: 1 467
Регистрация: 25-06-04
Пользователь №: 183

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

|
Вам верно посоветовали - амплитудная демодуляция ( исходя из представленного графика ) Делал по всякому, если примитивно, в качестве примера: 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. Что касается Вашей задачи в целом, то система должна быть двухканальной: один канал на сердце матери, второй на живот. Из сигнала "живота" вычитать сигнал сердца матери. Ну это так, на пальцах.
|
|
|
|
Guest_TSerg_*
|
Mar 14 2013, 12:37
|
Guests

|
> А что это за генерёж такой у вас в сигнале? Это мать очень быстро дышит
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|