Частотное разложение: ЧАСТОТНОЕ РАЗЛОЖЕНИЕ — Olga Pavolga
Частотное разложение в Фотошопе (Полный урок)
Всем привет на уроке от WiFiGiD.RU. Сегодня мы поговорим про частотное разложение фотографии в Фотошопе. Для начала давайте я коротко расскажу, что это за зверь такой.
Частотное разложение изображения – процедура при которой текстура рисунка отделяется от слоя с оттенком и другими цветовыми тонами.
Очень часто используется при обработке портретных фото. При работе с частотным разложением у нас будет два слоя. Первый (верхний) – слой текстуры кожи и других поверхностей. Второй (нижний или фоновый) – будет содержать информацию только о тоне и цвете.
Для чего это нужно? При работе с двумя слоями, которые отвечают за разного рода информацию, проще обрабатывать очень сложные в структуре фотографии. Таким образом можно добавить максимального реализма при серьезной обработке. Подобная процедура часто используется при создании объемных текстур в играх и 3D-анимации.
В уроке ниже мы пошагово и на русском языке посмотрим, как правильно делать частотное разложение в программе Фотошоп. Если в процессе возникнут какие-то вопросы – пишите в комментариях.
Содержание
- ШАГ 1: Создание дополнительных слоев
- ШАГ 2: Правка текстуры
- ШАГ 3: Исправление тона
- Задать вопрос автору статьи
ШАГ 1: Создание дополнительных слоев
Давайте на конкретном примере познакомимся с методом частотного разложения в Фотошопе. Для урока я взял фотографию глаз девушки. Наша задача: частично убрать некоторые погрешности. Конечно, мы можем начать использовать «Восстанавливающую кисть», но в таком случае обработка будет слишком грубая.
- В первую очередь нам нужно создать две копии нашей основной картинки. Для этого два раза используем горячие клавиши:
Ctrl + J
- Верхний слой у нас будет «Текстура», а нижний «Тон». Основной «Фон» – это изначальная картинка, мы будем периодически к ней обращаться для сравнения результата.
- Выключаем отображение текстурного слоя и переходим на слой «Тон».
- Напомню, что на слое «Тон» у нас не должно быть никакой текстуры и должен быть только цвет. Для этого в разделе «Фильтр» находим «Размытие». Проще всего использовать «Размытие по Гауссу».
- Выставите такое значение, чтобы полностью пропала текстура и остался только цвет. Значение может быть больше или меньше в зависимости от разрешения изображения. Поэтому смотрите и устанавливайте значение на глаз. Обязательно запомните то число, которого установили (нам оно еще понадобится).
- Перейдите теперь на вкладку «Текстура» и примените «Фильтр» – «Краевой контраст» (может находиться на вкладке «Другое»). На старых версиях Photoshop может называться как «Цветовой контраст».
- Выставляем такое же значение как при размытии.
- Находясь на том же самом слое, выставите режим «Яркий свет».
Далее вы должны увидеть такую картинку как на «Фоне». Чтобы быстро проверить сходство, зажмите клавишу Alt и кликните левой кнопкой мыши по глазу рядом с «Фоном».
Скорее всего, вы увидите, что наше изображение с тоном и текстурой немного более контрастное. Чтобы немного подправить картинку, находясь в «Текстуре», добавьте «Кривые».
Ваша задача немного поднять левую грань и опустить правую. Теперь снова сравниваем с фоном, как мы это делали ранее. Нужно добиться примерно такого же результата как на изначальном изображении (Фон).
ШАГ 2: Правка текстуры
На самом деле частотное разложение мы выполнили, но давайте я покажу вам как с этими изображениями работать. Выключите отображение всех слоев кроме «Текстур».
Найдите инструмент «Восстанавливающая кисть» и используйте её.
Нам нужно на текстуре убрать на лице девушки все дефекты, прыщики угри и т.д. Выберите подходящий размер кисти таким образом, чтобы вы могли полностью «закрасить» все дефекты.
На лице находим участок чистой кожи с текстурой, зажимаем клавишу Alt и, не отпуская, её кликаем мышью по этому участку.
Теперь если вы будете рисовать, то кисть будет брать текстуру отсюда. Внимательно закрасьте все дефекты. Будьте очень аккуратны, чтобы текстура была равномерная.
ШАГ 3: Исправление тона
Кожу мы сделали идеальной, но теперь наша задача исправить некоторые моменты на слое «Тон». Выключите отображение «Текстуры» и перейдите слой с цветом тона.
На данном слое вы можете заметить пятна, которые остались после смазывания. Их лучше убрать.
Для закрашивания используем «Кисть».
Выберите мягкую кисточку, чтобы при закрашивании не было резких переходов, а закрашенные места не смотрелись дополнительными пятнами.
И осталось самое главное – аккуратно закрасить все яркие пятна на лице. Сама инструкция будет такая:
- Зажимаем клавишу Alt.
- Автоматически выберется инструмент «Пипетка». Не отпуская кнопку на клавиатуре, кликаем по тому месту, где идет равномерный цвет кожи рядом с пятном (более светлая часть).
- Отпускаем клавишу Alt
- Возвращается инструмент «Кисть». Теперь аккуратно закрашиваем пятно.
Делаем все до тех пор, пока все яркие пятна не будут закрашены, а цвет кожи не станет равномерным. Самое главное делать все максимально аккуратно, чтобы сохранить тени и полутени лица. В самом конце можете сравнить результат с изначальным изображением (Фон).
Частотное разложение 4. Конспект занятия
Запись прошедшего 2 ноября мастер-класса доступна в течении недели только записавшимся на занятие. В свободный доступ видео выкладываться не будет. Тем, кто не успел записаться, но желает посетить такое занятие предлагаю следить за анонсами школы Profile. В декабре планируется повтор этого занятия.А чтобы все остальные не чувствовали себя обделенными, предлагаю
UPD (апрель 2014):
Если данная статья покажется вам не удачной и/или не очень подробной, или вы просто предпочитаете «посмотреть», а не «почитать», предлагаю ознакомиться с постом «Частотное разложение. Ultimate. Конспект и видео». В нем представлен конспект одноименного онлайн мастер-класса и видеозапись МК (общей продолжительностью 5 часов 13 минут), нарезанная на части соответствующие разделам конспекта.
Что такое пространственные частоты.
Частота с которой меняется яркость при перемещении по горизонтали или вертикали
Чем выше частота, тем быстрее меняется яркость, тем мельче детали которые она задает
Самые мелкие детали — это перепады яркости на контрастных контурах
Самые низкие частоты задают общее распределение яркости и, как следствие, цвета
Средние частоты уточняют эту картинку принося основные объемы объектов
Верхние частоты добавляют самую мелкую детализацию — фактуру поверхностей
Разложение изображения на две полосы частот.
Gaussian Blur — фильтр нижних пространственных частот
Чем больше Raduis, тем более крупные детали убираются, тем ниже оставшиеся частоты
High Pass — фильтр верхних пространственных частот, дополнительный к Gaussian Blur
High Pass показывает детали, которые убрал Gaussian Blur при том же значении Radius
Эти детали отображаются в виде отклонения от средне-серого цвета
Добавить эти отклонения к исходному изображению может режим Linear Light
Контраст ВЧ-слоя надо понизить в два раза, чтобы скомпенсировать заложенное в Linear Light удвоение
Почему выгодно править частотные полосы по отдельности.
При ретуши необходимо согласовывать цвет и его переходы с одной стороны и фактуру поверхности с другой
При исправлении формы крупных объектов выгодно использовать пониженную непрозрачность
Для сохранения мелких объектов (фактура поверхности) необходимо использовать 100% непрозрачность
Мягкая граница кисти у штампа — вынужденный компромисс между этими двумя требованиями
Жесткий стык между однородными однотипными фактурами заметен не будет
Выбор радиуса при разложении на две полосы частот.
Для Gaussian Blur выгодно задавать большой радиус, чтобы максимально убрать фактуру
Для High Pass выгодно задавать малый радиус, чтобы не пропустить объемы
Конкретное значение выбирается как компромиссный вариант между этими двумя условиями
При этом учитывается детали какой крупности мы относим к фактуре
Радиус Gaussian Blur удобнее подбирать плавно увеличивая его, пока не исчезнут ненужные детали
Радиус High Pass удобнее подбирать плавно уменьшая его, пока не пропадут ненужные объемы
Ретушь НЧ-составляющей — исправление формы.
Работаем штампом с мягкой кистью и пониженной непрозрачностью
Можно работать на новом прозрачном слое с настройкой штампа Sample: Current & Below
При этом на экран можно вывести общий вид картинки, а не только НЧ слоя.
При необходимости можно рисовать кистью или любыми другими инструментами
Ретушь ВЧ-составляющей исправление фактуры.
Работаем штампом с жесткой кистью и 100% непрозрачностью
Можно работать на новом прозрачном слое с настройкой штампа Sample: Current & Below и отображением только ВЧ слоя
Чтобы ретушировать глядя на финальную картинку надо работать на самом ВЧ слое (его копии) с настройкой штампа Sample: Current Layer
При необходимости можно перенести текстуру с другой фотографии
Как побрить человека.
Вынести волоски (щетину) на ВЧ слой и заменить их фактурой чистой кожи
Если щетина была темная, поправить цвет на НЧ слое
Внимательно следите за фактурой, она сильно отличается на разных участках лица
«Брить» мужчину тяжело, поскольку на лице не хватает нужной фактуры
При необходимости нужную фактуру кожи можно взять с другой фотографии
Как работает Healing Brush.
На НЧ слое после размытия на участках рядом с контрастной границей появляется цвет соседней области
На ВЧ слое вдоль контрастных границ появляются ореолы противоположных цветов
Если в процессе ретуши ВЧ слоя убрать ореол на финальной картинке на этом участке появится цвет соседней области
Healing Brush переносит фактуру стараясь сохранить цвет редактируемого участка
Его работа построена на алгоритме частотного разложения, а значение радиуса привязано к размер кисти
«Честное» вычисление ВЧ-составляющей.
При наличии мелких деталей на массивном фоне отличающихся по яркости более чем на 128 уровней High Pass ошибается
Обычно это случается на точечных бликах расположенных на темном объекте
Чем больше радиус размытия, тем больше сама ошибка и вероятность ее появления.
Альтернативой High Pass является наложение на исходное изображение размытой версии при помощи команды Apply Image в режиме Subtract с установками Scale:2 Offset:128
Применять корректирующий слой понижающий контраст в этом случае не нужно, поскольку он уже понижен установкой Scale:2
Дополнительным плюсом такого метода является возможность применить для размытия не Gaussian Blur, а какой-нибудь другой фильтр
Борьба с пробойными бликами. Ретушь НЧ.
Изображение раскладывается на две полосы с установками обеспечивающими полный переход фактуры кожи на ВЧ слой
На НЧ слое участки пробойных бликов закрашиваются цветом кожи
При необходимости на них наносится свето-теневой рисунок передающий объем объекта
Борьба с пробойными бликами. Ретушь ВЧ.
Если блик пробойный и вообще не содержал фактуры, она переносится с целых участков кожи
Если блик близок к пробойному и фактура кожи все-таки содержится, после ретуши НЧ она визуально усилится
Чтобы смягчить этот эффект можно наложить на нее фактуру с более гладких участков на отдельном слое с пониженной непрозрачностью
Разложение на три полосы частот.
Задача такого разложения — вынести все дефекты в среднюю полосу частот
Для НЧ увеличиваем радиус Gaussian Blur пока не останется чистая форма
Для ВЧ уменьшаем радиус High Pass пока не останется чистая фактура
Создаем между нами слой средних частот применив к нему сначала High Pass с радиусом который использовался для создания НЧ, а потом Gaussian Blur с радиусом который использовался для создания ВЧ
Универсальное правило: High Pass следующего слоя имеет такой же радиус, как Gaussian Blur предыдущего
Теперь можно ретушировать средние частоты не обращая внимание не только на фактуру, но и на разницу цвета исходной и ретушируемой области
Таким образом можно бороться с объектами определенного типоразмера, например веснушками
Кроме того, в средних частотах находится большинство «старящих» элементов: глубина морщин, жилистость, вены, провисания, мешки под глазами и т. п.
Выделение средних частот — упрощенный метод.
Ретушируя средние частоты мы убираем лежащие в них излишние локальные объемы
Это можно сделать проще, не раскладывая изображение на три полосы, а выделить среднюю и вычесть ее из исходника
При этом подбирать радиус для High Pass удобнее через Gaussian Blur и наоборот
Делаем копию исходного слоя
Вызываем Gaussian Blur, плавно увеличиваем радиус пока не исчезнут ненужные детали, запоминаем его значение и нажимаем Cansel
Вызываем High Pass, плавно уменьшаем радиус пока не пропадут ненужные объемы, запоминаем его значение и вводим радиус подобранный на предыдущем шаге
Применяем Gaussian Blur с радиусом подобранным на предыдущем шаге
Инвертируем изображение
В два раза понижаем контраст вокруг средней точки
Переключаем режим наложения на Linear Light
Набрасываем черную маску
Белой кистью по маске прорисовываем те участки, на которых нужно подавить крупные детали
Соотношение радиусов должно быть 1:3 или меньше, иначе результат будет выглядеть слишком неестественным
За скорость и простоту приходится расплачиваться механистически правильной формой объектов, что визуально удешевляет работу
Для чего еще можно применять частотное разложение
Частотное разложение — это универсальный метод применимый к любому жанру фотографии
С его помощью можно смягчать слишком жесткие тени
Убирать складки на ткани или других материалах
Избавляться от разводов оставшихся после общей ретуши
Решать любые задачи, требующие различной работы с общей формой и мелкими деталями
Если кто-то из преподавателей решит утащить его целиком или частями в свою программу занятий, не буду иметь ничего против. Только не забывайте ссылаться на источник вдохновения. Это не обесценит ваш труд, но вызовет уважение окружающих.
Частотно-временное разложение — SEG Wiki
Содержание
- 1 Преобразование Фурье
- 2 Частотно-временное представление
- 3 Продолжить изучение
- 4 Автор, ответственный за переписку
- 5 Благодарностей
- 6 Внешние ссылки
Рассмотрим форму волны или сигнала s как функцию времени t . Например, синусоида с некоторой амплитудой a и с некоторой частотой f может быть определен как
s (t) = asin (2πft) {\ displaystyle s (t) = a \ sin (2 \ pi ft)}.
Мы можем реализовать эту математическую функцию как подпрограмму, обычно также называемую функцией , на языке программирования Python. Поскольку компьютеры живут в дискретном мире, мы необходимо оценить функцию в течение некоторого времени и с некоторой частотой дискретизации:
по определению sine_wave(f, a, продолжительность, частота дискретизации): t = np.arange(0, продолжительность, 1/sample_rate) вернуть * np.sin (2 * np.pi * f * t), т
Теперь мы можем вызвать эту функцию, передав ей частоту f = 261,63 Гц. Мы попросим 0,25 с с частотой дискретизации 10 кГц.
с, t = sine_wave(f=261,63, а=1, продолжительность=0,25, sample_rate=10e3)
Это приводит к следующему сигналу, обычно называемому временным рядом , который мы визуализируем путем построения графика s в зависимости от времени t :
Я изобразил результирующий массив в виде линии, но на самом деле это ряд дискретных точек, представленных в Python в виде массива чисел, начиная с этих четырех:
array([ 0. , 0.1636476 , 0.32288289, 0.47341253])
Построим первые 80 точек:
Когда воздух вибрирует на этой частоте, мы слышим среднее До или До4. Вы можете прослушать примечание для себя в Jupyter Notebook, сопровождающем эту статью, по адресу https://github.
com/seg/tutorials-2018. (Блокнот также содержит весь код для создания графиков.) Код для вывода массива s в виде звука очень короткий:из IPython.display import Audio фс = 10e3 Аудио(и, скорость=fs)
Этот сигнал длится всего 0,25 с, а покачиваний уже много. Мы бы хотели иметь сейсмические данные на этой частоте! Большинство сейсмических данных воспроизводятся только на нижних 20–30 клавишах 88-клавишного фортепиано — действительно, самая нижняя клавиша — это A0, что на частоте 27,5 Гц превышает пиковую частоту многих старых съемок.
Если бы мы хотели узнать частоту этого сигнала, мы могли бы предположить, что это чистый тон, и просто подсчитать количество циклов в единицу времени. Но естественные сигналы редко бывают монотонными, так что давайте сделаем более интересный сигнал. Мы можем использовать нашу функцию, чтобы создать до-мажорный аккорд с тремя нотами (C4, E4 и G4), передав векторы-столбцы (изменив форму массивов) для частоты 9.0021 f
f = np. массив ([261,6, 329,6, 392,0]) а = np.массив ([1,5, 0,5, 1]) s, t = sine_wave (f = f.reshape (3, 1), а=а.изменить(3, 1), продолжительность=0,25, sample_rate=10e3)
Результатом является набор из трех синусоидальных кривых длиной 0,25 с:
Общий сигнал определяется суммой трех кривых:
s = np.sum(s, axis=0)
Преобразование Фурье
Хотя это смешанное или политонный сигнал представляет собой просто сумму трех чистых тонов, разобраться в компонентах уже не тривиально. Здесь в дело вступает преобразование Фурье.
Мы не будем вдаваться в подробности того, как работает преобразование Фурье. Лучшее объяснение, которое я видел за последнее время, — это вводное видео Гранта Сандерсона. Дело в том, что преобразование описывает сигналы как смеси периодических составляющих. Попробуем на нашем аккорде.
Сначала мы конусность сигнала путем умножения его на функцию окна . Идеальные чистые тона имеют бесконечную продолжительность, а сужение помогает предотвратить влияние краев нашего конечного сигнала на преобразование Фурье.
s = s * np.blackman(s.size)
Оконная функция (зеленая) оказывает сужающее действие на сигнал:
Поскольку функция s определена для данного момента времени t , мы называем это представление сигнала временем 9(е) {\ Displaystyle {\ шляпа {s}} (е)}). Это новое представление называется частотной областью. Он состоит из массива
S = np.fft.fft(s)
Вспомогательная функция fftfreq()
возвращает массив частот, соответствующих коэффициентам. Интервал выборки частоты определяется длительностью сигнала с : чем длиннее сигнал, тем меньше интервал выборки частоты. (Точно так же короткие интервалы выборки по времени соответствуют широкой полосе пропускания по частоте.)
freq = np.fft.fftfreq(s.size, d=1/10e3)
Результатом является массив из коэффициентов Фурье , большинство из которых равны нулю. Но на частотах аккорда и вблизи них коэффициенты велики. Результат: «рецепт» аккорда с точки зрения синусоидальных монотонов.
Это называется спектром сигнала s . Он показывает величину каждой частотной составляющей.
Частотно-временное представление
Теперь мы знаем, как расплетать политонические сигналы, но давайте введем еще одно усложнение — сигналы, компоненты которых меняются со временем. Такие сигналы называются нестационарный . Например, подумайте о монотонном сигнале, тон которого меняется в какой-то момент (см. Блокнот для кода, который генерирует этот сигнал):Мы можем вычислить преобразование Фурье этого сигнала, как и раньше:
с *= np.blackman(s.size) S = np.fft.fft(s) freq = np.fft.fftfreq(s.size, d=1/10e3)
И постройте амплитуду S
в зависимости от массива частот freq
:
Он очень похож на спектр, который мы сделали раньше, но без средней частоты. Пики немного более рассредоточены, потому что продолжительность каждого сигнала вдвое меньше, чем была. (Общий принцип неопределенности распространяет сигналы по частоте по мере того, как они становятся более компактными во времени.)
Дело в том, что нет большой разницы между спектром двух смешанных сигналов и спектром двух последовательных сигналов. Если мы заботимся о локализации сигналов во времени (мы делаем!), это проблема. Одним из решений является обращение к частотно-временным представлениям . Пытаясь разделить сигнал одновременно по времени и частоте, они предлагают способ одновременного использования преимуществ обеих областей.
Библиотека для построения графиков Python matplotlib
предлагает удобный способ построения графика время-частота, также известного как спектрограмма . В одной строке кода он создает график 2D-изображения, показывающий зависимость частоты от времени.
_ = plt.specgram(s, Fs=1/10e3, NFFT=512, noverlap=480)
Немного поработав, мы можем получить очень богатое представление наших данных:
График использует алгоритм, называемый кратковременным преобразованием Фурье, или STFT.
Это просто делает преобразование Фурье в скользящем окне длиной NFFT
с перекрытием
точек, перекрывающихся в предыдущем окне. Мы хотим NFFT
должен быть длинным, чтобы получить хорошее разрешение по частоте, и мы хотим, чтобы nooverlap
был большим, чтобы получить хорошее разрешение по времени.Обратите внимание, что мы не можем точно увидеть точную частоту компонентов — они не служат достаточно долго, чтобы их можно было зафиксировать. И есть некоторая неопределенность в отношении сроков перехода, потому что для получения приличного разрешения по частоте нам нужен длинный сегмент сигнала (в данном случае 512 отсчетов) — поэтому мы теряем информацию о времени. Но в целом этот сюжет лучше, чем только спектр: мы видим, что есть по крайней мере два сильных сигнала с частотами около 250 и 400 Гц, и что изменение происходит примерно через 0,125 с.
Фрагмент фортепианной музыки может напоминать такой сюжет. Поскольку клавиши пианино могут воспроизводить только одну ноту, спектрограмма фортепианной музыки выглядит как серия горизонтальных линий:
Существует большое сходство между этим частотно-временным разложением и нотной записью:
Оказывается, самые интересные сигналы — и, возможно, все естественные сигналы — политонны и нестационарны. По этой причине, хотя временные ряды часто полезны, частотно-временная декомпозиция может быть очень показательной. Вот некоторые примеры; в каждом случае частота отложена по вертикальной оси, а время по горизонтальной оси. Цвета указывают мощность от низкой (синий) до высокой (желтый) (пропорционально квадрату амплитуды).
Человеческий голос произносит «SEG». Сонорные гласные имеют гармоники (горизонтальные полосы), а шипящие звуки «С» и первой части «Г» — шумоподобные. спектральные отклики.На этой спектрограмме показана 5-секундная серия чириканий летучих мышей. Я указал 18 кГц, приблизительный предел человеческого слуха, оранжевой линией, и если вы слушаете звук этого сигнала в Ноутбук, можно убедиться, что чириканье еле слышно при нормальной скорости воспроизведения; только при замедлении клипа они могут быть отчетливо слышны.
Наконец, вот вулканический «крик» — гармонический толчок, предшествующий взрывному извержению на горе Редут, Аляска, в марте 2009 года. На слух это звучит невероятно, но спектрограмма тоже интересно. В отличие от чириканья летучей мыши, этот 15-минутный временной ряд нужно ускорить, чтобы его услышать.
Продолжить изучение
Все рисунки в этой записной книжке можно воспроизвести с помощью кода в записной книжке Jupyter, прилагаемой к этой статье, на https://github.com/seg/tutorials-2018. Вы даже можете запустить код в облаке и поиграть с ним в браузере. Ничего не сломаешь — не волнуйся!
В хранилище вы также найдете больше сигналов, синтетических и естественных, от сердцебиения и загадочного подводного щебетания до гравитационных волн и сейсмических следов. Мало того, есть записная книжка, показывающая, как использовать другой алгоритм — непрерывное вейвлет-преобразование — для проведения частотно-временного анализа другого типа.
Счастливого разложения!
Автор, ответственный за переписку
- Автор, ответственный за переписку: Matt Hall, Agile Scientific, Mahone Bay, Новая Шотландия, Канада. Электронная почта:
mattagilescientific.com
Благодарности
Фортепианная запись из BWV846 Баха лицензирована Кимико Ишизака CC-BY на http://welltemperedclavier.org. Данные чириканья летучих мышей лицензированы CC-BY-NC пользователем http://freesound.org klankschap. Спасибо Алисии Хотовек-Эллис за ее помощь с данными о горе Редут, записанными вулканической обсерваторией Геологической службы США на Аляске.
Внешние ссылки
найти литературу о Частотно-временное разложение |
- Мадагаскарский рабочий процесс — воспроизводимый с помощью Мадагаскарского программного обеспечения с открытым исходным кодом
Частотно-временная декомпозиция — SEG Wiki
Рассмотрим форму волны или сигнала s как функцию времени t . Например, синусоидальная волна с некоторой амплитудой a и с некоторой частотой f может быть определена как
s (t) = asin (2πft) {\ displaystyle s (t) = a \ sin (2 \ pi ft)}.
Мы можем реализовать эту математическую функцию как подпрограмму, обычно также называемую функцией , на языке программирования Python. Поскольку компьютеры живут в дискретном мире, мы необходимо оценить функцию в течение некоторого времени и с некоторой частотой дискретизации:
по определению sine_wave(f, a, продолжительность, частота дискретизации): t = np.arange(0, продолжительность, 1/sample_rate) return a * np.sin(2 * np.pi * f * t), t
Теперь мы можем вызвать эту функцию, передав ей частоту f = 261,63 Гц. Мы попросим 0,25 с с частотой дискретизации 10 кГц.
с, t = sine_wave(f=261,63, а=1, продолжительность=0,25, sample_rate=10e3)
Это приводит к следующему сигналу, обычно называемому временной ряд , который мы визуализируем путем построения графика s в зависимости от времени t :
Я изобразил результирующий массив в виде линии, но на самом деле это ряд дискретных точек, представленных в Python в виде массива чисел, начиная с этих четырех:
array([ 0. , 0.1636476 , 0.32288289, 0.47341253])
Построим первые 80 точек:
Когда воздух вибрирует на этой частоте, мы слышим среднее До или До4. Вы можете прослушать примечание для себя в Jupyter Notebook, сопровождающем эту статью, по адресу https://github.com/seg/tutorials-2018. (В блокноте также содержится весь код для построения графиков.) Код для отображения массива s , так как звук очень короткий:
из IPython.display import Audio фс = 10e3 Audio(s, rate=fs)
Этот сигнал имеет длину всего 0,25 с, а шевелений уже много. Мы бы хотели иметь сейсмические данные на этой частоте! Большинство сейсмических данных воспроизводятся только на нижних 20–30 клавишах 88-клавишного фортепиано — действительно, самая нижняя клавиша — это A0, что на частоте 27,5 Гц превышает пиковую частоту многих старых съемок.
Если бы мы хотели узнать частоту этого сигнала, мы могли бы предположить, что это чистый тон, и просто подсчитать количество циклов в единицу времени. Но естественные сигналы редко бывают монотонными, так что давайте сделаем более интересный сигнал. Мы можем использовать нашу функцию, чтобы создать до-мажорный аккорд с тремя нотами (C4, E4 и G4), передав векторы-столбцы (изменив форму массивов) для частоты 9.0021 f и амплитуда a :
f = np.массив ([261,6, 329,6, 392,0]) а = np.массив ([1,5, 0,5, 1]) s, t = sine_wave (f = f.reshape (3, 1), а=а.изменить(3, 1), продолжительность=0,25, sample_rate=10e3)
Результатом является набор из трех синусоидальных кривых длиной 0,25 с:
Общий сигнал определяется суммой трех кривых:
s = np.sum(s, axis=0)
Преобразование Фурье
Хотя это смешанное или политонный сигнал представляет собой просто сумму трех чистых тонов, разобраться в компонентах уже не тривиально. Здесь в дело вступает преобразование Фурье.
Мы не будем вдаваться в подробности того, как работает преобразование Фурье. Лучшее объяснение, которое я видел за последнее время, — это вводное видео Гранта Сандерсона. Дело в том, что преобразование описывает сигналы как смеси периодических составляющих. Попробуем на нашем аккорде.
Сначала мы конусность сигнала путем умножения его на функцию окна . Идеальные чистые тона имеют бесконечную продолжительность, а сужение помогает предотвратить влияние краев нашего конечного сигнала на преобразование Фурье.
s = s * np.blackman(s.size)
Оконная функция (зеленая) оказывает сужающее действие на сигнал:
Поскольку функция s определена для данного момента времени t , мы называем это представление сигнала временем 9(е) {\ Displaystyle {\ шляпа {s}} (е)}). Это новое представление называется частотной областью. Он состоит из массива коэффициентов Фурье :
S = np.fft.fft(s)
Вспомогательная функция fftfreq()
возвращает массив частот, соответствующих коэффициентам. Интервал выборки частоты определяется длительностью сигнала с : чем длиннее сигнал, тем меньше интервал выборки частоты. (Точно так же короткие интервалы выборки по времени соответствуют широкой полосе пропускания по частоте.)
freq = np.fft.fftfreq(s.size, d=1/10e3)
Результатом является массив из коэффициентов Фурье , большинство из которых равны нулю. Но на частотах аккорда и вблизи них коэффициенты велики. Результат: «рецепт» аккорда с точки зрения синусоидальных монотонов.
Это называется спектром сигнала s . Он показывает величину каждой частотной составляющей.
Частотно-временное представление
Теперь мы знаем, как расплетать политонические сигналы, но давайте введем еще одно усложнение — сигналы, компоненты которых меняются со временем. Такие сигналы называются нестационарный . Например, подумайте о монотонном сигнале, тон которого меняется в какой-то момент (см. Блокнот для кода, который генерирует этот сигнал):
Мы можем вычислить преобразование Фурье этого сигнала, как и раньше:
с *= np. blackman(s.size) S = np.fft.fft(s) freq = np.fft.fftfreq(s.size, d=1/10e3)
И постройте амплитуду S
в зависимости от массива частот freq
:
Он очень похож на спектр, который мы сделали раньше, но без средней частоты. Пики немного более рассредоточены, потому что продолжительность каждого сигнала вдвое меньше, чем была. (Общий принцип неопределенности распространяет сигналы по частоте по мере того, как они становятся более компактными во времени.)
Дело в том, что нет большой разницы между спектром двух смешанных сигналов и спектром двух последовательных сигналов. Если мы заботимся о локализации сигналов во времени (мы делаем!), это проблема. Одним из решений является обращение к частотно-временным представлениям . Пытаясь разделить сигнал одновременно по времени и частоте, они предлагают способ одновременного использования преимуществ обеих областей.
Библиотека для построения графиков Python matplotlib
предлагает удобный способ построения графика время-частота, также известного как спектрограмма . В одной строке кода он создает график 2D-изображения, показывающий зависимость частоты от времени.
_ = plt.specgram(s, Fs=1/10e3, NFFT=512, noverlap=480)
Немного поработав, мы можем получить очень богатое представление наших данных:
График использует алгоритм, называемый кратковременным преобразованием Фурье, или STFT. Это просто делает преобразование Фурье в скользящем окне длиной NFFT
с перекрытием
точек, перекрывающихся в предыдущем окне. Мы хотим NFFT
должен быть длинным, чтобы получить хорошее разрешение по частоте, и мы хотим, чтобы nooverlap
был большим, чтобы получить хорошее разрешение по времени.
Обратите внимание, что мы не можем точно увидеть точную частоту компонентов — они не служат достаточно долго, чтобы их можно было зафиксировать. И есть некоторая неопределенность в отношении сроков перехода, потому что для получения приличного разрешения по частоте нам нужен длинный сегмент сигнала (в данном случае 512 отсчетов) — поэтому мы теряем информацию о времени. Но в целом этот сюжет лучше, чем только спектр: мы видим, что есть по крайней мере два сильных сигнала с частотами около 250 и 400 Гц, и что изменение происходит примерно через 0,125 с.
Фрагмент фортепианной музыки может напоминать такой сюжет. Поскольку клавиши пианино могут воспроизводить только одну ноту, спектрограмма фортепианной музыки выглядит как серия горизонтальных линий:
Существует большое сходство между этим частотно-временным разложением и нотной записью:
Оказывается, самые интересные сигналы — и, возможно, все естественные сигналы — политонны и нестационарны. По этой причине, хотя временные ряды часто полезны, частотно-временная декомпозиция может быть очень показательной. Вот некоторые примеры; в каждом случае частота отложена по вертикальной оси, а время по горизонтальной оси. Цвета указывают мощность от низкой (синий) до высокой (желтый) (пропорционально квадрату амплитуды).
Человеческий голос произносит «SEG». Сонорные гласные имеют гармоники (горизонтальные полосы), а шипящие звуки «С» и первой части «Г» — шумоподобные. спектральные отклики.
На этой спектрограмме показана 5-секундная серия чириканий летучих мышей. Я указал 18 кГц, приблизительный предел человеческого слуха, оранжевой линией, и если вы слушаете звук этого сигнала в Ноутбук, можно убедиться, что чириканье еле слышно при нормальной скорости воспроизведения; только при замедлении клипа они могут быть отчетливо слышны.
Наконец, вот вулканический «крик» — гармонический толчок, предшествующий взрывному извержению на горе Редут, Аляска, в марте 2009 года. На слух это звучит невероятно, но спектрограмма тоже интересно. В отличие от чириканья летучей мыши, этот 15-минутный временной ряд нужно ускорить, чтобы его услышать.
Продолжить изучение
Все рисунки в этой записной книжке можно воспроизвести с помощью кода в записной книжке Jupyter, прилагаемой к этой статье, на https://github.com/seg/tutorials-2018. Вы даже можете запустить код в облаке и поиграть с ним в браузере. Ничего не сломаешь — не волнуйся!
В хранилище вы также найдете больше сигналов, синтетических и естественных, от сердцебиения и загадочного подводного щебетания до гравитационных волн и сейсмических следов.