Pull to refresh

Comments 64

Спасибо большое! Очень рад, что статья заинтересовала!

А мы по-старинке балуемся Oscillofun'ом и иже с ними...

Классный способ визуализации! Но обычно для рисования сложной графики на осциллоскопах используется другой алгоритм: за основу берётся стереосигнал, где один канал отвечает за смещение луча по горизонтальной оси X, второй по вертикальной Y, - в результате получается что-то наподобие векторного телевизора, а звук с каналов смешивается.

В данной статье рассмотрен алгоритм рисования именно на основе моноканала, путём разложения сигнала на гармонические составляющие.

Хотя нужно отметить, что по запросу oscilloscope drawing встречаются видеозаписи с характерными рисунками-мандалами, возможно, при их рисовании применяется схожая математика.

P.S. Тоже очень вдохновляляет тема аудиорисования на осциллоскопе, с неё в своё время у меня и начались более углубленные поиски-исследования в направлении визуализации сигналов.

Всё верно, это фигуры Лиссажу, режим X-Y. Но одно дело просто фигуры, страшно звучащие (например, грибы) а другое - мелодичные. Вот грибы, кто не видел:

Ну и не стоит забывать про биение частот камеры и отрисовки: эти ролики надо смотреть своими глазами на аналоговых осциллографах. Тогда множество артефактов уйдёт или станут незаметными.

PS Вот ещё из более-менее мелодичных:

Благодарю, красивые и очень наглядные видео!

Самое интересное - красивые осциллограмы - красивые звуки.

Так о чём и речь. Это же отдельный вид искусства.

Спасибо за пищу для размышлений! Очень интересная тема, обязательно изучу ее подробнее!

Не нашел в программе способа открыть звуковой файл, неужели нет такого?

На текущий момент в релизной версии проигрывание аудиофайлов отключено, поскольку функционал сырой, но в исходных кодах можно включить поддержку .wav [.pcm] в моноформате. Однако если просто поднести микрофон к источнику звука, то программа его сможет визуализировать.

Зато сейчас в десктопной версии приложения можно сохранять и загружать отдельные кадры, этот функционал доступен в меню главного окна [см. левый нижний угол, значки: 📷, 💾, 📂].

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

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

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

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

Хороший вопрос, но, насколько сам понимаю, слуховая улитка представляет собой своеобразный аналоговый Фурье- или даже вейвлет-преобразователь.

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

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

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

Что касается визуализации периодических сигналов, то при соблюдении критерия Котельникова (Найквиста — Шеннона) сигнал в частотной области визуализируется весьма точно.

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

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

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

Нашлась публикация про исследование в области аккустических призм.

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

Это если у них довольно разная длина волны (хотя бы раза в 2), а вот если похожая то будет каша.

круги на воде относительно беспрепятственно проходят друг сквозь друга

Если их фронты движутся в разные стороны то да, а вот если такой фронт есть сумма 2-3 фронтов разных волн и все движутся в одну сторону то точно разделить их на отдельные волны до того как они слились скорее всего невозможно.

Нашлась публикация про исследование в области аккустических призм.

Да, читал эту статью, но насколько понял это не совсем призма.
"Each unit-cell can be modelled as series mass and parallel compliance (supporting the right-hand or positive index propagation), combined with series compliance and parallel mass (supporting left-hand or negative index propagation), as explained in Refs. 14 and 17. Thus, it behaves as an acoustic bandpass filter. "
Это скорее последовательность фильтров, причем как я понимаю суть не столько в фильтрах сколько в размерах "призмы", которая как раз соответствует длинам волн в воздухе , для света эта "призма" была бы чем то вроде трубки со светофильтрами, световая же призма уникальна тем что она есть некое тело проходя через которое свет в зависимости от цвета по разному ведет себя.
Однако ответ на вопрос как же устроено восприятие разных длин волн у человека скорее всего действительно находится где то в области поведения звуковых волн в улитке.

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

Это если у них довольно разная длина волны (хотя бы раза в 2), а вот если похожая то будет каша.

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

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

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

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

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

~

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

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

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

