• О классификации методов преобразования Фурье на примерах их программной реализации средствами Python

    • Tutorial

    Введение


    Публикации по методу Фурье условно можно разделить на две группы. Первая группа так называемых познавательных публикаций, например, [1,2].

    Вторая группа публикаций касается применения преобразований Фурье в технике, например, при спектральном анализе [3,4].

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

    Задачи публикации


    Провести классификацию методов преобразования Фурье на примерах их программной реализации средствами Python. При этом для облегчения чтения использовать формулы только в программном коде с соответствующими пояснениями.

    Гармонический анализ и синтез


    Гармоническим анализом называют разложение функции f(t), заданной на отрезке [0, Т] в ряд Фурье или в вычислении коэффициентов Фурье по формулам.

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

    Программная реализация
    #!/usr/bin/python
    # -*- coding: utf-8 -*
    from scipy.integrate import quad # модуль для интегрирования
    import matplotlib.pyplot as plt # модуль для графиков
    import numpy as np # модуль для операций со списками и массивами
    T=np.pi; w=2*np.pi/T# период и круговая частота
    def func(t):# анализируемая функция
             if t<np.pi:
                      p=np.cos(t)
             else:
                      p=-np.cos(t)
             return p
    def func_1(t,k,w):# функция для расчёта коэффициента a[k] 
             if t<np.pi:
                      z=np.cos(t)*np.cos(w*k*t)
             else:
                      z=-np.cos(t)*np.cos(w*k*t)
             return z
    def func_2(t,k,w):#функция для расчёта коэффициента b[k] 
             if t<np.pi:
                      y=np.cos(t)*np.sin(w*k*t)
             else:
                      y=-np.cos(t)*np.sin(w*k*t)
             return y
    a=[];b=[];c=4;g=[];m=np.arange(0,c,1);q=np.arange(0,2*np.pi,0.01)# подготовка списков для численного анализа
    a=[round(2*quad(func_1, 0, T, args=(k,w))[0]/T,3) for k in m]# интеграл для a[k], k -номер гармоники 
    b=[round(2*quad(func_2, 0, T, args=(k,w))[0]/T,3) for k in m]# интеграл для b[k], k -номер гармоники
    F1=[a[1]*np.cos(w*1*t)+b[1]*np.sin(w*1*t) for t in q]#функции для гармоник
    F2=[a[2]*np.cos(w*2*t)+b[2]*np.sin(w*2*t) for t in q]
    F3=[a[3]*np.cos(w*3*t)+b[3]*np.sin(w*3*t) for t in q]
    plt.figure()
    plt.title("Классический гармонический анализ функции \n при t<pi  f(t)=cos(t)  при t>=pi  f(t)=-cos(t)")
    plt.plot(q, F1, label='1 гармоника')
    plt.plot(q, F2 , label='2 гармоника')
    plt.plot(q, F3, label='3 гармоника')
    plt.xlabel("Время t")
    plt.ylabel("Амплитуда А")
    plt.legend(loc='best')
    plt.grid(True)
    F=np.array(a[0]/2)+np.array([0*t for t in q-1])# подготовка массива для анализа с a[0]/2
    for k in np.arange(1,c,1):
             F=F+np.array([a[k]*np.cos(w*k*t)+b[k]*np.sin(w*k*t) for t in q])# вычисление членов ряда Фурье
    plt.figure()
    P=[func(t) for t in q]
    plt.title("Классический гармонический синтез")
    plt.plot(q, P, label='f(t)')
    plt.plot(q, F, label='F(t)')
    plt.xlabel("Время t")
    plt.ylabel("f(t),F(t)")
    plt.legend(loc='best')
    plt.grid(True)
    plt.show()
    

    Читать дальше →
    • +6
    • 5,5k
    • 1
  • Библия движений Doom. Часть 1

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



    Метрика


    Начнем с основ. Код движка для движений игрока в Doom имеет следующий вид:
    • Сбор исходных данных игрока
    • Применение векторов движущей силы к игроку на основе исходных данных
    • Сжатие скорости игрока, если она слишком велика
    • Проверка, расчеты и перемещения
    • Использование ускорения через трение для следующего движения игрока

    Рассмотрим все поподробней.
    Благодаря только этому и паре переменных мы сможем определить возможные максимальные скорости персонажа игрока.

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

    Читать дальше →
    • +67
    • 32,5k
    • 9
  • Внутреннее устройство и оптимизация бандла webpack

      Webpack фактически стал стандартом для сборки крупных приложений на JS. Его используют практически все. Для разработчика webpack выглядит как магический черный ящик: если забросить в него файлы и небольшой конфиг, на выходе автоматически появится бандл.

      Чтобы разобраться в секретах этой магии, мы обратились к эксперту, человеку, который неоднократно залезал внутрь webpack, — Алексею Иванову. Он готов объяснить, как выглядит бандл изнутри, как на него влияют разные настройки, к чему и почему могут привести некоторые из них, а также рассказать, как все это отладить и оптимизировать.


      В основе материала — доклад Алексея Иванова на конференции HolyJS 2017, проходившей в Санкт-Петербурге 2-3 июня.
      Читать дальше →
    • Космическая съёмка Земли


        Cпутниковый снимок в ложных цветах (зелёный, красный, ближний инфракрасный) с пространственным разрешением 3 метра и наложенной маской зданий из OpenStreetMap (спутниковая группировка PlanetScope)

        Привет, Хабр! Мы постоянно расширяем источники данных, которые используем для аналитики, поэтому решили добавить ещё и спутниковые снимки. У нас аналитика по спутниковым снимкам полезна в продуктах для предпринимательства и инвестиций. В первом случае статистика по геоданным поможет понять, в каком месте стоит открывать торговые точки, во втором позволяет анализировать деятельность компаний. Например, для строительных компаний можно посчитать, сколько за месяц было построено этажей, для сельскохозяйственных компаний — сколько гектаров урожая взошло и т.д.

        В этой статье я постараюсь дать примерное представление о космической съёмке Земли, расскажу о трудностях, с которыми можно столкнуться, начиная работу со спутниковыми снимками: предварительная обработка, алгоритмы для анализа и библиотеки Python для работы со спутниковыми снимками и геоданными. Так что все, кому интересна область компьютерного зрения, добро пожаловать под кат!
        Читать дальше →
      • Шум Перлина

        • Перевод
        • Tutorial

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


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


        Вот пост, который я хотел бы прочитать в первую очередь.
      • Введение в архитектуры нейронных сетей



          Григорий Сапунов (Intento)


          Меня зовут Григорий Сапунов, я СТО компании Intento. Занимаюсь я нейросетями довольно давно и machine learning’ом, в частности, занимался построением нейросетевых распознавателей дорожных знаков и номеров. Участвую в проекте по нейросетевой стилизации изображений, помогаю многим компаниям.

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

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

          Дальше я расскажу про важные тренды, что происходит в этой области. Затем мы углубимся в архитектуру нейросетей, рассмотрим 3 основных их класса. Это будет самая содержательная часть.

          После этого рассмотрим 2 сравнительно продвинутых темы и закончим небольшим обзором фреймворков и библиотек для работы с нейросетями.
          Читать дальше →
          • +48
          • 38,5k
          • 2
        • Как научить свою нейросеть анализировать морфологию

          Недавно мы рассказывали про генератор стихов. Одной из особенностей языковой модели, лежащей в его основе, было использование морфологической разметки для получения лучшей согласованности между словами. Однако же у использованной морфоразметки был один фатальный недостаток: она была получена с помощью “закрытой” модели, недоступной для общего использования. Если точнее, выборка, на которой мы обучались, была размечена моделью, созданной для Диалога-2017 и основанной на закрытых технологиях и словарях ABBYY.


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


          Вместо морфологического движка ABBYY я использовал широко известный pymorphy2. Что в итоге получилось? Спойлер — получилось неплохо.

          Читать дальше →
        • Learnopengl. Урок 2.5 — Источники света

          OGL3

          Источники света


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

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

          Читать дальше →
        • Создание языка программирования с использованием LLVM. Часть 10: Заключение и другие вкусности LLVM

          • Перевод
          • Tutorial
          Оглавление:
          Часть 1: Введение и лексический анализ
          Часть 2: Реализация парсера и AST
          Часть 3: Генерация кода LLVM IR
          Часть 4: Добавление JIT и поддержки оптимизатора
          Часть 5: Расширение языка: Поток управления
          Часть 6: Расширение языка: Операторы, определяемые пользователем
          Часть 7: Расширение языка: Изменяемые переменные
          Часть 8: Компиляция в объектный код
          Часть 9: Добавляем отладочную информацию
          Часть 10: Заключение и другие вкусности LLVM



          9.1. Заключение


          Добро пожаловать в заключительную часть руководства “Создание языка программирования с использованием LLVM”. На протяжении этого руководства, мы вырастили наш маленький язык Калейдоскоп с бесполезной игрушки до довольно интересной (хотя, возможно, по-прежнему бесполезной) игрушки.
          Читать дальше →