В первом приближении надо загрузить wav или mp3 файл с музыкой в Excel, провести над загруженными данными Digital Signal Processing (DSP) или Цифровую Обработку Сигнала (ЦОС) по определенному алгоритму на Visual Basic for Application (VBA), сохранить результат в wav файл и прослушать его.
Алгоритм добавления четной гармоники в данном случае представляет собой возведение в квадрат исходных отсчетов сигнала, смещенных на некоторую постоянную величину, и последующего удаления постоянной составляющей.
Выгрузить данные в текстовый файл csv для использования с Excel из исходных звуковых файлов формата wav и mp3 возможно с помощью программы Audacity. Это многоплатформенный аудиоредактор звуковых файлов, ориентированный на работу с несколькими дорожками. Программа была выпущена и распространяется на условиях GNU General Public License. Работает под управлением операционных систем: Windows, Linux, macOS, FreeBSD.
Генерируем синусоидальный сигнал в Audacity (можно сгенерировать в Excel, но мы проверяем работоспособность всей предложенной цепочки действий).
Экспортируем и загружаем в Excel и обрабатываем F(x) = (sin(x)+1)*(sin(x)+1) для получения чётной ("ламповой"?) гармоники.
Проверяем, появилась ли вторая гармоника после обработки.
Проделаем операции по загрузке, обработке и выгрузке с реальным музыкальным сигналом (гитара).
Загружаем исходный музыкальный сигнал в Excel и обрабатываем для обогащения гармониками.
Экспортируем из Excel в csv, импортируем в Audacity, прослушиваем и сравниваем.
Визуально разница в "осцилограммах" хорошо заметна, а вот на слух отличия не так очевидны. Мне, на мой слух, кажется, что обработанный звук немного ярче и удары по струнам немного более отчетливы. Конечно, хотелось бы более яркого и впечатляющего эффекта. Возможно надо использовать более высокие степени или дробные степени вместо возведения в квадрат или экспоненту при обработке или попробовать несимметрично смещенный arctg(x), или попробовать многоканальную систему наподобие Aphex Aural Exciter. Жду предложений в комментариях. >>Подписывайтесь на мой Хабр-профиль.
P.S. Модернизировал алгоритм по результатам обсуждений в комментариях, применил разделение на две частотные полосы, как сделано в Aphex Aural Exciter. Новый звук имеет гораздо более отчетливый эффект увеличения яркости. https://disk.yandex.ru/d/y18kiOIMN7CLCA
Комментарии (30)
AndroidKotlin
07.07.2023 06:35+2разницу слышу, воспринимаю ее как легкое увеличение средних частот и более зернистый бой по струнам. По лампам, да, увеличение и некоторая компрессия на СЧ напоминает, а вот увеличение зернистости - нет, в ламповых усилках наоборот зернистость уменьшается, а компрессия т.е. яркость по СЧ да - похоже. Но надо более заметно как-то сделать.
Trancevocal
07.07.2023 06:35разница в звуке есть, некоторый подъем средних частот. Но это малозаметное явление, в реальных ламповых усилителях эффект реально ощущается намного сильнее
PythonProgramer
07.07.2023 06:35+1Конечно Python подойдет для таких целей лучше, но и Excel - интересное нестандартное применение. Предлагаю попробовать логарифм о смещением и фильтр низких частот после.
Oksenija Автор
07.07.2023 06:35Согласен, и Python уже установил - он тоже поставился без адмиских прав, но вот за библиотеками в инет - это оказалось политиками безопасности корпоративной сети запрещено, пока пробую уговорить дать таковые. Но Excel все же довольно удобен, в частности сохранение сэмплов в виде столбца таблицы позволяет легко редактировать куски данных, конечно это есть и в Аудасити, но на мой вкус в Excel удобней. И еще автоматический пересчет и модификация графиков по всей (или части) цепочке если в ней несколько обработчиков - удобно. В Аудасити нет сохранения промежуточных результатов из коробки - надо в проекте плодить типа "дорожки", которые не дороки, а результаты работы предыдущих обработчиков.
sci_nov
07.07.2023 06:35+1А почему Вы прибавили единицу к синусам перед возведением в квадрат?
Oksenija Автор
07.07.2023 06:35это имитация так называемого сеточного смещения на лампе. 1 не обязательно, в данном случае была выбрана 1 чтобы сигнал в сумме с 1 не становился отрицательным, для избежания "заворачивания" его вверх - после возведения в квадрат - такого эффекта в ламповых усилителях нет и он неприятно воспринимается на слух как жужжание. После возведения в квадрат вычисляется среднее или постоянная составляющая на радиолюбительском жаргоне и вычитается из сигнала. Потому на спектре нет пика в 0 Гц. В ламповых усилителях также постоянная составляющая не проходит через трасформатор на динамики.
sci_nov
07.07.2023 06:35получается, чтобы сохранить исходную гармонику.
Oksenija Автор
07.07.2023 06:35+3да, в некотором смысле чтобы сохранить, в смысле не допускать грубых сильных искажений, которые скорее всего будут неприятны на слух, и кроме того в реальных лампах характеристика снизу носит характер мягкого ограничения, а не квадратичности, но это я пока не моделировал, просто смести сигнал в рабочую зону где искажения относительно малы, также поступают и в ламповых усилителях с помощью сеточного смещения.
sci_nov
07.07.2023 06:35Тогда, возможно, было бы правдоподобнее использовать уравнение i = k1 * u + k2 * u*u, где k2 << k1, u = A*sin(...) + A.
Oksenija Автор
07.07.2023 06:35ну да близко... (sin(x)+1)**2=sin(x)**2 + 2*sin(x) +1 = (1-cos(2*x))/2 + 2*sin(x)+1 =
0.5-0.5*cos(2*x)+2*sin(x)+1
Но надо учесть, что реальный сигнал содержит уже изначально целый ряд гармоник (синусов) в том числе некратных частот разной амплитуды и вывод аналитического выражения от возведения в квадрат довольно громоздкий
sci_nov
07.07.2023 06:35Тогда вопрос зачем всё это делается :)
Oksenija Автор
07.07.2023 06:35+1логика такая, есть лампы, ои дают классный звук, попробуем в первом приближении смоделировать лампу, известно - лампы генерят нелинейные искаджения, небольшие, в основном считается что четные гармоники, ВАХ лампы в некоторых пределах хорошо аппрокимируется x**2 - попробуем это сделать и послушаем что получилось. А ка вы предлагаете?
Ваша формула на реальных сигнала будет
i = k1 * u + k2 * u*u, -> k1*(n1*sin(b1*x) + a1 + k3*sin(b2*x)+a2 +..) + k2*((n1*sin(b1*x) + a1 + k3*sin(b2*x)+a2 +..)*((n1*sin(b1*x) + a1 + k3*sin(b2*x)+a2 +..)
моя же формула (A1 + A2)**2 = A1**2 + 2*A1*A2 + A2**2 где A2 - реальный сигнал как сумма синусов с разной частотой и амплитудой. Если константа А1 много больше A2 то А2**2 можно пренебречь и останется
конст + сам сигнал * конст
константу можн вычесть и получим сам сигнал без искажений.
В целом обе формулы эквивалентны - при малом сигнале он пройдет без искажений через нелинейность.
sci_nov
07.07.2023 06:35Как сделано у Вас - это определяет фиксированный и довольно большой уровень второй гармоники. Лампы, вероятно, дают меньший уровень, иначе применение таких усилителей (УМЗЧ) было бы весьма специфическим.
Я сомневаюсь, что ВАХ - редуцированная парабола y = K * (x - x0)^2. Есть общая форма записи: y = k0 + k1 * x + k2 * x*x, а коэффициенты по идее надо искать в справочниках по лампам.
Реалистичное моделирование в цифре - довольно-таки сложная вещь и одним квадратом здесь не обойдешься, т.к. есть динамические эффекты: при подаче входного сигнала ВАХ начинает как бы дрожать в некоторых пределах.
Oksenija Автор
07.07.2023 06:35на счет дрожание - вы имеете ввиду емкость и индуктивность (реактивности) электродов в лампе или что-то другое? В чистой без реактивностей ВАХ ничего дрожать в принципе не может. Любой сигнал на достаточно маленьком временном интервале является константой. Итого логически делаем вывод что дрожание ВАХ должно наблюдаться на КОНСТАНТОМ входном напряжении. Вроде такого нет. Разве что тепловые шумы.
viphabr
07.07.2023 06:35+1Вы правы, но не совсем, в магнитных материалах есть, например, гистерезис, т.е. в выходных трансформаторах ламповых усилителей. Эта нелинейность без реактивностей, т.е. не сводится к инерционности индуктивности, тем не менее ее форма зависит от предыдущего значения напряжения!
sci_nov
07.07.2023 06:35+3имею ввиду обратные электроны. там на самом деле всё сложнее, когда лампа раскачана, то есть когда громкость довольно-таки большая. На константном - нет, и эта ВАХ - статическая.
По-поводу функции... да, похоже что квадрат без линейной части. Тогда перед синусом надо поставить множитель, т.е.:
и при малом k это будет малосигнальное приближение.
Oksenija Автор
07.07.2023 06:35+1обмозговав ваше предложение все же думаю надо его проверить - в текущей версии на слух искажения маленькие - можно не бояться и сделать более грубо - исходный сигнал плюс небольшая доля но более сильных искажений просто сигнал в квадрате без сеточного смещения!
sci_nov
07.07.2023 06:35+1Вероятно, что есть публикации/форумы на эту тему.
С другой стороны, если есть генератор сигналов, ламповый усилитель и анализатор спектра, то можно подавать на вход разные модельные сигналы и пытаться понять как формируется выходной спектр. Потом составить мат. модель. Но это довольно таки творческая и не быстрая задача и, вероятно, подобное тоже где-нибудь опубликовано.
Лампа лампой, но в усилителе может быть несколько ламп плюс схема соединения, и итоговый эффект будет несколько иной.
Oksenija Автор
07.07.2023 06:35+1развитие в этой области пошло немного в другую сторону, все ушли в гитарные усилители с экстремально высокими искажениями, и от попыток разобраться в сути явлений, перешли к моделированию на нейронках со +100500 параметрами, модели очень реалистичны и в слепых тестах угадать экспертны не могут, но в нейронках как обычно непонятно как именно они это делают, не просто как устроена нейронка, а почему коэффициенты такие, а не другие - ответ, что так обучились - меня лично не устраивает, так как теряется инфа о физической сути смоделированной системы за +100500 безымянных коэф. нейронки.
Oksenija Автор
07.07.2023 06:35+2изменил алгоритм, две частотные полосы, более сильные чётные гармоники, теперь увеличение яркости отчетливо слышно. https://disk.yandex.ru/d/y18kiOIMN7CLCA
BorisZommer
07.07.2023 06:35+1По моим ощущениям, в последнем примере звука стало похоже в части увеличения яркости на средних на ламповый усилитель, но вот в части самых высоких частот не совсем то, нужно больше мягкости, пока немного песочит.
voldemar_d
А можно узнать, почему такая цепочка была выбрана? Почему не написать программу, которая и на входе берет WAV или mp3, обрабатывает и выдает тоже WAV или mp3? Заодно можно сделать кнопку "Play" и прямо на ходу слушать результат обработки. А еще можно сделать кнопку "Bypass", чтобы можно было прямо во время воспроизведения включать/выключать обработку, разницу можно будет сразу оценить.
Зачем здесь многоканальность? И как Вы собираетесь попробовать эту систему в предложенной цепочке действий?
Oksenija Автор
написать можно и их много уже написано, но я не нашел именно с возведением в квадрат. Кроме того декодинг мп3 да и wav не такая простая задача, надо готовые либы использовать, и так как использовался корпоративный комп под лимитированным юзером (в ночные смены сисадмином когда все тихо) возникли бы проблемы с лицензиями и безопасностью). А може и не возникли - но надо разбираться.
Плюсы - Эксель уже был установлен, легальный. Аудасити - легальный, фрии, опен сорс, админских прав при установке не требует.
Эксель - не требует компиляции, не нужна Visual Studio, скорость обработки сравнительно хорошая, не С++ конечно, но норм. Работает норм под лимитированным юзером на корп. ПК.
Лекго модифицировать различные алгоритмы без перекомпиляции, есть операции с комплексными числами, много нелеинейных и линейных ф-й из коробки, легко визуализировать графики, много типов, разнобразные. В целом удобная среда быстрой проверки математических идей.
---
В Аурал Эксайтер - звук делится на НЧ, СЧ, ВЧ - по всем трем каналам применяются разные нелинейные обработки, и фильтры разные. Все это можно реализовать в Эксель - ФНЧ, ФСЧ, ФВЧ, разные виды нелинейностей, пост фильтрацию. В целом это экспериментальная методология и цепочка для быстрой проверки множества и возможно сложных математических алгоритмов возможно с визуализацией промежуточных результатов
voldemar_d
Тогда это не многоканальность, а многополосность. В целом идея понятна, просто никогда раньше не видел, чтобы на VBA делали DSP. Можно, конечно. Просто я больше 20 лет назад на c++ всякие фильтры для звука писал, и приходилось стараться, чтобы на каком-нибудь Pentium 100 это в реальном времени успевало звук обрабатывать.
Oksenija Автор
БПФ скажем 256 точек тянуло?
voldemar_d
И куда больше тянуло. FIR equalizer на 10000 точек в стерео, например.