psilogic: (Default)
[personal profile] psilogic
У меня вопрос к знатокам математики... уже - дискретной математики, еще уже - тем, кто разбирается в звуковом синтезе. Если у вас есть такие знакомые, которые, быть может, знают ответ, киньте в меня линком на них или в них - линком на меня.

Итак.

Дана некоторая волна (на практике - звуковая, но не суть). Она записана в дискретном виде - как длинный-предлинный набор отсчетов амплитуды через равные промежутки времени. Над некоторым куском этой волны волны мы можем выполнить БПФ (быстрое дискретное преобразование Фурье). Получим спектр, опять же, дискретный.

Задача первая. Взять небольшой кусочек волны длительностью dt (скажем, полсекунды звучания некой мелодии). Сгенерировать кусочек подлинее DT. Чтобы, значит, та же самая нота длилась подольше. Как это сделать? Если я просто выполню обратное БПФ, то получу тот же самый кусочек, длиной dt, а мне надо больше. Если я попробую тупо скопировать кусочек DT/dt раз, возникнут две бяки:
1. Артефакты на границе между кусочками.
2. Паразитная частота 1/dt, которая может быть слышна как пульсация громкости.
Если просто растянуть сигнал с помощью аппроксимации, то получится другая нота - более низкая в DT/dt раз.

Задача вторая. Взять кусочек dt, что-нибудь сделать с его частотами (скажем, убрать ровно одну). Потом записать его назад. То есть, речь про БПФ-фильтр. Но... что делать с артефактами на границе? Я тут придумываю разные методы сглаживания артефактов... может, кто знает уже известный хороший метод?

Date: 2008-07-16 06:57 pm (UTC)
From: [identity profile] eugenebo.livejournal.com
Если Вам просто нужно проиграть "ту же мелодию, но втрое медленнее", то я лично делал это так:

1. Разбиваем исходную мелодию на очень маленькие кусочки -- типа 1/20 секунды.
2. В каждом делаем БПФ.
3. Результат -- набор гармоник от каждого кусочка. Между кусочками амплитуты этих гармоник меняются.
4. Рассматривая эти амплитуды как функцию времени в масштабе всей мелодии, делаем для каждой амплитуды по времени ещё один БПФ.
5. Получаются, назовём их, гармоники второго порядка.
6. Присваиваем кажой из них втрое меньшую частоту.
7. Проводим обратное БПФ. Получаем набор первых гармоник, но каждая из них теперь меняется втрое медленнее.
8. Обратное БПФ по первым гармоникам даст втрое медленнее звучащую музыку с теми же частотами. Разумеется, кусочки, которые надо будет сшить, теперь будут не по 1/20, а по 3/20 секунды.

Date: 2008-07-17 04:22 am (UTC)
From: [identity profile] sapphire-dragon.livejournal.com
йа мож чего не понял, но в саундфорже для этого три раза мышой тыкнуть нада..

Date: 2008-07-17 06:23 am (UTC)
From: [identity profile] psilogic.livejournal.com
речь идет о том, как это запрограммировать

Date: 2008-07-17 06:26 am (UTC)
From: [identity profile] psilogic.livejournal.com
Со сшивками все равно ведь будут проблемы?
Вообще удвоить/утроить длину можно проще. Берем кусок 1/20 секунды, делаем БПФ, увеличиваем длину массива вдвое, расставляя величины через одну (разбавив нулями), делаем обратную БПФ.

Но сшивки, сшивки... :(

Date: 2008-07-16 07:15 pm (UTC)
From: [identity profile] sanitareugen.livejournal.com
Начну со второго. Надо пользоваться свёрткой с наложением или свёрткой с накоплением. Например, разбивать на отрезки, дополнять их нулями (не менее чем удваивая отрезок), делать БПФ, частотный фильтр, обратный БПФ и собирать взад. При этом "хвост" предыдущего отрезка прибавляется к "голове" следующего (есть и другие схемы - но схожие по идее)
А первое - делал я такое. Скорее эмпирически, чем строго. Дублировал отрезки (в количестве несколько бОльшем, чем надо), затем слегка сдвигал очередные, добиваясь минимальной разности между накладывающимися участками, а потом складывад с весовой функцией в виде трапеции или колокола, чтобы сумма весов=1, и они плавно менялись на границе отрезков. Получалось неплохо. И сжатие удавалось...

Date: 2008-07-17 06:29 am (UTC)
From: [identity profile] psilogic.livejournal.com
[ дополнять их нулями (не менее чем удваивая отрезок) ]

Мне кажется, надо не дополнять, а разбавлять - или я что-то путаю?

[ Дублировал отрезки ]

Что значит дублировал? Удваивал длительность?
From: [identity profile] sanitareugen.livejournal.com
А что до "разбавлять" (вставлять нули между отсчётами) - то это иная задача. Увеличение частотного разрешения.
From: [identity profile] psilogic.livejournal.com
Все! Понял, дошло. Спасибо, надо будет попробовать :) Про разбавлять я имел в виду такое:
1. БПФ для N отсчетов
2. Результат удлиннить вдвое, разбавив нулями через один
3. Обратное БПФ для 2N отсчетов.
По идее (я еще не пробовал) должен получиться тот же звук но вдвое большей длительности.

