Вдруг кто-то знает
Jul. 16th, 2008 10:15 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
У меня вопрос к знатокам математики... уже - дискретной математики, еще уже - тем, кто разбирается в звуковом синтезе. Если у вас есть такие знакомые, которые, быть может, знают ответ, киньте в меня линком на них или в них - линком на меня.
Итак.
Дана некоторая волна (на практике - звуковая, но не суть). Она записана в дискретном виде - как длинный-предлинный набор отсчетов амплитуды через равные промежутки времени. Над некоторым куском этой волны волны мы можем выполнить БПФ (быстрое дискретное преобразование Фурье). Получим спектр, опять же, дискретный.
Задача первая. Взять небольшой кусочек волны длительностью dt (скажем, полсекунды звучания некой мелодии). Сгенерировать кусочек подлинее DT. Чтобы, значит, та же самая нота длилась подольше. Как это сделать? Если я просто выполню обратное БПФ, то получу тот же самый кусочек, длиной dt, а мне надо больше. Если я попробую тупо скопировать кусочек DT/dt раз, возникнут две бяки:
1. Артефакты на границе между кусочками.
2. Паразитная частота 1/dt, которая может быть слышна как пульсация громкости.
Если просто растянуть сигнал с помощью аппроксимации, то получится другая нота - более низкая в DT/dt раз.
Задача вторая. Взять кусочек dt, что-нибудь сделать с его частотами (скажем, убрать ровно одну). Потом записать его назад. То есть, речь про БПФ-фильтр. Но... что делать с артефактами на границе? Я тут придумываю разные методы сглаживания артефактов... может, кто знает уже известный хороший метод?
Итак.
Дана некоторая волна (на практике - звуковая, но не суть). Она записана в дискретном виде - как длинный-предлинный набор отсчетов амплитуды через равные промежутки времени. Над некоторым куском этой волны волны мы можем выполнить БПФ (быстрое дискретное преобразование Фурье). Получим спектр, опять же, дискретный.
Задача первая. Взять небольшой кусочек волны длительностью dt (скажем, полсекунды звучания некой мелодии). Сгенерировать кусочек подлинее DT. Чтобы, значит, та же самая нота длилась подольше. Как это сделать? Если я просто выполню обратное БПФ, то получу тот же самый кусочек, длиной dt, а мне надо больше. Если я попробую тупо скопировать кусочек DT/dt раз, возникнут две бяки:
1. Артефакты на границе между кусочками.
2. Паразитная частота 1/dt, которая может быть слышна как пульсация громкости.
Если просто растянуть сигнал с помощью аппроксимации, то получится другая нота - более низкая в DT/dt раз.
Задача вторая. Взять кусочек dt, что-нибудь сделать с его частотами (скажем, убрать ровно одну). Потом записать его назад. То есть, речь про БПФ-фильтр. Но... что делать с артефактами на границе? Я тут придумываю разные методы сглаживания артефактов... может, кто знает уже известный хороший метод?
no subject
Date: 2008-07-16 06:57 pm (UTC)1. Разбиваем исходную мелодию на очень маленькие кусочки -- типа 1/20 секунды.
2. В каждом делаем БПФ.
3. Результат -- набор гармоник от каждого кусочка. Между кусочками амплитуты этих гармоник меняются.
4. Рассматривая эти амплитуды как функцию времени в масштабе всей мелодии, делаем для каждой амплитуды по времени ещё один БПФ.
5. Получаются, назовём их, гармоники второго порядка.
6. Присваиваем кажой из них втрое меньшую частоту.
7. Проводим обратное БПФ. Получаем набор первых гармоник, но каждая из них теперь меняется втрое медленнее.
8. Обратное БПФ по первым гармоникам даст втрое медленнее звучащую музыку с теми же частотами. Разумеется, кусочки, которые надо будет сшить, теперь будут не по 1/20, а по 3/20 секунды.
no subject
Date: 2008-07-17 04:22 am (UTC)no subject
Date: 2008-07-17 06:23 am (UTC)no subject
Date: 2008-07-17 06:26 am (UTC)Вообще удвоить/утроить длину можно проще. Берем кусок 1/20 секунды, делаем БПФ, увеличиваем длину массива вдвое, расставляя величины через одну (разбавив нулями), делаем обратную БПФ.
Но сшивки, сшивки... :(
no subject
Date: 2008-07-16 07:15 pm (UTC)А первое - делал я такое. Скорее эмпирически, чем строго. Дублировал отрезки (в количестве несколько бОльшем, чем надо), затем слегка сдвигал очередные, добиваясь минимальной разности между накладывающимися участками, а потом складывад с весовой функцией в виде трапеции или колокола, чтобы сумма весов=1, и они плавно менялись на границе отрезков. Получалось неплохо. И сжатие удавалось...
no subject
Date: 2008-07-17 06:29 am (UTC)Мне кажется, надо не дополнять, а разбавлять - или я что-то путаю?
[ Дублировал отрезки ]
Что значит дублировал? Удваивал длительность?
Один отрезок повторял нужное число раз.
Date: 2008-07-17 06:48 am (UTC)Re: Один отрезок повторял нужное число раз.
Date: 2008-07-17 07:10 am (UTC)1. БПФ для N отсчетов
2. Результат удлиннить вдвое, разбавив нулями через один
3. Обратное БПФ для 2N отсчетов.
По идее (я еще не пробовал) должен получиться тот же звук но вдвое большей длительности.
no subject
Date: 2008-07-16 07:17 pm (UTC)Далее зная период просто берется кусочек волны равный периоду и повторяется. Если функция периодическая, но с шумами, то берется кусок длины N*T, где чем больше N тем лучше, запускается по оси времени в бесконечность и такую функцию в ряд Фурье. Обычно расчета приближения в 90% энергии волны достаточно для приемлемого результата.
no subject
Date: 2008-07-17 06:31 am (UTC)Звуковая достаточно близка к синусоидальной.
Date: 2008-07-17 06:47 am (UTC)no subject
Date: 2008-07-17 07:06 am (UTC)Как-то вот так:
- это график записи голоса, буква "а".
Тем не менее - квазипериодика.
From:Re: Тем не менее - квазипериодика.
From:Гильберт вообще интересен...
From:no subject
Date: 2008-07-16 07:24 pm (UTC)no subject
Date: 2008-07-17 06:32 am (UTC)- и возникают щелчки на границах фрагментов
Свёртка-с-наложением.
Date: 2008-07-17 06:46 am (UTC)УставРабинера и Голда, там всё написано!"Re: Свёртка-с-наложением.
Date: 2008-07-17 06:59 am (UTC)Жаль, не получается совет-каламбур, типа даваемого...
From:(no subject)
From:no subject
Date: 2008-07-16 07:28 pm (UTC)Если интересно пороюсь какие у меня есть книжки, могу прислать. Хотя как правила обычных фильтров для большинства задач хватает. Они у меня точно были, вместе с генератором кода для них.
Это какое-то извращение... Если "на каждый сэмпл"...
Date: 2008-07-17 05:50 am (UTC)А если хотим считать непременно через БПФ - то делается по отрезкам. Но непременно с перекрытием (или наложением) см. выше, а подробнее - у Рабинера и Голда или, скажем, у Гольденберга, Матюшкина и Поляка
http://dsp-book.narod.ru
no subject
Date: 2008-07-17 06:39 am (UTC)Не совсем понял, что есть cross-fade.
From:Re: Не совсем понял, что есть cross-fade.
From:Нет.
From:Re: Нет.
From:(no subject)
From:(no subject)
From:Из Гольденберга, Матюшкина, Поляка...
From:Re: Из Гольденберга, Матюшкина, Поляка...
From:Она у меня есть. На
From:(no subject)
From:Стараемся...
From:(no subject)
From:А пополнить?
From:Re: А пополнить?
From:Приветствуется.
From:(no subject)
From:Ну так это частный случай:)
Date: 2008-07-17 08:10 am (UTC)Нет. В данном случае искажения будут, если не...
From:no subject
Date: 2008-07-17 06:38 am (UTC)Обещанный генератор фильтров
Date: 2008-07-17 08:07 am (UTC)Я с ним работал - все ок.
(no subject)
From:Да, конечно, за O(N) операций...
From:Re: Да, конечно, за O(N) операций...
From:А ещё можно экспоненциальное сглаживание...
From:А если без Фурьёв?
Date: 2008-07-16 09:30 pm (UTC)Re: А если без Фурьёв?
Date: 2008-07-17 06:40 am (UTC)А что именно подробнее?
Date: 2008-07-17 06:47 am (UTC)Re: А что именно подробнее?
From:(no subject)
From:(no subject)
From:А, ну конечно же
From:Re: А, ну конечно же
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From: