Как я разгадала формулу жевательной резинки

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

Сейчас мы не способны, жуя жвачку, решать уравнения.

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

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

Идея сформировалась мгновенно. Процесс жевания порождает звуковые колебания, которые можно оцифровать и представить в виде последовательности чисел. А если у нас есть массив данных, значит, мы можем аппроксимировать его математической функцией. Так я запустила небольшой проект на Python, чтобы превратить обычный звук жевания в формулу.

Сразу уточню: это не научное открытие или претензия на закон природы. Мне было любопытно пройти полный путь от случайной мысли до работающего программного кода и реальной математической модели.

Суть математизации звука

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

В упрощенном виде структура выглядит так:

время: 0.0000 0.0001 0.0002 0.0003 ...

амплитуда: 0.012 -0.008 0.031 0.027 ...

Мы имеем массив координат (ti, yi), где ti — временная метка, а yi — амплитуда. Соединив эти точки, мы получим графическое отображение волны. Но мне хотелось чего-то более изящного — компактного уравнения.

Идеальным инструментом для этого стало преобразование Фурье. Суть его метода элегантна: любую сложную звуковую волну можно разложить на сумму простых синусоид с различными характеристиками.

Общая формула выглядит следующим образом:

Как я разгадала формулу жевательной резинки

Здесь:

  • x(t) — значение амплитуды в заданный момент времени;

  • \mu — среднее значение сигнала;

  • Ak — амплитуда конкретной гармоники;

  • fk — частота;

  • \varphi_k— начальная фаза;

  • N — общее количество учтенных гармоник.

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

Исходные данные

Для эксперимента я взяла короткий MP3-файл:

  • длительность около 6 секунд;

  • монофонический канал;

  • частота дискретизации 44 100 Гц.

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

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

Шаг 1. Декодирование

Используя библиотеку ffmpeg, я конвертировала аудио в массив 32-битных чисел с плавающей точкой, после чего нормализовала значения, приведя их в диапазон от -1 до 1. Теперь данные стали понятны для NumPy.

Шаг 2. Разложение на частоты

Для анализа я применила Быстрое преобразование Фурье (FFT):

centered = samples - np.mean(samples) 
spectrum = np.fft.rfft(centered) 
frequencies = np.fft.rfftfreq(centered.size, d=1.0 / sample_rate) 
amplitudes = (2.0 / centered.size) * np.abs(spectrum) 
phases = np.angle(spectrum)

Результатом стали пары «частота-амплитуда-фаза», которые и легли в основу уравнения.

Шаг 3. Фильтрация

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

Итог: уравнение жевания

Финальная компактная модель выглядит так:

x(t) \approx \mu + \sum_{k=1}^{32} A_k\cos(2\pi f_k t+\varphi_k), \qquad 0 \leq t \leq 6{,}0605

Для наглядности привожу сокращенную версию из 8 ключевых гармоник:

 \begin{aligned} x_8(t) \approx 10^{-3}\big(&0{,}038 \\ &+1{,}917\cos(2\pi\cdot885{,}57t+0{,}156)\\ &+1{,}559\cos(2\pi\cdot56{,}76t+2{,}718)\\ &+1{,}537\cos(2\pi\cdot912{,}47t-0{,}461)\\ &+1{,}504\cos(2\pi\cdot859{,}34t-0{,}567)\\ &+1{,}133\cos(2\pi\cdot827{,}82t+1{,}413)\\ &+1{,}007\cos(2\pi\cdot30{,}69t-1{,}690)\\ &+0{,}990\cos(2\pi\cdot797{,}95t-2{,}434)\\ &+0{,}696\cos(2\pi\cdot937{,}55t-2{,}979)\big) \end{aligned}

Конечно, эта формула специфична: она описывает только конкретную запись. Любое изменение условий — и параметры уравнения изменятся.

Можно ли это услышать?

Да, я синтезировала аудио обратно из формулы. Результат предсказуем: мы слышим основные частотные составляющие, но теряем «живую» детализацию — шорохи и резкие импульсы. Жевание — это не чистая синусоида, а хаотичный акустический процесс.

Что в итоге

Конечно, я не получила «универсальную формулу жевания», но нашла изящное математическое представление конкретного звукового фрагмента. Самое интересное в этом опыте — сама трансформация: от случайного комментария в ролике до реализации на Python.

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

 

Источник

Читайте также