Date: 2008-07-16 07:17 pm (UTC)
From: [identity profile] bsivko.livejournal.com
В любом случае тебе нужно знать период волны. Если кусочек маленький, менее 2T, то установить период не получится (название теоремы уже не помню).

Далее зная период просто берется кусочек волны равный периоду и повторяется. Если функция периодическая, но с шумами, то берется кусок длины N*T, где чем больше N тем лучше, запускается по оси времени в бесконечность и такую функцию в ряд Фурье. Обычно расчета приближения в 90% энергии волны достаточно для приемлемого результата.

Date: 2008-07-17 06:31 am (UTC)
From: [identity profile] psilogic.livejournal.com
Волна не синусоидальная, а случайная - как в звуковой записи.
From: [identity profile] sanitareugen.livejournal.com
Даже на шипящих, тем более на порождённых колебаниями голосовых связок...

Date: 2008-07-17 07:06 am (UTC)
From: [identity profile] psilogic.livejournal.com
Близка - с огромной натяжкой :) Во-первых, там не одна синусоида, а сумма из многих. Во вторых, каждая синусоида норовит возрастать и затухать. В-третьих - биения по громкости и частоте.

Как-то вот так:



- это график записи голоса, буква "а".

Date: 2008-07-16 07:24 pm (UTC)
From: [identity profile] bsivko.livejournal.com
Не совсем понятно что такое убрать частоту. Т.е. при разложении в ряд Фурье она должна отсутствовать? Если так, то делаем разложение, убиваем частоту и возвращаем обратно. Только фактом является то, что такой фильтр гасит близко-стоящие частоты (но поменьше есс-но), и на практике можно сделать только фильтры низких, высоких частот или полос.

Date: 2008-07-17 06:32 am (UTC)
From: [identity profile] psilogic.livejournal.com
[ убиваем частоту и возвращаем обратно ]

- и возникают щелчки на границах фрагментов

Свёртка-с-наложением.

Date: 2008-07-17 06:46 am (UTC)
From: [identity profile] sanitareugen.livejournal.com
"Читайте УставРабинера и Голда, там всё написано!"

Re: Свёртка-с-наложением.

Date: 2008-07-17 06:59 am (UTC)
From: [identity profile] psilogic.livejournal.com
В каком хоть месте? У меня есть эта книжка, я ее подряд штудировать не рискнул, там слишком много всего...

Date: 2008-07-16 07:28 pm (UTC)
From: [identity profile] daddym.livejournal.com
Ты неправильно представляешь себе процесс цифровой фильтрации. Чтобы не было артефактов БПФ или другое преобразование, делается на каждый сэмпл. То есть ее окно постоянно сдвигается. В итоге ты получаешь спектральный массив на каждый момент дискретизации. Вот в этом случае никаких проблем с вырезанием спектра или наоборот с добавлением тона нет. Другое дело что вычислительная мощность для БПФ требуется немаленькая.
Если интересно пороюсь какие у меня есть книжки, могу прислать. Хотя как правила обычных фильтров для большинства задач хватает. Они у меня точно были, вместе с генератором кода для них.
From: [identity profile] sanitareugen.livejournal.com
...то БПФ (или не БПФ, а просто ПФ, иногда это, как ни странно, оказывается дешевле) делается единожды. Для перехода от АЧХ к импульсной характеристике. И далее всё производится во временнОй области.
А если хотим считать непременно через БПФ - то делается по отрезкам. Но непременно с перекрытием (или наложением) см. выше, а подробнее - у Рабинера и Голда или, скажем, у Гольденберга, Матюшкина и Поляка
http://dsp-book.narod.ru

Date: 2008-07-17 06:39 am (UTC)
From: [identity profile] psilogic.livejournal.com
Ага! С наложением - и на месте наложения cross-fade - так?