1) Речь же про улитку в ухе человека, не уверен что там имеется стык двух сред, там скорее ситуация, когда стенка улитки колеблется как мембрана динамика и таким образом передает волны в жидкость в улитке, это как если взять обычный динамик и опустить его в воду, я бы не назвал это переходом волны из одной среды в другую. А следовательно не могу понять о каком преломлении речь.
2) Не совсем понял, в каком смысле волна разделяется ?
3) Движется с разной скоростью? Это как ? Первый раз слышу чтобы волны в среде двигались с разной скоростью. Насколько знаю упругие волны в среде всегда распространяются с одной и той же скоростью не зависимо от длины волны.
4) Частота то может и остается а вот длина волны изменится потому что скорость в жидкости больше чем в воздухе, а значит У = с*Т, Т осталось тоже самое а вот с стало больше.

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

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

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

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

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

Для световой волны преломление - изменение направления распространения, что вы понимаете под преломлением для продольной волны?

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

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

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

Например, если воскрикнуть в пустом помещении с голыми стенами, то звуковые волны ещё некоторое время будут отражаться эхом, постепенно затухая. Если же это помещение заставить мебелью и вещами, а на стене повесить ковёр, то волны будут быстро рассеиваться и эффект эхо пропадёт.

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

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

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

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

Вы наверное имеете в виду отражения от стенок улитки, такое конечно может быть. Но чисто интуитивно сомневаюсь что это явление там срабатывает достаточно значительно. Иначе получится что текущий звук все время будет зашумлен предыдущим.

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

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

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

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

Чем мне не очень нравится ФФТ , так это тем что по его результатам нельзя определить периодический сигнал или нет, оно по сути просто говорит что в таком то окне есть такие то гармоники такой то амплитуды. А вот если посмотреть wave файл то там часто виден паттерн.

Ещё вспомнилось пару аргументов в пользу аналогового принципа получения амплитудного спектрального рисунка (наподобие спектограммы):

  • вряд ли слуховая нервная система способна работать на килогерцевых частотах (воспринимая высокочастотные колебания звука напрямую), ведь даже мощный визуальный тракт уже после 20 Гц начинает склеивать картинки-кадры и воспринимать объекты на них в движении; и если мерцание монитора в 60-75 Гц ещё можно заметить, то 100 Гц и выше уловить уже намного сложнее

  • ну слух практически неразличимы сигналы, где отброшена фазовая компонента (например, зачастую трудно отличить оригинальный wav и сжатый mp3 в высоком качестве), значит, фазы гармоник при восприятии человеком не особенно учитываются и форма волны во временном представлении может варьироваться при тех же звуковых ощущениях

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

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

вряд ли слуховая нервная система способна работать на килогерцевых частотах (воспринимая высокочастотные колебания звука напрямую)

Она и не способна, 100-120Гц это предел для нейронов.
Только я вот сомневаюсь что человеческое восприятие настроено на частоту, скорее на длину волны, может показаться что разницы нет (F=C/WaveLen) но, в природе сигналы могут быть не периодические т.е сигнал с маленькой длинной волны которая соответствует частоте скажем 1000Гц на практике содержит скажем 100 волн. И что с ним делать?
Есть идея что слуховые клетки в улитке это что-то вроде засечек на линейке, и вот минимальное расстояние между ними соответствует минимальной длине волны.

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

Как раз за счет того что периодические сигналы выглядят как паттерн их можно отличить имхо.

Если принять скорость распространения звука в жидкости порядка 1500 м/c, то длина волны для сигнала в 500 Гц составит 1500(м/c) / 500(1/c) = 3 м, что немало, учитывая скромные геометрические размеры слуховой улитки.

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

Если принять скорость распространения звука в жидкости порядка 1500 м/c, то длина волны для сигнала в 500 Гц составит 1500(м/c) / 500(1/c) = 3 м, что немало, учитывая скромные геометрические размеры слуховой улитки.

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

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

Что за версия с частотной линейкой?

Это, перефразированно, версия с разложением акустического сигнала наподобие призмы, когда гармоники сигнала «подсвечивают» определённые участки линейки из слуховых рецепторов, скрученной в логарифмическую спиральку.

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

Но нужно признать, что эти механизмы мало изучены и таят ещё много загадок...

Возможно клетки улитки реагируют не на продольные волны которые распространяются с 1500м/с, а там создаются(?) продольно-поперечные волны, это волны как на поверхности воды например , они двигаются гораздо медленнее.
Скорость таких волн может быть и 1.5м/с а в улитке может и меньше тогда они пройдут всю улитку за 0.03/1.5 = 0.02 с что уже какой никакой интервал, для частоты дискретизации 44100 это 880 семлов

