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

Построить график громкости звука от времени

Со цифровой обработкой звука раньше дела не имела, поэтому боюсь изобретать велосипед там, где проблема давно решена. Потому и обращаюсь за советом к тем, кто со звуком раньше работал.

 

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

 

c001.jpg

 

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

 

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

 

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

 

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

 

Чувствую, что решение должно быть какое-то простое, но более ничего приличного придумать не смогла.

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

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


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

Чувствую, что решение должно быть какое-то простое, но более ничего приличного придумать не смогла.

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

Со звуком не работаю. Я их издаю и принимаю.

Вам нужен средний квадрат, именуемый еще разными словами.

Езжайте в Монте-Карло, если не хотите (не можете) честно зарабатывать деньги.

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


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

(в моём WAV-файле около 11 млн. точек).

Выбирайте из 100 (?) точек одну, самую "громкую". Дальше - из следующих 100.

Типа... пикового детектора.

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


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

В детекторном приемнике ещё емкость стоит :)

Правильно, фильтр.

Только у фильтра есть т.н. постоянная времени, вот её и нужно сделать больше расстояний между пиками.

Или другими словами, нужно сделать ФНЧ, который не будет пропускать частоту модуляции.

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


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

Ну так в обычном амплитудном детекторе после диода ставят ФНЧ. Вам конкретно надо посчитать частоту среза, чтобы реальные звуковые частоты не путать с огибающей. Если на входе - голосовой сигнал с микрофона, то построение ФНЧ простое, т.к. спектр голоса начинается где-то с 300 Гц. Если на входе - современная музыка с обилием НЧ и ударных, то придется давить в ФНЧ все, что выше 20 Гц.

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


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

Проще - выбрать максимум из стольких точек сигнала, сколько их "утаптывается" в один столбик на картинке.

P.S. пиковый детектор бывает со сбросом. :)

P.P.S. Со звуком не работаю, даже радио выключаю. Со звуком я отдыхаю. :)

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


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

Проще - выбрать максимум из стольких точек сигнала, сколько их "утаптывается" в один столбик на картинке.

...

Лучше немного не так:

1. В потоке отсчетов убрать все минусы - модуль, ||. Это выпрямление, если говорить о физической реализации.

2. Брать интеграл по группе отсчетов. Это будет ФНЧ. Количество отсчетов определяется необходимой "подробностью" огибающей.

 

Полагаю, что вам нужен всё-таки не пиковый детектор, а интегратор.

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

Я этого сам не делал пока. Так, мысли вслух - может пригодится.

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

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


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

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

 

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

 

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

 

Если обработка графика чтоб красивая гладкая огибающая была, то надо учитывать масштаб представления графика на экране, как я думаю.

Т.е. надо для начала узнать сколько точек реально на экранном представлении графика помещается.

А потом медианным фильтром пройтись по положительным полупериодам, так чтобы получить необходимое количество точек графика.

А потом уже сгладить экспоненциальным фильтром.

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


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

Вы все надо мной пожалуйства не смейтесь :), но на самом деле мне частоту пульса надо узнать из данных ФКГ (ФоноКардиоГраммы), которая записывается с микрофона:

 

normal.jpg

 

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

 

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

 

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

 

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

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


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

Разве самая низкая частота в спектре кардиограммы не есть частота пульса? Или частота дыхания влияет? Или ... биопроцессы в других органах?

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


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

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

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

 

Так и сделайте огибающую, а от нее уже Фурье.

Квадратичным детектором - это мгновенная мощность

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


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

Разве самая низкая частота в спектре кардиограммы не есть частота пульса? Или частота дыхания влияет? Или ... биопроцессы в других органах?

 

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

 

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

 

А тут я в обычной ФКГ (где микрофон на грудь ставится) разобраться не могу, т.к. 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

if Yi < Ya then A := 0.05

else A := 0.003;

Y := A * Ya + (1 - A) * Yi;

Yi := Y;

// линейный ФНЧ-I

arYF := LPF.Next(Y);

end;

end;

 

f62c05425899t.jpg

 

P.S.

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

Ну это так, на пальцах.

 

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


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

А что это за генерёж такой у вас в сигнале?

Правильная микрофонная система так работать не должна.

Или это измерение проводится в среде, наполненной посторонними, более высокочастотными шумами?

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

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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