Нет.

From: [identity profile] sanitareugen.livejournal.com - Date: 2008-07-17 07:26 am (UTC) - Expand

Re: Нет.

From: [identity profile] psilogic.livejournal.com - Date: 2008-07-17 07:46 am (UTC) - Expand

(no subject)

From: [identity profile] sanitareugen.livejournal.com - Date: 2008-07-17 07:59 am (UTC) - Expand

(no subject)

From: [identity profile] psilogic.livejournal.com - Date: 2008-07-17 08:17 am (UTC) - Expand

(no subject)

From: [identity profile] psilogic.livejournal.com - Date: 2008-07-17 12:59 pm (UTC) - Expand

Стараемся...

From: [identity profile] sanitareugen.livejournal.com - Date: 2008-07-17 01:14 pm (UTC) - Expand

(no subject)

From: [identity profile] psilogic.livejournal.com - Date: 2008-07-17 02:19 pm (UTC) - Expand

А пополнить?

From: [identity profile] sanitareugen.livejournal.com - Date: 2008-07-17 02:36 pm (UTC) - Expand

Re: А пополнить?

From: [identity profile] psilogic.livejournal.com - Date: 2008-07-17 03:22 pm (UTC) - Expand

Приветствуется.

From: [identity profile] sanitareugen.livejournal.com - Date: 2008-07-17 04:50 pm (UTC) - Expand

(no subject)

From: [identity profile] psilogic.livejournal.com - Date: 2008-07-17 08:06 pm (UTC) - Expand

Date: 2008-07-17 06:38 am (UTC)
From: [identity profile] psilogic.livejournal.com
Знаешь ли ты эффективные методы такой плавной сдвижки окна? Чтобы не считать БПФ заново при каждой сдвижке (это до пенсии вычисляться будет).

А если без Фурьёв?

Date: 2008-07-16 09:30 pm (UTC)
From: [identity profile] darth-vasya.livejournal.com
Например, можно натыкать кусочки длиной t через каждые t/2 нужное число раз, между повторами сделать cross-fade (чтобы повторения "въезжали" плавно), всё это пропустить через компрессор (чтобы не было колебаний громкости), а затем придать результату нужную динамику.

А что именно подробнее?

Date: 2008-07-17 06:47 am (UTC)
From: [identity profile] darth-vasya.livejournal.com
Кросс-фейд - это когда громкость одного семпла уменьшается по мере увеличения громкости другого, так что сумма остаётся постоянной. Компрессор - это когда сигнал умножается на выпуклую вверх функцию от его громкости для сжатия динамичекого диапазона.

(no subject)

From: [identity profile] darth-vasya.livejournal.com - Date: 2008-07-17 07:42 am (UTC) - Expand

(no subject)

From: [identity profile] psilogic.livejournal.com - Date: 2008-07-17 07:50 am (UTC) - Expand

А, ну конечно же

From: [identity profile] darth-vasya.livejournal.com - Date: 2008-07-17 08:18 am (UTC) - Expand

Re: А, ну конечно же

From: [identity profile] psilogic.livejournal.com - Date: 2008-07-17 08:51 am (UTC) - Expand

(no subject)

From: [identity profile] darth-vasya.livejournal.com - Date: 2008-07-17 09:17 am (UTC) - Expand

(no subject)

From: [identity profile] psilogic.livejournal.com - Date: 2008-07-17 09:25 am (UTC) - Expand

(no subject)

From: [identity profile] darth-vasya.livejournal.com - Date: 2008-07-17 09:34 am (UTC) - Expand

(no subject)

From: [identity profile] psilogic.livejournal.com - Date: 2008-07-17 12:47 pm (UTC) - Expand

(no subject)

From: [identity profile] darth-vasya.livejournal.com - Date: 2008-07-17 12:50 pm (UTC) - Expand

(no subject)

From: [identity profile] psilogic.livejournal.com - Date: 2008-07-17 12:53 pm (UTC) - Expand

(no subject)

From: [identity profile] darth-vasya.livejournal.com - Date: 2008-07-17 01:00 pm (UTC) - Expand

(no subject)

From: [identity profile] psilogic.livejournal.com - Date: 2008-07-17 01:03 pm (UTC) - Expand

(no subject)

From: [identity profile] darth-vasya.livejournal.com - Date: 2008-07-17 01:07 pm (UTC) - Expand
Page generated Jul. 30th, 2025 07:00 am
Powered by Dreamwidth Studios