То есть это что-то вроде динамичной интерференционной картинки? Может, оно и так...

То есть это что-то вроде динамичной интерференционной картинки? Может, оно и так...

Не думаю что там имеет место интерференция, во всяком случае если она и есть то она скорее мешает

Нашлась публикация про исследование в области аккустических призм.

В радиотехнике ровно такой-же принцип направленного излучения и приёма применяется в ФАР с частотным сканированием.

Ближайший оптический аналог такому устройству - не призма, а скорее дифракционная решётка.

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

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

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

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

10 мкс это 1/100000 секунды, если еще вспомнить что стандартная частота дискретизации звука 44100 отсчетов в секунду, то разрешение 10мкс ЯВНО избыточно, более того за пространственные эффекты отвечают волны соответствующие частоте 500гц и ниже на сколько помню, т.е не нужны никакие 10мкс.

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

Тут вообще никакой проблемы, не нужно нейрону испускать спайки с частотой 20кгц чтобы работать с этой частотой, достаточно иметь много нейронов которые будут скажем 60 раз в секунду копировать в буфер мозга кусок сигнала длинной 1/60 сек.

Про 10 мкс я честно списал из Википедии) При скорости звука 340 м/с и расстоянии между ушами 20 см это даст разрешение по азимуту 1°. Наверное, 1° - это действительно перебор, проверю как-нибудь в аудио-редакторе. Но перемещение источника звука на 5° уже вполне заметно. И даже 50 мкс - это тоже какая-то невероятная для физиологии цифра.

достаточно иметь много нейронов которые будут скажем 60 раз в секунду копировать в буфер мозга кусок сигнала длинной 1/60 сек

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

Про 10 мкс я честно списал из Википедии) При скорости звука 340 м/с и расстоянии между ушами 20 см это даст разрешение по азимуту 1°. Наверное, 1° - это действительно перебор, проверю как-нибудь в аудио-редакторе. Но перемещение источника звука на 5° уже вполне заметно. И даже 50 мкс - это тоже какая-то невероятная для физиологии цифра.

Ну тут надо иметь в виду что сдвиг между каналами никуда не пропадает, т.е например щелчок длительностью 1/4 секунды, пусть приходит с задержкой 50 мкс, но эта задержка справедлива для всего интервала в 1/4 сек.
Если частота 20 кгц (в принципе некоторые слышат), соответствует периоду 1/20000 = 50мкс, то разрешающая способность нервных клеток вполне себе близка к 50мкс , а далее просто вычитать правый сигнал из левого пока 0 не получим чтобы понять какой временной сдвиг между ними.

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

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

А точность захвата - в каком смысле? Чтобы в правом и левом канале было одно и тоже?

Чтобы сравнить сигналы. Пускай они и доходят до мозга с задержкой, и обрабатываются не быстро, но нужно точно знать, в какое время они были получены. И вот как-то из физиологии не понятно, как достигается настолько точная калибровка.

Чтобы сравнить сигналы. Пускай они и доходят до мозга с задержкой, и обрабатываются не быстро, но нужно точно знать, в какое время они были получены. И вот как-то из физиологии не понятно, как достигается настолько точная калибровка.

Человеческий организм симметричный, хотя между правой половиной и левой есть небольшие отличия, но суть в том что обе половины растут одновременно по одинаковому алгоритму. Похожая ситуация со зрением - очевидно что картинки которые дают левый и правый глаза немножко отличаются - по другому не бывает в реальном мире, однако это не мешает получать глубину сравнивая картинки. Я предполагаю что в детском возрасте - еще не сознательном, подсознание настраивает мозг на восприятие мира. Задача выглядит примерно так: есть 2 сигнала очень похожих но не одинаковых, между ними может быть задержка по умолчанию а может не быть, как откалибровать их так чтобы когда источник звука был прямо перед глазами временная разница между ними была бы 0.
И тут нужен какой-то опорный звук про который точно известно что для него разница между правым и левым каналом = 0. Что это может быть? На ум приходит собственный голос например. Или звук, источник которого рядом. С другой стороны может быть и другой вариант, подсознание научается ориентироваться в пространстве и сопоставляет звуковые сигналы и задержки между ними с координатами источника звука.

Интересный способ вычисления точной частоты по БПФ.

Я в своей программке на Pixilang делал по-другому: использовал два фрейма, перекрывающихся на 3/4 длины, и измерял разницу в фазах. Вот две статьи, описывающие принцип данного алгоритма. Для борьбы с утечкой спектра проще всего использовать окно Хэмминга (y = 0.53836-0.46164*cos(2*pi*x)), оно даёт наиболее узкую полосу и приемлемый уровень шума.

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

Интересная идея с "цветком". Обычно для создания двумерной осциллограммы из одномерной используют простейший метод - по оси х откладывают исходный сигнал, а по оси у - первую производную. Но дифференцирование искажает спектр, оно усиливает высокие частоты. Не пробовали ли вы вычислять вторую координату с помощью фазового фильтра, поворачивая фазы на pi/2 (через БПФ или что-нибудь типа преобразования Гильберта)?

Оу, честно говоря, БПФ - это прям кроличья нора... На момент написания начальной статьи про точное определение частот аудиосигналов даже не подозревал о её масштабах и глубинах.

Алгоритм коррекции частоты по разности фаз у накладывающихся кадров действительно рабочий (реализация на C#), он применялся в Solfeggio ранних версий совместно с грубой дорисовкой пиков.

Но в последующем на основе длительных исследований и экспирементальных наблюдений был выработан алгоритм фазо-амплитудной интерполяции (ФАИ), о котором была опубликована статья «Загадки быстрого преобразования Фурье». На текущий момент статья во многом сохраняет свою актуальность, но сам алгоритм претерпел некоторые усовершенствования. Код текущей релизной версии доступен по ссылкам: GitLab, Bitbucket.

Ролик с псилоцибиновыми грибами на осциллографе опубликовали чуть выше, но ещё есть видео от канала Veritasium с грибами ядерными, по форме весьма напоминающими мухоморы.

Чтобы проникнуться темой и кое-что узнать об истории открытия алгоритма БПФ рекомендую к просмотру

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

Не пробовали ли вы вычислять вторую координату с помощью фазового фильтра, поворачивая фазы на pi/2 (через БПФ или что-нибудь типа преобразования Гильберта)?

Именно такие подходы не исследовал, из описания мне не совсем ясны детали их реализации.

Вычисляем прямое преобразование Фурье, умножаем спектр на i*sgn(w) и вычисляем обратное преобразование. АЧХ сохраняется, ФЧХ поворачивается на четверть цикла.

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

Кстати, можно сделать ещё проще: обнуляем отрицательную часть Фурье-образа - и у сигнала появляется мнимая составляющая. Можно сразу выводить на дисплей.

Вы сейчас из БПФ с помощью чёрной магии находите несколько выделяющихся частот в спектре сигнала. Потом их синтезируете и сдвигаете фазу на 90° вот здесь:

	a += magnitude * Math.Cos(phase);
	b += magnitude * Math.Sin(phase);

@iShrimp предлагает пропустить шаг поиска частот. Вместо этого взять весь спектр, и сдвинуть фазы всех частот на 90°. Раз уж комплексное БПФ посчитано, умножить его на ±i и преобразовать обратно в сигнал. Или сдвинуть фазу исходного сигнала фильтром

После этого в визуализации, как и сейчас, нарисовать трек сигнала - по оси X отложить исходный сигнал, а по Y обработанный, сдвинутый на 90°.

Ещё пара моментов: про метод интерполяции частоты и фазы. Сам похожей штукой пользовался, только считал по 3 точкам, а не по 4. Метод вполне можно обосновать аналитически, или хотя-бы графически выявить зависимость соседних комплексных амплитуд от сдвига частоты.

А вот интерполируя фазу в лоб вот так

  var bcP = bP + (bcF - bF) * (cP - bP) / (cF - bF);

вы будете получать непредсказуемые результаты при переходе через 180°. Например, интерполяция посередине между cP=+170° и bP=-170° (оно же 190°) вам даст 0°, а на самом деле будет 180°. Намного удобнее продолжать считать в комплексных числах, не вычисляя фазу явно.

Большое спасибо за пояснение, кажется, мне стало понятнее! Есть подозрение, что получится та же геометрическая картинка, но это надо проверить...

Про переходы фаз - это отдельная головоломка! Но в практических экспериментах следующий алгоритм неплохо справляется и с этой задачей

		var distance = (cP - bP) / Pi.Single;
		var turn = Math.Abs(distance + 0.5) > 1.0;

		...
		var bcP = bP + (bcF - bF) * (cP - bP) / (cF - bF);
		/* y(x) = y0 + ( x  - x0) * (y1 - y0) / (x1 - x0) */

		if (turn)
			bcP += Pi.Double * (cF - bcF) / (cF - bF);
		if (bcP > Pi.Single)
			bcP -= Pi.Double;

Только не спрашивайте, как его получил... Долго эксперементировал - и вывелось из наблюдений интуитивно!

только считал по 3 точкам, а не по 4

Ранее пробовал использовать параболическую интерполяцию по трём точкам, но всё же для моих задач точность ФАИ по четырём оказалась существенно выше, хотя аналитических обоснований у меня до сих пор нету... Формулы выводились путём моделирования не очень сложных идеальных сигналов и наблюдений за их спектрами при плавных изменениях входных параметров.

На андроиде на программу падучая напала. Все падает и падает. А когда работает, то ничего не понятно.

Спасибо за обратную связь! Разработка под Андроид очень специфичное занятие, поскольку нередко случается, что программа работает на одном устройстве, но падает на другом... Если дойдут краш-логи, то по возможности постараюсь ошибку пофиксить.

Десктоп-версия для Windows более надёжная и функциональная, поэтому в качестве альтернативы можно начать изучение с неё.

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

Не про программирование, но муз.теорию вспомнилась одноимённая книга Geomerty of Music.

Получается, вы аппоксимировали звуковые колебания гармонической моделью, которую, затем, визуально отобразили?

То есть это визуализация гармонического осциллятора на .Net?

Не уверен, что верно понял ваш вопрос, но, резюмируя, алгоритм в общих чертах следующий:

  1. берётся временной кадр [например, 1024 отсчёта] с прямоугольным окном

  2. произвобится быстрое преобразование Фурье для получения спектрального кадра

  3. выполняется интерполяция спектрального кадра по фазе и амплитуде (ФАИ)

  4. выделяются значимые гармоники сигнала

  5. на основе значимых гармоник происходит построение геометрии

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

В приложении Solfeggio сигнал с генератора синтезируются и подаётся на вход для дальнейшей обработки по полному циклу, поскольку это было необходимо для отладки алгоритма ФАИ.

Алгоритм и программа реализованы на языке C# (платформа .NET), для визуализации в десктопной версии использована технология WPF, а в мобильной связка: платформа Xamarin + графический фреймворк Skia.

~

Также в комментариях выше (1, 2) @iShrimp и @alcotel подсказали, что подобную геометрию (но без интерполяции) в теории можно получить и немного другим путём:

  1. берётся временной кадр [например, 1024 отсчёта] с прямоугольным окном

  2. произвобится быстрое преобразование Фурье для получения спектрального кадра

  3. необходимо умножить спектр БПФ на плюс/минус мнимую единицу (знак влияет на ориентацию геометрии по либо против часовой стрелки), что эквивалентно сдвигу спектра по фазе на +/-90 градусов

  4. затем для сдвинутого спектра нужно выполнить обратное БПФ, чтобы получить смещённый по фазе исходный сигнал во временной области

  5. после чего по оси Y откладывать оригинальный исходный сигнал, а по оси X смещённый по фазе

На практике это предположение пока что не проверял, но оно очень похоже на правду.

необходимо умножить спектр БПФ на плюс/минус мнимую единицу (знак влияет на ориентацию геометрии по либо против часовой стрелки), что эквивалентно сдвигу спектра по фазе на +/-90 градусов

Даже простейший способ с обнулением половины спектра работает, можете посмотреть демку на Pixilang. Правда, даёт много шума.

Ламповая и красивая демка получилась, благодарю! Эффект постепенного угасания добавляет картинке плавности и живости!

Охренительная статья, в закладки ! Огромный респект и уважуха тебе, добрый аффтар ! :))) Что пришло в голову. А нельзя таким способом сжимать векторные картинки ??? То что в самом начале статьи, смотрится очень пристойно. 250 комплексных амплитуд для такого качества по-моему весьма неплохой результат.

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

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

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

Хорошее приложение "SOLFEGGIO": год назад скачивал, побаловался, "SOLFEGGIO" точно вычислила частоту играющей струны на гитаре! :)

Большое спасибо за обратную связь! Радует и вдохновляет, что статья такой непростой тематики кому-то интересна!

Sign up to leave a comment.

Articles